sequence e applicationId.
O envelope
O corpo é idêntico byte a byte em todas as entregas e replays do mesmo evento. Tudo o que varia por tentativa de entrega — o ID da entrega, o contador de tentativas, o timestamp, a assinatura — fica nos cabeçalhos HTTP.
Eventos, entregas e tentativas
Três registros distintos estão por trás de cada webhook que chega até você, e cada um carrega seu próprio identificador e seus próprios timestamps. Mantê-los separados é a chave para reconciliar os vários timestamps e a lógica desequence abaixo.
A divisão segue uma regra: tudo o que é intrínseco ao evento —
id, type, sequence, originalCreateDate, data — fica no corpo e nunca muda; tudo o que descreve esta requisição HTTP específica — ID da entrega, número da tentativa, tipo da tentativa, timestamp, assinatura — fica nos cabeçalhos e é regenerado a cada tentativa.
Payloads carregam a mudança de estado, não o recurso completo
Os payloads de webhook contêm deliberadamente o mínimo de que você precisa para reagir: o ID do recurso e a transição depreviousStatus para status. Eles não contêm o objeto completo do recurso.
A maioria das reações — rotear pelo novo status, atualizar a linha correspondente no seu próprio banco de dados, notificar sua equipe de operações — funciona apenas com o payload. Quando precisar do recurso completo (critérios de verificação completos, detalhes de conta bancária, valores da transferência), busque-o no endpoint GET do recurso:
O campo sequence
sequence é um inteiro monotonicamente crescente com escopo em uma única instância de recurso — um contador por cliente, um por transferência, e assim por diante, indexado por data.id. Ele é atribuído quando o evento é criado e nunca muda, de modo que reflete a ordem verdadeira em que as mudanças de estado ocorreram, mesmo quando as entregas chegam fora de ordem.
Como a ordem de entrega não é garantida, use sequence para se proteger contra atualizações obsoletas:
- Armazene o maior
sequenceque você já processou por instância de recurso — por exemplo, uma colunalastSphereSequencena linha do cliente no seu próprio banco de dados. - Quando um evento chegar, compare seu
sequencecom o valor armazenado para aqueledata.id. - Se
incoming.sequence <= stored.sequence, o evento é obsoleto ou duplicado — confirme com um2xxe pule a atualização. - Caso contrário, aplique a atualização e armazene o novo
sequence.
Não presuma que os valores de sequence que você recebe são contíguos. Se o seu endpoint assina um subconjunto dos eventos de um recurso, você observará lacunas — use a comparação de obsolescência
<= acima, nunca detecção de lacunas.Por que ambos sequence e originalCreateDate?
Eles respondem a perguntas diferentes. originalCreateDate diz quando uma mudança de estado aconteceu — tempo de relógio, útil para exibição, trilhas de auditoria e consultas por janela de tempo. Mas o tempo de relógio é uma chave de ordenação pouco confiável: duas transições rápidas no mesmo recurso podem ocorrer tão próximas que seus timestamps colidem, e uma comparação de timestamps não tem como desempatar. sequence existe para tornar a ordenação inequívoca — um inteiro estritamente crescente por instância de recurso, de forma que quaisquer dois eventos do mesmo recurso sempre tenham uma ordem definida, não importa quão próximos tenham ocorrido.
Regra prática: ordene e deduplique por sequence; exiba e audite por originalCreateDate.
O campo applicationId
Todo payload inclui data.applicationId — a aplicação do SpherePay à qual o evento pertence. Endpoints de webhook são registrados por aplicação, e os eventos só são entregues para recursos pertencentes à aplicação do endpoint.
Isso é mais importante quando você opera múltiplas aplicações do SpherePay que compartilham uma mesma URL receptora de webhooks. Registrar a mesma URL em duas aplicações é perfeitamente válido — mas seu handler então recebe eventos de ambas, e o endpoint de cada aplicação tem seu próprio segredo de assinatura. Use applicationId para rotear cada evento ao contexto de aplicação correto no seu sistema (e para selecionar o segredo correto ao verificar assinaturas).