Testes e Debug
Versão: 1.0
Owner: Engenharia SOFIA
Última revisão: 2026
Aplicável a: Dev Integradores, Backend\
Esta página descreve como:
- Gerar eventos de teste
- Validar assinatura
- Simular webhooks
- Resolver erros comuns (
401,409,429,5xx)
Base da API:
https://api.v1sofia.com/api1. Obter Token do Parceiro
curl -X POST "https://api.v1sofia.com/api/partners/login" \
-H "Content-Type: application/json" \
-d '{
"email": "seu-email@dominio.com",
"password": "SUA_SENHA"
}'Salvar token como:
SOFIA_SUPABASE_JWTValidar sessão:
curl "https://api.v1sofia.com/api/partners/me" \
-H "Authorization: Bearer $SOFIA_SUPABASE_JWT"Se falhar aqui, não avance.
2. Testar postMessage
Gerar envelope de teste:
curl -X POST "https://api.v1sofia.com/api/partners/me/casino/postmessage/test" \
-H "Authorization: Bearer $SOFIA_SUPABASE_JWT" \
-H "Content-Type: application/json" \
-d '{
"table_id": "TBL-01",
"balance_cents": 105000,
"external_user_id": "test-user",
"session_id": "test-session"
}'Retorna:
envelopesigning_string
Use o envelope para validar fluxo no browser.
3. Testar Webhook Interno
Criar evento de teste:
curl -X POST "https://api.v1sofia.com/api/partners/me/casino/webhook/test" \
-H "Authorization: Bearer $SOFIA_SUPABASE_JWT"Listar eventos:
curl "https://api.v1sofia.com/api/partners/me/casino/webhook/events?limit=20" \
-H "Authorization: Bearer $SOFIA_SUPABASE_JWT"Reprocessar:
curl -X POST "https://api.v1sofia.com/api/partners/me/casino/webhook/events/<event_internal_id>/reprocess" \
-H "Authorization: Bearer $SOFIA_SUPABASE_JWT"4. Validar Assinatura (Webhook)
Header esperado:
x-sofia-signature: sha256=<hex>Assinatura deve ser feita sobre raw body.
Erro comum:
- Usar
JSON.stringify(req.body)para validar assinatura.
Correto:
crypto.createHmac('sha256', secret).update(rawBody).digest('hex')Checklist:
- Capturar raw body antes do body parser
- Comparar com
timingSafeEqual - Não logar assinatura
5. Validar Assinatura (postMessage)
String assinada:
<ts>.<table_id>.<balance_cents>.<user_external_id>.<session_id>.<nonce>Erros comuns:
- Timestamp em segundos (deve ser ms)
- Nonce reutilizado
- Ordem incorreta da string
- Segredo errado
6. Como Interpretar Erros
401 – Não autorizado
Causas:
- Assinatura inválida
- Timestamp fora da janela
- Token expirado
Correção:
- Revalidar segredo
- Sincronizar clock (NTP)
- Renovar token
403 – Bloqueado
Causas:
- IP fora da allowlist
- Origin inválido
- Permissão insuficiente
Correção:
- Conferir allowlist
- Conferir
event.origin - Conferir papel do parceiro
409 – Conflito (Duplicidade)
postMessage
- Nonce reutilizado
Webhook
event_idjá processado
Correção:
- Gerar nonce novo por evento
- Implementar idempotência
429 – Rate Limit
Correção:
- Aplicar backoff exponencial
- Respeitar
Retry-After - Reduzir polling
5xx – Erro do servidor
Correção:
- Retry com limite
- Monitorar recorrência
- Não entrar em loop infinito
7. Logs e Observabilidade
Prioridade de diagnóstico:
- Status code
- Body de erro
- Logs estruturados do backend
- Sentry (quando configurado)
Procure por:
CASINO_WEBHOOKCASINO_POSTMESSAGEinvalid_signaturestale_timestampreplay_detected
8. Checklist de Produção
Antes de ativar produção:
- Assinatura validada
- Idempotência implementada
- Origin validado
- Clock sincronizado
- Segredos em environment
- Retry controlado
- Logs sem PII
- Monitoramento ativo
9. Fluxo Mental Correto
Se falha:
- 401 → erro seu
- 403 → bloqueio de segurança
- 409 → duplicidade
- 429 → você está chamando demais
- 5xx → falha transitória
Corrija a causa, não aumente retry.
Last updated on