Webhook vs API explicado com uma tabela comparativa, os prós e contras de polling vs push, um verificador de assinatura HMAC no navegador, tratamento de retries e código de receptor idempotente.
Com uma chamada de API, seu código pede dados a outro serviço quando quiser: isso é pull. Com um webhook, o serviço envia um HTTP POST para a sua URL no momento em que algo acontece: isso é push. A maioria das integrações usa os dois, um webhook para saber de uma mudança rapidamente e uma chamada de API para buscar o registro completo e atual.
Requisição de API vs webhook
Fazer polling em uma API a cada minuto para ver se um pagamento foi compensado desperdiça requisições e ainda assim chega atrasado. Um webhook inverte a direção, mas também passa a responsabilidade para você: seu endpoint precisa ser público, provar que cada mensagem é genuína, responder rápido e lidar com o mesmo evento chegando duas vezes. Esta página cobre cada uma dessas tarefas com código que você pode copiar.
De forma geral, sim. É uma requisição HTTP com um corpo JSON, só que enviada na direção oposta. Às vezes chamam de API reversa. A diferença que importa é quem inicia a conversa e quem precisa estar online para recebê-la.
Use webhooks quando o provedor os oferece para os eventos de que você precisa e você consegue hospedar um endpoint HTTPS público. Faça polling quando não houver webhook, quando você estiver atrás de um firewall ou para poucas verificações em que um minuto de atraso não faz diferença.
A maioria dos provedores envia em um header um HMAC SHA-256 do corpo, calculado com um segredo que só você e eles conhecem. O GitHub, por exemplo, usa X-Hub-Signature-256 com o prefixo sha256=; o Stripe usa Stripe-Signature com um timestamp. Recalcule e compare antes de confiar em qualquer coisa.
A maioria dos provedores tenta reenviar entregas que falharam com intervalos cada vez maiores, por um período que depende do provedor. O Stripe, por exemplo, continua tentando enviar eventos de produção por até três dias. Depois disso, o evento só fica disponível pela API ou pelo painel deles.
Os provedores esperam pouco tempo por uma resposta. Se o seu código envia e-mails ou chama outros serviços antes, a entrega pode estourar o tempo e ser reenviada, mesmo que você já tenha agido. Coloque o job na fila, retorne 200 e processe depois.
express.raw mantém o corpo como bytes para que a assinatura bata. Este formato de header segue a convenção sha256= do GitHub; adapte o nome do header para outros provedores.
Um índice único no id do evento faz uma segunda entrega falhar no insert, então o trabalho roda uma vez só, não importa quantas vezes o evento chegue.
ON CONFLICT DO NOTHING não retorna linha para uma duplicata, e seu código trata isso como já processado.
O polling é mais simples de hospedar, mas é mais lento e gera mais tráfego. Mantenha um cursor para que cada consulta peça só o que é novo.
Cole um corpo e um segredo para calcular a assinatura que um provedor enviaria e depois cole o header que você recebeu para comparar. Tudo roda no seu navegador com a Web Crypto API; nada é enviado para lugar nenhum.
Corpo bruto da requisição
Segredo do webhook
Assinatura que este corpo deve ter
Header de assinatura que você recebeu (opcional)
Confere: o corpo e o segredo produzem esta assinatura.
Não confere: o corpo mudou, o segredo está errado ou o header usa outro formato.
Calculando
Comece grátis · Sem cartão de crédito