Como corrigir o erro 500 em um webhook do Stripe

1. Decida se o erro 500 está no endpoint ou no processamento
Ao ver uma entrega de webhook do Stripe com resposta HTTP 500, eu começaria por uma decisão: investigar o serviço que recebe o evento ou o código que o processa? O status indica que o endpoint retornou um erro interno; sozinho, ele não identifica a causa nem confirma se uma cobrança foi concluída. Antes de reenviar eventos ou alterar configurações, consulte o resultado da entrega e os registros da aplicação no mesmo horário.
No painel do Stripe, abra os eventos ou as entregas de webhook e confira o endpoint, o tipo de evento, o horário, o código HTTP e o conteúdo da resposta, quando disponível. Em paralelo, procure nos logs da aplicação uma exceção associada ao identificador do evento. Eu evitaria tratar o 500 como uma simples falha de pagamento: webhook é uma notificação entre sistemas, e a situação da cobrança deve ser confirmada na API ou no painel antes de qualquer ação financeira.

2. Identifique por que o webhook retorna HTTP 500
Uma causa frequente é uma falha no próprio endpoint: exceção não tratada, variável de ambiente ausente, dependência indisponível, conexão com banco de dados interrompida ou limite de tempo excedido. Também pode haver diferença entre os ambientes de teste e produção, como uma chave incorreta ou uma URL que aponta para a aplicação errada. Se o servidor falha antes de registrar o evento, os logs podem não mostrar o erro; nesse caso, verifique também a camada de hospedagem, o proxy e a configuração de rede.
Outra possibilidade é a validação incorreta da assinatura. Para verificar a assinatura do webhook, a aplicação precisa usar o corpo bruto da requisição e o segredo do endpoint correspondente. Um middleware que altera ou decodifica o corpo antes da verificação pode provocar falha. A assinatura inválida costuma ser tratada como erro de autenticação, mas uma implementação que converte qualquer exceção em 500 pode ocultar esse diagnóstico. Além disso, a lógica pode rejeitar um evento válido por esperar campos que não estão presentes naquele tipo de evento ou versão da API.
3. Corrija o endpoint e valide o processamento
Inspecione a entrega no Stripe. Identifique o evento que falhou e confirme a URL configurada, o ambiente e a resposta recebida. Compare o horário com os registros do servidor, incluindo logs de aplicação e de infraestrutura. Registre o identificador do evento para rastrear a mesma notificação sem expor dados sensíveis.
Reproduza o erro com segurança. Use as ferramentas de teste do Stripe ou um evento de teste compatível com o endpoint; não simule uma cobrança real apenas para provocar a falha. Verifique se o corpo bruto é preservado para validar a assinatura e se o segredo usado corresponde ao endpoint e ao ambiente. Corrija a exceção, a dependência ou o tempo de processamento indicado pelos logs, sem registrar chaves, segredos ou dados completos de cartão.
Torne o processamento idempotente e teste a resposta. Antes de aplicar alterações de negócio, confira se o identificador do evento já foi processado. Guarde essa referência de forma confiável e evite executar duas vezes ações como liberar um pedido ou atualizar uma assinatura. Depois da correção, envie um evento de teste, confirme que o endpoint responde com sucesso e verifique se o sistema registrou o resultado esperado. Reenvie entregas pendentes pelo painel somente após confirmar que uma repetição não duplicará efeitos.
4. Evite falhas recorrentes e cobranças duplicadas
O endpoint deve responder com sucesso somente depois de aceitar a requisição de forma segura, mas não precisa concluir toda a lógica de negócio antes de responder. Quando o trabalho for demorado, uma abordagem comum é validar a assinatura, registrar o evento de maneira durável e encaminhar o processamento para uma fila. Assim, a aplicação pode reconhecer a entrega rapidamente e tratar tarefas mais lentas separadamente. Essa arquitetura exige monitoramento da fila e tratamento de falhas posteriores: responder com sucesso não deve significar descartar o evento.
Também recomendo acompanhar as taxas de erro, o tempo de resposta e as falhas de dependências, além de alertar a equipe responsável quando as entregas deixam de ser processadas. Mantenha segredos em armazenamento apropriado, documente a diferença entre endpoints de teste e produção e revise mudanças em middleware ou versões da API. Se houver dúvida sobre o estado de um pagamento, consulte o objeto correspondente no Stripe antes de tentar cobrar novamente; um webhook com falha não é, por si só, prova de que a cobrança falhou.
5. Dúvidas comuns sobre erros 500 em webhooks
Q1. O que significa um erro HTTP 500 em uma entrega de webhook?
A1. Significa que o endpoint do destinatário respondeu indicando uma falha interna. Isso não revela, por si só, se o problema está na aplicação, em uma dependência ou em uma camada de infraestrutura. Confira a resposta da entrega e os logs do servidor no mesmo horário. Verifique separadamente o estado do pagamento antes de tomar medidas financeiras.
Q2. Posso reenviar a entrega que falhou?
A2. Sim, depois de corrigir a causa e confirmar que o processamento é idempotente. O Stripe pode tentar entregar novamente eventos que não receberam uma resposta de sucesso, e reenvios manuais também podem repetir o mesmo evento. Use o identificador do evento para impedir ações duplicadas. Para testar, prefira um evento de teste em vez de uma cobrança real.
Q3. Por que a validação da assinatura falha mesmo com o segredo correto?
A3. Confirme se o segredo pertence ao endpoint certo e ao mesmo ambiente da requisição. Verifique se o framework ou middleware preserva o corpo bruto antes da validação, pois alterar o conteúdo pode invalidar a assinatura. Confira também o relógio e os logs da aplicação, sem imprimir o segredo nos registros. Se a falha continuar, compare a configuração do endpoint com a documentação atual do Stripe.