Skip to main content
Conferir a assinatura leva poucas linhas de código e é o que garante que o evento veio mesmo de nós. Sem ela, qualquer pessoa que descubra a URL do seu endpoint consegue simular um pagamento — então vale fazer isso antes de qualquer outra coisa no seu handler. O código pronto está logo abaixo, nas quatro linguagens. Se quiser só copiar e seguir, pule para a implementação.

Como a assinatura é montada

Toda entrega chega com o header:
Onde v1 é:
O segredo é o do endpoint que recebeu a entrega, disponível em Desenvolvedores.

Dois detalhes que fazem a conferência funcionar

1. Use o corpo bruto, antes de desserializar. O HMAC é calculado sobre os bytes exatos que enviamos. Desserializar e reserializar muda espaçamento e ordem de chaves, e aí a conta não fecha — é a causa mais comum de “minha assinatura nunca bate”. Na prática: $request->getContent() no Laravel, express.raw() no Express e request.get_data() no Flask, em vez de ->all(), express.json() ou request.json. 2. Aceite só timestamps dos últimos 5 minutos. A assinatura de uma entrega continua válida para sempre, então a janela de tempo é o que impede que uma entrega antiga de charge.paid seja reenviada mais tarde. São duas linhas, e é o que separa uma verificação decorativa de uma que protege de verdade.

Implementação

Repare que os três exemplos comparam em tempo constante — hash_equals, crypto.timingSafeEqual, hmac.compare_digest. Uma comparação comum de strings para no primeiro byte diferente, e essa diferença de tempo é suficiente para alguém descobrir a assinatura correta byte a byte. Vale manter essa parte como está ao adaptar o código.

Depois de conferir

Com a assinatura confirmada, desserialize e siga: responda 2xx rápido e deixe o processamento para uma fila. O padrão está em Entregas e retentativas. Se a assinatura não bater, responda 400 e registre o X-Vext-Delivery no seu log. Os dois motivos possíveis são um evento adulterado ou um segredo desatualizado, e o log com o X-Vext-Delivery é o que nos permite dizer qual dos dois foi.

Veja também

Visão geral

Os três eventos e o envelope.

Checkout PIX

O fluxo completo, da criação à liberação.

Ficou algo de fora? Escreva para suporte@usevext.com. Se o assunto for uma chamada específica, informe o horário dela; se for uma entrega de webhook, informe o X-Vext-Delivery — é por ele que localizamos a tentativa, a resposta do seu servidor e o horário.