Inyo

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

EventoVálido a partir do estadoO que simula
payment_authorizedWaitingChallenge3dsO callback 3DS do gateway. Retoma o fluxo — despacha a integração de payout. Use quando a transação está presa aguardando o 3DS.
ach_settledWaitingSettlementO callback de liquidação ACH. Move a transação por PaymentSettledPaymentCaptured e dispara a confirmação do payout.
payment_capturedReviewApprovedUma confirmação de captura de cartão. Dispara a confirmação do payout.
payout_paidPayoutAccepted, PayoutReleased, WaitingPayoutA rede de payout confirmando que o beneficiário recebeu os fundos. Move a transação para PaidCompleted.
payout_voidPayoutAccepted, PayoutHold, PayoutReleased, WaitingPayoutA rede de payout anulando a transação. Dependendo da configuração do tenant, reverte automaticamente ou fica parada em PendingReversalApproval.
hold_releasedPayoutHoldA rede de payout liberando uma retenção de conformidade. Retoma o fluxo.
cancelledQualquer estado cancelávelCancelamento iniciado pelo cliente (cancela o pagamento via void e cancela o payout).
refundedEstados reembolsáveisMarca 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)

  1. Crie a transação → status WaitingChallenge3ds, paymentStatus: ActionRequired
  2. Force o 3DS: { "event": "payment_authorized" }
  3. A transação progride automaticamente → PayoutAcceptedManualReviewReviewApprovedPaymentCapturedWaitingPayout
  4. Force a entrega: { "event": "payout_paid" }
  5. A transação chega a Completed

Fluxo de Teste Típico (ACH)

  1. Crie a transação → progride para WaitingSettlement
  2. Force a liquidação: { "event": "ach_settled" }
  3. A transação progride automaticamente → PaymentSettledPaymentCapturedWaitingPayout
  4. Force a entrega: { "event": "payout_paid" }
  5. 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âmetroValorResultadoStatus de ConformidadeStatus do Payout
address.zipcode99999Transação REJEITADARejectedCancelled
phoneNumber+14155550000Transação REJEITADARejectedCancelled
firstName + lastNameBLOCK LIST MATCHTransação REJEITADARejectedCancelled
firstName + lastNameOFAC MATCHTransação retida para verificaçãoPendingPending (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 PaymentDeclinedCancelled.

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 PaymentDeclinedCancelled.


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ãoBandeiraComportamento 3DS
4462030000000000VISAChallenge 3DS
4035874000424977VISAFrictionless (sem challenge)
5425230000004415MastercardChallenge 3DS
4000000000000002VISARecusado

Tokenize-os via SDK do gateway e depois passe o token como paymentMethod.token ao 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:

CampoO que esperar
complianceStatusPendingApproved (após a integração de payout)
payoutStatusPendingProcessingCompleted
paymentStatusActionRequirednull (após a conclusão do 3DS)
receiptDivulgaçõ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.