Por que usar webhooks?
Sem webhooks, sua aplicação teria que perguntar para a API a cada segundo:“Essa transação já foi confirmada?”Isso é lento e ineficiente. Com webhooks, a Upay avisa você imediatamente:
“O pagamento foi confirmado. Aqui estão os dados.”Assim você pode:
- atualizar o status de um pedido
- liberar acesso a um produto
- enviar e-mails automáticos de confirmação
- registrar movimentações financeiras
Como funciona na prática?
-
Você cria um endpoint no seu sistema
Ex.:
https://meusite.com/webhooks/upay - Você cadastra esse endpoint criando uma assinatura de webhook via API
-
Sempre que algo importante acontece, como um pagamento aprovado:
- A Upay envia um
POSTpara a sua URL - O body contém o evento (ex:
transaction.paid,withdrawal.completed) - Seu sistema processa esse evento
- A Upay envia um
Ambientes (Desenvolvimento vs Produção)
Ambientes da Upay
- Webhooks criados com chaves de Desenvolvimento recebem eventos simulados
- Webhooks criados com chaves de Produção recebem eventos reais
Segurança dos webhooks
Webhooks precisam ser seguros — afinal, qualquer pessoa poderia tentar enviar requisições falsas para sua aplicação. Por isso, recomendamos duas camadas de proteção:🔐 1. Secret na URL
Cada assinatura de webhook tem um secret único, que pode ir na query string do seu endpoint. Ex.:https://meusite.com/webhook/upay?secret=SEU_SECRET
Seu backend confere:
🛡️ 2. Assinatura HMAC (verificação do corpo)
Mesmo que alguém descubra sua URL, ainda não consegue falsificar o evento. Por quê? Porque cada webhook enviado pela Upay inclui uma assinatura no headerX-Webhook-Signature.
Essa assinatura é gerada usando HMAC-SHA256 e garante que:
- o corpo da requisição não foi alterado
- o evento realmente foi enviado pela Upay
- Se for igual → ✅ evento é legítimo
- Se for diferente → ❌ evento rejeitado
🔧 Exemplo de validação HMAC (Node.js)
Este exemplo mostra como validar a assinatura HMAC enviada no header X-Webhook-Signature.
Criando uma assinatura de webhook
1
Defina seu endpoint
Crie um endpoint HTTPS público que receberá as notificações.
Requisitos do endpoint
- Deve ser HTTPS (HTTP não é aceito)
- Deve responder 200 OK dentro de 10 segundos
- Deve aceitar requisições
POSTcom body JSON
2
Crie a assinatura via API
Envie uma requisição
POST /api/v1/webhooks/subscriptions:3
Valide os eventos recebidos
Implemente a validação HMAC no seu endpoint para garantir que os eventos são legítimos.
Eventos suportados
Todos os webhooks compartilham o mesmo formato de payload:
Dados sensíveis: O campo
taxId (CPF/CNPJ) é mascarado nos payloads (ex: 123.***.***-**). Para pagamentos com cartão, apenas os últimos 4 dígitos e a bandeira são enviados.Eventos de Transação
- transaction.paid
- transaction.refunded
- transaction.cancelled
- transaction.expired
Disparado quando o pagamento de uma transação é confirmado.
Eventos de Link de Pagamento
- payment_link.paid
- payment_link.expired
Disparado quando um pagamento é realizado via link de pagamento.
Eventos de Saque
- withdrawal.completed
- withdrawal.failed
Disparado quando um saque é concluído com sucesso.
Boas práticas
Recomendações importantes
- Use HTTPS em todos os webhooks
- Valide a assinatura HMAC em cada requisição recebida
- Registre cada evento recebido e processe cada um uma única vez (idempotência)
- Responda 200 OK somente após concluir o processamento
- Implemente retentativas com idempotência caso o processamento falhe
- Não valide o payload inteiro com schemas rígidos (como Zod) — novos campos podem ser adicionados sem aviso prévio
Precisa de ajuda?
Nossa equipe pode te ajudar. Contate-nos: suporte@upaybr.com

