Guia de Webhooks
Integração prática de webhooks com tipos de evento, validação de assinatura e exemplos de payload para cobrança, transferência e devolução.
Este guia mostra como implementar webhooks da Qesh com segurança e idempotência, cobrindo os principais casos de uso de Pix Avulso.
Fluxo de integração
- Criar endpoint de webhook com
url,secreteevent_types; - Receber requisição
POSTda Qesh; - Validar
X-Webhook-Signaturecom HMAC-SHA256; - Persistir evento bruto e responder
HTTP 200rapidamente; - Processar lógica de negócio de forma assíncrona.
Pré-requisitos
- Token JWT válido (veja Guia de Autenticação);
- Endpoint HTTPS público;
- Secret exclusivo por ambiente (
sandbox/produção).
Passo 1 - Criar endpoint
Referência: Criar um endpoint para tipos de eventos
POST /v1/webhook/endpoints HTTP/1.1
Host: api.qesh.ai
Authorization: Bearer <token>
Content-Type: application/json
{
"url": "https://seu-sistema.com/webhooks/qesh",
"secret": "seu-secret-super-seguro",
"event_types": [
"qrcode.approved",
"transfer.in.processing",
"refund.in.processing"
]
}Campos obrigatórios:
urlsecretevent_types
Passo 2 - Validar assinatura
Header enviado em cada evento:
X-Webhook-Signature: <hash_hmac_sha256>Exemplo em Node.js:
const crypto = require('crypto');
function verifyWebhook(secret, signature, rawBody) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return expected === signature;
}
Sempre valide com o corpo bruto (raw body).
Catálogo de eventos (exemplos)
| Tipo de evento | Quando usar | Origem |
|---|---|---|
qrcode.pending | Acompanhar QR Codes aguardando pagamento | Cobrança |
qrcode.approved | Confirmar pedido pago por QR Code | Cobrança |
qrcode.expired | Checar se uma cobrança com QR Code expirou | Cobrança |
transfer.in.processing | Acompanhar novo pagamento de entrada no fluxo de transferência | Transferência |
transfer.in.confirmed | Confirmar pagamento de entrada no fluxo de transferência | Transferência |
transfer.in.error | Tratar falha de pagamento no fluxo de transferência | Transferência |
transfer.out.processing | Acompanhar nova transferência de saída iniciada | Transferência |
transfer.out.confirmed | Confirmar transferência de saída concluída | Transferência |
transfer.out.error | Tratar falha de transferência de saída | Transferência |
refund.in.processing | Acompanhar restituição de um pagamento iniciado | Devolução |
refund.in.returned | Confirmar restituição de um pagamento concluída | Devolução |
refund.in.error | Tratar falha na restituição de um pagamento | Devolução |
refund.out.processing | Acompanhar restituição de um pagamento recebido iniciada | Devolução |
refund.out.returned | Confirmar restituição de um pagamento recebido concluída | Devolução |
refund.out.error | Tratar falha na restituição de um pagamento recebido | Devolução |
Payloads por caso de uso
Cobrança paga
{
"id": 12345678,
"name": "qrcode.approved",
"payload": {
"id": 12345678,
"transaction_identification": "tx123",
"external_id": "qrcode_12345678",
"status": "APPROVED",
"create_timestamp": "2024-06-01T12:00:00Z"
},
"create_timestamp": "2024-06-01T12:00:00Z"
}Transferência em processamento
{
"id": 12345678,
"name": "transfer.in.processing",
"payload": {
"id": 12345678,
"external_id": "transfer_12345678",
"end_to_end_id": "E318188732025073114206r8iSU2Swrt",
"correlation_id": "correlation_12345678",
"amount": 1000,
"impact_type": "IN",
"initiation_type": "KEY",
"status": "PROCESSING",
"create_timestamp": "2024-06-01T12:00:00Z"
},
"create_timestamp": "2024-06-01T12:00:00Z"
}Devolução em processamento
{
"id": 12345678,
"name": "refund.in.processing",
"payload": {
"id": 12345678,
"external_id": "refund_12345678",
"return_identification": "D318188732025073114206r8iSU2Swrt",
"original_end_to_end_id": "E318188732025073114206r8iSU2Swrt",
"correlation_id": "correlation_12345678",
"amount": 1000,
"status": "PROCESSING",
"flow": "IN",
"create_timestamp": "2024-06-01T12:00:00Z"
},
"create_timestamp": "2024-06-01T12:00:00Z"
}Processamento recomendado
- Validar assinatura;
- Salvar evento bruto com
idename; - Retornar
HTTP 200imediatamente; - Enfileirar processamento;
- Garantir idempotência por
iddo evento e por identificadores de negócio (external_id,end_to_end_id,return_identification).
Gestão e observabilidade
Status operacionais do endpoint:
activedisabledinactive
Próximos passos
Updated 8 days ago
