As quatro camadas
1. Camada de Integração com Adquirência
É aqui que a plataforma conversa com os parceiros de processamento externos. Cada parceiro possui seu próprio cliente.Parceiro de processamento principal
Cliente HTTP com autenticação segura baseada em chaves e certificado mútuo. Suporta diferentes modos de operação:
- Requisição padrão de marketplace.
- Requisição sem o prefixo de marketplace.
- Requisição usando a base mais recente da API.
Parceiro de processamento alternativo
Cliente HTTP com autenticação baseada em certificado (mTLS). Faz uma única chamada para obter um token de acesso via
client_credentials e, em seguida, envia-o como Authorization: Bearer ... nas rotas autenticadas.2. Camada de Processamento de Transações (sales)
O módulo sales mantém a verdade específica do adquirente. Os registros aqui espelham o que existe no parceiro de processamento, usando um identificador externo como chave única. Os modelos incluem Transaction, Receivable, Document, SplitRule, PaymentMethod, OnlineSellPayment, além de modelos de ponto de venda e de transferência.
Cada modelo expõe um método de atualização que cria ou atualiza sua contraparte na camada unificada. O módulo sales também hospeda o despachante de webhooks da adquirência.
As vendas de um dos parceiros atualmente fluem por meio de visões e serializadores dedicados em seu próprio módulo em vez do módulo
sales, mas o mesmo padrão de propagação Sales-para-Unificado se aplica.3. Camada de Dados Unificada (unified)
A camada unificada é agnóstica em relação ao adquirente. Todo endpoint de leitura acessado pelo painel ou pelo lojista passa por aqui. Modelos principais:
unified.Account— toda conta de lojista, sub-lojista ou parceiro de canal.unified.Transaction,unified.Receivable,unified.AccountDeposit,unified.Document,unified.PointOfSale,unified.TokenizedCard.unified.Split— configuração de comissões por conta.unified.metrics.*— tabelas pré-agregadas (vendas por data, recebíveis esperados por conta/data/produto etc.).
4. Camada de Lógica de Negócio
Os módulos de domínio ficam acima da camada unificada. Eles não chamam o parceiro de processamento diretamente — criam recursos unificados (ou recursos desales que se propagam para a camada unificada) e deixam as camadas inferiores fazerem o trabalho.
seller— Dados de KYC, endereços, sócios, dados bancários. Envia o cadastro para a infraestrutura de processamento.plans— Planos de pagamento (configurações de parcelamento) e planos de split (modelos de comissão referenciados porunified.Split).event— Bilheteria de eventos. Cada pagamento de checkout de evento é vinculado a umaunified.Transaction; as tabelas de métricas do evento são atualizadas atomicamente quando o status do checkout muda.subscriptions— Cobrança recorrente. O pagamento da assinatura aponta para umaunified.Transaction; a atualização de status é acionada a partir do fluxo de webhooks da camada de transações.uniconta— Contas virtuais que se conciliam contra depósitos e recebíveis.seller_integrations— Chaves de API e webhooks de saída. Após uma atualização de transação, lojistas inscritos no eventotransaction.update.statusrecebem uma chamadaPOST.
Ciclo de vida de uma requisição típica
Um caminho comum: um usuário do painel lista as transações de um lojista. Pontos-chave:- A autenticação é tratada por um autenticador unificado que entende tanto JWTs quanto chaves de API de lojista. Quem casar com o token primeiro vence.
- O controle de acesso para URLs com escopo de lojista é verificado contra o registro de acessos (usuário → conta → permissões). Superusuários têm passe livre.
- A maior parte dos endpoints de leitura vive na camada unificada e está aninhada sob
sellers/{sellers_pk}/. - A paginação segue um padrão único da plataforma; veja Convenções.
O sistema de jobs
O módulo de jobs é uma fila persistida no banco de dados na qual outros módulos registram manipuladores. É o caminho pelo qual a plataforma executa qualquer coisa que converse com um adquirente ou que precise ocorrer de forma assíncrona.Registro de jobs
Cada módulo que possui jobs os declara na sua etapa de inicialização:Enfileiramento de jobs
Jobs são enfileirados por meio de uma rotina de enfileiramento que aceita o nome do job, um identificador de recurso e parâmetros adicionais (ou pelos auxiliares específicos de cada módulo). A rotina de enfileiramento deduplica pela combinação(identificador do recurso, tipo do job): se já existe um job em estado WAITING (ou WAITING_PRECONDITION) para o mesmo par, ela retorna o existente em vez de criar uma duplicata.
Um parâmetro de execução imediata faz o job rodar inline na mesma requisição (usado pelo despachante de webhooks para caminhos rápidos). Caso contrário, o job permanece WAITING até que o executor o pegue.
Execução de jobs
- Conta jobs
WAITINGmais jobsWAITING_PRECONDITIONcuja janela de próxima verificação já passou. - Dentro de uma transação, reivindica até
batch_sizelinhas usandoSELECT ... FOR UPDATE SKIP LOCKED, de modo que múltiplos executores em múltiplos contêineres possam rodar com segurança em paralelo. - Para cada job reivindicado, executa-o:
- Se o tipo de job tem uma precondição, ela é rodada primeiro. Precondições falhas são reagendadas com backoff de 3, 5, 10, 15 e 30 minutos. Após cinco verificações falhas, o job é marcado como
ERROR. - Caso contrário (ou depois que a precondição passa), o manipulador é executado. O resultado é registrado como
SUCCESSouERROR; exceções são reportadas para a telemetria centralizada.
- Se o tipo de job tem uma precondição, ela é rodada primeiro. Precondições falhas são reagendadas com backoff de 3, 5, 10, 15 e 30 minutos. Após cinco verificações falhas, o job é marcado como
- Envia um heartbeat a cada ciclo.
Status de jobs
| Status | Significado |
|---|---|
WAITING | Enfileirado, ainda não reivindicado. |
WAITING_PRECONDITION | A precondição falhou pelo menos uma vez; será reverificada na janela seguinte. |
PROCESSING | Reivindicado e em execução pela primeira vez. |
REPLAYING | Reivindicado novamente após uma tentativa anterior (retry ou replay manual). |
SUCCESS | Concluído sem exceção. |
ERROR | Falha definitiva (exceção ou precondição esgotada). |
Encadeamento de jobs
Jobs costumam disparar outros jobs. Um encadeamento típico após um evento de transação:O sistema de webhooks
Webhooks da adquirência chegam ao endpoint dedicado. O ponto de entrada é intencionalmente enxuto.Fluxo de entrada
- Todo payload recebido é persistido como
ReceivedWebhookCallpara reprocessamento e auditoria. - Ouvintes são registrados a partir da etapa de inicialização de cada módulo. Hoje apenas o despachante da camada de transações está registrado, mas o registro suporta múltiplos.
- O despachante inspeciona
event['type']e enfileira o job apropriado (transação, recebível, transferência, lojista, documento, conta bancária).
Fluxo de saída
Lojistas podem registrar seus próprios webhooks sob/integrations/webhooks/.... Após uma transação de venda ser atualizada, uma rotina de despacho serializa a transação e a envia via POST para cada webhook registrado pelo lojista. O nome do evento é transaction.update.status.
Consulte Webhooks e jobs para a taxonomia completa de eventos e procedimentos de replay.
Como os parceiros de processamento se encaixam
O contrato que uma integração com um parceiro de processamento precisa satisfazer:Modelos na camada de transações
Modelos de domínio que espelham os registros do parceiro, com um identificador externo único e um método de atualização para a camada unificada.
Ouvinte de webhook
Uma função registrada no sistema de webhooks que traduz eventos em enfileiramentos de jobs.
Manipuladores de jobs
Jobs do tipo
fetch_* que leem o estado autoritativo no parceiro e atualizam o modelo da camada de transações. A persistência do modelo se encarrega de propagar para a camada unificada.Guias relacionados
Modelo de dados unificado
Por que a camada unificada existe e como os dados fluem até ela.
Webhooks e jobs
Tipos de eventos, replay, deduplicação e agendamentos.
Autenticação e acesso
JWT versus chave de API, a tabela de acessos e códigos de permissão.
Fluxo de transação
Um passo a passo concreto desde o link de checkout até a liquidação do recebível.