Testes no Sandbox
O sandbox permite conduzir uma transação por todo o seu ciclo de vida sem movimentação real de dinheiro. Duas ferramentas tornam isso possível: dados de teste que disparam comportamentos específicos de conformidade e um endpoint de forçar eventos que simula os callbacks externos (webhooks do gateway, notificações da rede de payout) que normalmente fazem uma transação avançar.
Forçando Transições de Status
Endpoint: POST /organizations/{tenant}/fx/transactions/{transactionId}/events
Autenticação: Nível de agente
Disponibilidade: Somente sandbox/staging — este endpoint não existe em produção.
curl --request POST \
--url https://{FQDN}/organizations/$TENANT/fx/transactions/$TRANSACTION_ID/events \
--header 'Content-Type: application/json' \
--header "x-api-key: $API_KEY" \
--header "x-agent-id: $AGENT_ID" \
--header "x-agent-api-key: $AGENT_KEY" \
--data '{
"event": "payment_authorized",
"message": "Optional description"
}'
Eventos Disponíveis
| Evento | Válido a partir do estado | O que simula |
|---|---|---|
payment_authorized | WaitingChallenge3ds | O callback 3DS do gateway. Retoma o fluxo — despacha a integração de payout. Use quando a transação está presa aguardando o 3DS. |
ach_settled | WaitingSettlement | O callback de liquidação ACH. Move a transação por PaymentSettled → PaymentCaptured e dispara a confirmação do payout. |
payment_captured | ReviewApproved | Uma confirmação de captura de cartão. Dispara a confirmação do payout. |
payout_paid | PayoutAccepted, PayoutReleased, WaitingPayout | A rede de payout confirmando que o beneficiário recebeu os fundos. Move a transação para Paid → Completed. |
payout_void | PayoutAccepted, PayoutHold, PayoutReleased, WaitingPayout | A rede de payout anulando a transação. Dependendo da configuração do tenant, reverte automaticamente ou fica parada em PendingReversalApproval. |
hold_released | PayoutHold | A rede de payout liberando uma retenção de conformidade. Retoma o fluxo. |
cancelled | Qualquer estado cancelável | Cancelamento iniciado pelo cliente (cancela o pagamento via void e cancela o payout). |
refunded | Estados reembolsáveis | Marca a transação como reembolsada. |
Se a transação não estiver em um estado válido para o evento, o endpoint retorna um erro explicando o estado atual.
Fluxo de Teste Típico (Cartão + 3DS)
- Crie a transação → status
WaitingChallenge3ds,paymentStatus: ActionRequired - Force o 3DS:
{ "event": "payment_authorized" } - A transação progride automaticamente →
PayoutAccepted→ManualReview→ReviewApproved→PaymentCaptured→WaitingPayout - Force a entrega:
{ "event": "payout_paid" } - A transação chega a
Completed
Fluxo de Teste Típico (ACH)
- Crie a transação → progride para
WaitingSettlement - Force a liquidação:
{ "event": "ach_settled" } - A transação progride automaticamente →
PaymentSettled→PaymentCaptured→WaitingPayout - Force a entrega:
{ "event": "payout_paid" } - A transação chega a
Completed
Cenários de Teste de Conformidade
Determinados valores nos dados do remetente disparam comportamentos específicos de conformidade no sandbox:
| Parâmetro | Valor | Resultado | Status de Conformidade | Status do Payout |
|---|---|---|---|---|
address.zipcode | 99999 | Transação REJEITADA | Rejected | Cancelled |
phoneNumber | +14155550000 | Transação REJEITADA | Rejected | Cancelled |
firstName + lastName | BLOCK LIST MATCH | Transação REJEITADA | Rejected | Cancelled |
firstName + lastName | OFAC MATCH | Transação retida para verificação | Pending | Pending (status PayoutHold) |
Retenção na Rede de Payout
Use o nome de remetente JULIO SOLANO para disparar uma retenção de conformidade na rede de payout:
{ "firstName": "JULIO", "lastName": "SOLANO", "...": "..." }
A transação chega a PayoutHold após a integração de payout. Libere-a com o evento forçado hold_released (ou ela é liberada pela rede/backoffice).
Fluxo esperado:
... → ProcessingPayout → PayoutHold → [hold released] → PayoutReleased → ...
Rejeição na Rede de Payout (Dados do Recebedor Ausentes)
Use o zipcode 96738 no endereço de cobrança do remetente para disparar uma falha de validação de dados do recebedor na rede de payout:
{ "address": { "zipcode": "96738", "...": "..." } }
A rejeição depende de dados do beneficiário ausentes (país, cidade, estado). Se o destinatário tiver dados de endereço completos, a transação é aceita independentemente do zipcode.
Recusa de Pagamento
Use um token de cartão que o sandbox do gateway rejeite, ou um token expirado. A transação chega a PaymentDeclined → Cancelled.
Recusa no 3DS
Ao ser redirecionado para a página de challenge 3DS, escolha "Decline" (quando o sandbox oferece essa opção). O gateway reporta a falha e a transação passa a PaymentDeclined → Cancelled.
Cartões de Teste
Use os cartões de teste do sandbox para simular cenários de 3DS. A lista completa está em Cartões de teste do Payments Gateway. Os mais comuns:
| Número do Cartão | Bandeira | Comportamento 3DS |
|---|---|---|
4462030000000000 | VISA | Challenge 3DS |
4035874000424977 | VISA | Frictionless (sem challenge) |
5425230000004415 | Mastercard | Challenge 3DS |
4000000000000002 | VISA | Recusado |
Tokenize-os via SDK do gateway e depois passe o token como
paymentMethod.tokenao criar uma conta de financiamento.
Polling de Status
Depois de criar uma transação, faça polling em GET /organizations/{tenant}/fx/transactions/{transactionId} e observe:
| Campo | O que esperar |
|---|---|
complianceStatus | Pending → Approved (após a integração de payout) |
payoutStatus | Pending → Processing → Completed |
paymentStatus | ActionRequired → null (após a conclusão do 3DS) |
receipt | Divulgações regulatórias (disponíveis desde a criação) |
Para a trilha de auditoria completa das transições, use GET /fx/transactions/{transactionId}/status — veja Transação. Em produção, prefira webhooks em vez de polling.
