Testes e solução de problemas
Roteiro para validar sua integração e tabela de diagnóstico dos problemas mais comuns.
Roteiro de testes
1. Autenticação
Token com chaves corretas (200); com chave errada (401); sem cabeçalho (401). Renove o token ao receber 401.
2. Webhook
PUT /api/webhook → POST /api/webhook/test → confira no seu receptor e em GET /api/webhook/deliveries. Teste também assinatura inválida e timestamp antigo (devem ser rejeitados).
3. Criação
Crie com dados válidos; com campo faltando (422); com valor 0 ou negativo (422); com método desabilitado (400).
4. Idempotência
Repita a mesma chamada com a mesma chave: mesma resposta e Idempotent-Replayed: true. Troque o corpo mantendo a chave: 422.
5. Estados
Simule no seu código eventos invoice.paid, duplicado e fora de ordem. O pedido deve ser liberado uma única vez.
6. Falhas
Force timeout, 429 e 500 no seu cliente (mocks) e confira o backoff e a reutilização da chave.
Teste unitário da assinatura
Use o vetor de teste da página de Webhooks. Exemplo em Node.js:
import { createHmac, timingSafeEqual } from 'node:crypto';
import assert from 'node:assert/strict';
const assinar = (segredo, t, corpo) => createHmac('sha256', segredo).update(`${t}.${corpo}`).digest('hex');
const v1 = assinar('whsec_test_secret', 1700000000, '{"id":"evt_test","type":"ping"}');
assert.equal(v1, '76e93d7667b36f8aab799377027b5ad5c17365edfaca34f11cc7c9f570f94a2a');
assert.ok(timingSafeEqual(Buffer.from(v1), Buffer.from(v1)));
console.log('ok');Problemas comuns
| Sintoma | Causa provável | Solução |
|---|---|---|
| 401 em /api/auth | Chaves trocadas, com espaço, ou conta sem chaves geradas. | Copie PUB-… e SEC-… do painel; Basic = base64(pub:sec). |
| 401 depois de dias | Token expirou (expires_in). | Renove ao receber 401. |
| 400 “método não habilitado” | Pix/boleto/cartão desligado na conta. | Habilite o método no painel. |
| 422 com campos | Corpo fora do contrato. | Leia error por campo e a Referência. |
| 422 idempotency_key_reused | Mesma chave com outro corpo/rota. | Gere nova chave para nova operação. |
| 409 idempotency_in_progress | Reenvio enquanto a primeira chamada roda. | Aguarde 1–2 s. |
| 429 | Mais de 60 req/min. | Respeite Retry-After; reduza polling. |
| Webhook não chega | URL não https, porta ≠ 443/8443, IP privado, sem 2xx. | Veja last_status/last_error em /api/webhook/deliveries. |
| Assinatura não confere | Corpo reserializado; segredo errado ou rotacionado; relógio fora de hora. | Use o corpo bruto; confira o segredo; sincronize o relógio (NTP). |
| Valor diferente do esperado | Esqueceu quantity, tax ou discount. | Total = amount×quantity + tax% − discount%. |
| 404 em uma cobrança que existe | É de outra conta/instalação. | Use as chaves da conta dona da cobrança. |