Construa um handler de webhooks do Stripe com Functions
Receba eventos de pagamento do Stripe em uma aplicação Hono que roda como function, verifique cada assinatura e trate cada tipo de evento.
Neste tutorial, você vai construir um handler de webhooks do Stripe que roda como uma function na Azion. Você vai criar o projeto, verificar a assinatura, tratar os eventos, armazenar as credenciais, fazer o deploy do handler e registrar sua URL no Stripe.
O handler é uma aplicação Hono com duas rotas: POST /webhook recebe os eventos e GET / informa o status do serviço.
Pré-requisitos
- Uma conta Azion. Para criar uma, consulte Como criar uma conta na Azion.
- Uma conta Stripe com acesso à API.
- Azion CLI instalada.
- Stripe CLI instalada.
- Node.js 18 ou superior.
1. Crie o projeto
Azion CLI monta o projeto a partir do preset Hono. Para criá-lo:
Execute o comando de login:
O comando abre um fluxo no navegador e armazena localmente o personal token gerado, de modo que os próximos comandos rodam na sua conta.
Execute o comando de init:
Digite um nome ou pressione enter para aceitar a sugestão que a CLI exibe.
Azion CLI cria o diretório do projeto com o template Hono e seus arquivos de configuração.
2. Verifique a assinatura do webhook
Stripe assina cada requisição de webhook e envia a assinatura no header stripe-signature. Um handler que age sobre uma requisição não verificada age sobre qualquer requisição que chega à sua URL, por isso a verificação da assinatura roda antes da rota.
O middleware abaixo rejeita uma requisição sem assinatura, rejeita uma requisição cuja assinatura não confere e anexa o evento convertido ao contexto do Hono para o handler da rota.
O campo entry do azion.config.js indica o arquivo de entrada do projeto. Abra esse arquivo e substitua o conteúdo dele pelo cliente do Stripe e pelo middleware de verificação:
Uma requisição que falha na verificação recebe uma resposta 400 e nunca chega à rota.
3. Trate os eventos de pagamento
A rota lê o evento verificado no contexto e ramifica conforme o tipo dele. Toda ramificação termina em uma resposta 200: Stripe reenvia um evento que o endpoint não confirma. Um reenvio entrega um evento sobre o qual o handler já pode ter agido, então registre o id de cada evento processado e ignore um que se repita. Um reenvio pode entregar de novo um evento que o handler já processou, então armazene cada event.id e ignore um ID já armazenado.
Adicione ao mesmo arquivo a rota de webhook, a rota de status, o tratamento de erros e o export:
O handler responde a cada evento verificado com { "received": true }, e um tipo de evento fora do switch chega à ramificação default e é registrado no log.
Para a implementação de referência deste handler, consulte edge-functions-examples.
4. Armazene as credenciais do Stripe
O handler lê as duas chaves do Stripe no ambiente, então nenhum desses valores pertence ao código. A chave secreta começa com sk_test_ ou sk_live_ e a chave de assinatura do webhook começa com whsec_.
Armazene a chave secreta como variável de ambiente na sua conta:
Armazene a chave de assinatura do webhook da mesma forma:
As duas variáveis ficam armazenadas na conta com o campo secret definido como true, o que marca o valor como confidencial. Uma variável cuja chave contém password, pwd, secret, key, hash, encrypted, passcode, auth ou token é enviada como secret por padrão. Uma alteração em uma variável só chega à function depois de um novo deploy. Para os campos, os limites e os outros subcomandos, consulte Variáveis de ambiente.
5. Faça o deploy do handler
Faça o deploy do projeto:
Azion CLI faz o build do projeto, faz o deploy e abre Azion Console na página que traz os logs do deployment. Quando o navegador não abre, o terminal exibe o link.
O deployment retorna um domínio no formato https://xxxxxxxxx.map.azionedge.net. A propagação leva alguns minutos, então aguarde antes de enviar o primeiro evento. A rota de webhook do handler é /webhook nesse domínio.
6. Registre a URL do handler no Stripe
Para entregar os eventos ao handler em produção:
No Stripe Dashboard, vá para Developers > Webhooks.
Digite https://<seu-dominio-azion>/webhook.
Stripe entrega à sua function cada evento selecionado nesse endpoint. Para os tipos de evento que um endpoint aceita, consulte Stripe webhooks.
7. Verifique o handler
Para exercitar o handler após o deploy:
A rota retorna um objeto JSON com três campos: status definido como ok, timestamp definido como o horário da requisição e service definido como stripe-webhooks.
Stripe entrega cada evento ao endpoint registrado e o handler responde { "received": true }. O Stripe Dashboard lista a entrega, o código de resposta e qualquer reenvio desse endpoint.
O handler responde { "received": true } novamente e o evento chega à ramificação default.
O terminal exibe as mensagens de console dos últimos 5 minutos e continua exibindo as novas.
Cada evento disparado produz uma linha: PaymentIntent was successful! com o ID do payment intent, Charge was successful! com o ID do charge e Unhandled event type invoice.payment_succeeded para o evento que o switch não nomeia.