← Ver a árvore completa

ROTA · 6 CLASSES · 1 GRUPOS

Webhooks na Prática

Receba eventos, valide assinaturas e garanta processamento idempotente.

Pré-requisitos orientam, mas nunca bloqueiam. Cinco classes fundamentais e o bônus Go 1.27 são grátis com conta.

O ARCO DA ROTA

01Web

ORDEM RECOMENDADA

6 classes, do primeiro passo ao fechamento.

Cada classe leva cerca de 15–25 minutos no novo formato de slides. Você pode sair da ordem quando outro nó fizer mais sentido.

  1. 01
    Webhooks na PráticaReceba POSTs sem perder o controle do corpo

    Receba webhooks por HTTP, limite o corpo e responda com status previsíveis antes de executar regras de negócio.

  2. 02
    Webhooks na PráticaVerifique HMAC antes de confiar no payload

    Autentique webhooks com HMAC SHA-256, decodificação segura e comparação em tempo constante.

  3. 03
    Webhooks na PráticaTorne entregas repetidas inofensivas

    Impeça efeitos duplicados com chaves de evento, claim atômico e respostas corretas para retries.

  4. 04
    Webhooks na PráticaProcesse webhooks reais do GitHub

    Valide e interprete um webhook de pull request do GitHub usando fixtures locais e headers reais.

  5. 05
    Webhooks na PráticaValide eventos Stripe com tolerância temporal

    Verifique assinaturas Stripe, tolerância de timestamp e eventos financeiros gravados sem acessar a rede.

  6. 06
    Webhooks na PráticaMonte um receiver completo para dois provedores

    Monte um receiver demonstrável com roteamento, HMAC, idempotência e despacho para GitHub e Stripe.

PRÉVIA DA PRIMEIRA CLASSE

Receba POSTs sem perder o controle do corpo

const maxBodyBytes int64 = 1024

if r.Method != http.MethodPost { // Recuse antes de ler o corpo.
	http.Error(w, "método inválido", http.StatusMethodNotAllowed)
	return
}
body, err := io.ReadAll(io.LimitReader(r.Body, maxBodyBytes+1))
if err != nil || int64(len(body)) > maxBodyBytes { // Detecte o byte excedente.
	http.Error(w, "corpo inválido", http.StatusRequestEntityTooLarge)
	return
}
w.WriteHeader(http.StatusAccepted) // Confirme só depois das guardas.

Pense na doca de um depósito. O caminhão não entra direto na área de estoque: primeiro a portaria confirma a doca, confere o manifesto e pesa a carga. Um endpoint de webhook é essa portaria. Ele recebe uma requisição criada por outro sistema, não por uma tela sob seu controle. Por isso, método, tamanho, headers e resposta fazem parte da segurança e da operação, não são acabamento.

Se você chamar io.ReadAll sem limite, um cliente pode consumir memória proporcional ao corpo. Se decodificar JSON antes de preservar os bytes, a assinatura da próxima aula poderá ser calculada sobre uma representação diferente. Se devolver 500 depois de aceitar o evento, o provedor tentará novamente e poderá repetir um efeito. A entrada precisa ter um funil explícito.

O handler aceita somente POST, envolve r.Body com http.MaxBytesReader ou io.LimitReader, lê uma única vez e guarda []byte. Depois valida os metadados mínimos. Nesta aula o processamento termina em uma confirmação; nas próximas, os mesmos bytes passam por autenticação e idempotência. Um 202 Accepted comunica que a entrega foi recebida para processamento, enquanto 204 No Content serve quando o trabalho já terminou sem resposta.

Esse fluxo também define responsabilidade operacional. O provedor considera qualquer resposta fora da faixa de sucesso como motivo potencial para nova tentativa. Portanto, o status HTTP não é um detalhe cosmético: ele controla a fila do outro lado. Responda rapidamente, registre um identificador correlacionável e mova trabalho demorado para uma etapa que você consegue observar. Nunca registre segredo, assinatura completa ou payload sensível apenas para facilitar debug.

A fronteira deve permanecer determinística nos testes. httptest, readers em memória, relógio injetado e fixtures gravadas reproduzem os casos sem abrir porta, esperar timer ou depender de serviço externo. Isso torna falhas repetíveis e permite demonstrar o receiver em uma revisão de código ou entrevista técnica.

Há ainda um contrato de manutenção: cada etapa deve produzir evidência suficiente para diagnosticar uma recusa sem reproduzir dados confidenciais. Conte status por provedor, classifique falhas de formato, assinatura e duplicidade e preserve um ID de correlação. Uma métrica agregada responde se o problema começou após deploy ou rotação de segredo; o ID permite localizar uma entrega específica. O corpo completo raramente precisa aparecer no log. Essa escolha reduz exposição e mantém a investigação útil.

A introdução termina aqui

Entre para continuar nos slides, rodar o código e enfrentar os desafios.

Começar pela rota →

ESTA ROTA E TODAS AS OUTRAS

Qualquer plano abre os 192 nós.

Mensal R$19,90 · anual R$149 · lifetime R$499. Todos têm garantia de 7 dias.

Comparar os 3 planos →Começar pelas classes grátis