Estrutura dos Cabeçalhos
A assinatura é transmitida no cabeçalhoX-KavroPay-Signature (e paralelamente em X-Kavro-Signature e x-kavropay-signature para retrocompatibilidade) no seguinte padrão:
t: Timestamp Unix em segundos no momento exato do disparo.v1: Hash hexadecimal HMAC-SHA256 gerado a partir do payload bruto.
Segredo Criptográfico (
whsec_...): Todos os segredos de webhook utilizam 32 bytes de entropia aleatória com prefixo whsec_ (ex: whsec_3f8a...). Na criação de cobranças com notification_url, o segredo exclusivo daquela transação é retornado no campo notification_secret. Para webhooks cadastrados, consulte via GET /v1/webhooks/:id/secret.Como a Assinatura é Calculada
- Extraia o timestamp
te o hashv1do cabeçalhoX-Kavro-Signature(ou utilize o cabeçalhoX-Kavro-Timestamp). - Concatene o timestamp com o corpo bruto da requisição (raw body, em formato string/bytes, sem alteração de formatação), separado por um ponto:
- Calcule o hash HMAC com algoritmo SHA-256 utilizando o segredo do webhook (
signingSecret) cadastrado no painel da KavroPay. - Compare o hash calculado com o valor
v1utilizando comparação segura em tempo constante (timing-safe comparison). - Valide se a diferença entre o timestamp do webhook e o relógio atual do seu servidor não ultrapassa 300 segundos (5 minutos) para evitar ataques de repetição (replay attacks).
Exemplos Práticos de Implementação
- Node.js (Express / Fastify)
- Python (FastAPI / Flask)
- PHP
