Autenticação de Webhooks
Todos os webhooks enviados pela API do Pagou, incluindo eventos de boletos (ex.: charge.created, charge.paid) e Pix (ex.: qrcode.completed, qrcode.refunded), incluem os headers X-Pagou-Signature e X-Pagou-Timestamp para verificar a autenticidade e integridade das notificações. Esta seção detalha como validar esses headers, incluindo o processo de verificação da assinatura HMAC-SHA256 e do timestamp, exemplos de código em Python e JavaScript, e boas práticas para segurança.
Visão Geral Técnica
Os webhooks da API do Pagou são enviados como requisições HTTP POST com corpo JSON para o notification_url configurado (ex.: https://your-webhook.com/notifications). Cada webhook inclui dois headers de autenticação:
X-Pagou-Signature: Assinatura HMAC-SHA256 do conteúdotimestamp + payload(onde payload é a string JSON bruta do corpo da requisição). A assinatura é gerada com a chave de API do cliente.X-Pagou-Timestamp: Timestamp em segundos desde o epoch (ex.: 1754332106 para 2025-08-04 18:28:26).
Validação dos Headers
Para garantir que o webhook é confiável, valide os headers X-Pagou-Signature e X-Pagou-Timestamp:
Obter a chave de API
Validar
X-Pagou-Signature:Extraia o
<hex>do headerX-Pagou-Signature.Concatene o valor de
X-Pagou-Timestampcom o payload JSON bruto (ex.:1754329142+{"name":"charge.created",...}).Calcule o HMAC-SHA256 do resultado usando a chave de API.
Compare o hash calculado com o
<hex>do header usando uma comparação resistente a ataques de tempo (ex.:crypto.timingSafeEqualem JavaScript,hmac.compare_digestem Python).
Rejeitar se inválido:
Retorne
401 Unauthorizedse a assinatura ou timestamp forem inválidos.Registre tentativas inválidas para monitoramento.
Nota: A validação dos headers é altamente recomendada para segurança, mas os webhooks são enviados mesmo que a validação não seja implementada.
Exemplos de Código
Boas Práticas Técnicas
Segurança: Sempre valide
X-Pagou-SignatureeX-Pagou-Timestamppara garantir a origem e integridade do webhook.Comparação Segura: Use funções como
crypto.timingSafeEqual(JavaScript) ouhmac.compare_digest(Python) para evitar ataques de tempo.Prevenção de Replay Attacks: Rejeite webhooks com
X-Pagou-Timestampfora de ±5 minutos do horário atual.Monitoramento: Registre
X-Pagou-Timestamp,X-Pagou-Signature, e resultados da validação em logs para auditoria.HTTPS: Use um certificado SSL válido para o
notification_url.
Boas Práticas Técnicas
Segurança: Sempre valide
X-Pagou-SignatureeX-Pagou-Timestamppara garantir a origem e integridade do webhook.Comparação Segura: Use funções como
crypto.timingSafeEqual(JavaScript) ouhmac.compare_digest(Python) para evitar ataques de tempo.Prevenção de Replay Attacks: Rejeite webhooks com
X-Pagou-Timestampfora de ±5 minutos do horário atual.Monitoramento: Registre X-Pagou-Timestamp, X-Pagou-Signature, e resultados da validação em logs para auditoria.
HTTPS: Use um certificado SSL válido para o notification_url.
Testes: Valide webhooks no ambiente sandbox (https://sandbox.api.pagou.com.br/v1) usando ferramentas como ngrok.
Last updated