Skip to main content
Este é um exemplo completo de servidor Node.js que recebe webhooks da Voop com:
  • Verificação HMAC SHA-256
  • Replay protection (timestamp 5 min)
  • Timing-safe compare
  • Idempotência via X-Voop-Event-Id (Redis)

Por que rawBody?

A assinatura HMAC é calculada sobre o JSON raw. Se você fizer JSON.parse e depois JSON.stringify, a string resultante pode diferir minimamente (ordem de chaves, espaçamento) e quebrar a verificação. A solução acima captura rawBody em um middleware antes do parse — o req.body continua disponível para sua lógica. Se você usa express.json() direto, troque por express.raw({ type: 'application/json' }) só na rota do webhook e parseie manualmente.

Por que processar em fila?

A Voop dá timeout de 5 segundos. Se sua lógica de processamento pode demorar (ex: invalidar cache, sincronizar em outros sistemas), faça só o mínimo no handler HTTP (verificar + persistir o evento numa fila local) e responda 2xx. Worker em background processa.
Caso contrário, você corre risco de timeout, e a Voop retenta — gerando processamento duplicado.