Pruebas en Sandbox
El sandbox le permite llevar una transacción a través de todo su ciclo de vida sin movimiento real de dinero. Dos herramientas lo hacen posible: datos de prueba que activan comportamientos de cumplimiento específicos, y un endpoint de forzado de eventos que simula los callbacks externos (webhooks del gateway, notificaciones de la red de payout) que normalmente hacen avanzar una transacción.
Forzar transiciones de estado
Endpoint: POST /organizations/{tenant}/fx/transactions/{transactionId}/events
Autenticación: Nivel de agente
Disponibilidad: Solo sandbox/staging — este endpoint no existe en producción.
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 disponibles
| Evento | Válido desde el estado | Qué simula |
|---|---|---|
payment_authorized | WaitingChallenge3ds | El callback 3DS del gateway. Reanuda el flujo — despacha la integración del payout. Úselo cuando la transacción esté atascada esperando el 3DS. |
ach_settled | WaitingSettlement | El callback de liquidación ACH. Mueve la transacción a través de PaymentSettled → PaymentCaptured y activa la confirmación del payout. |
payment_captured | ReviewApproved | Una confirmación de captura de tarjeta. Activa la confirmación del payout. |
payout_paid | PayoutAccepted, PayoutReleased, WaitingPayout | La red de payout confirmando que el beneficiario recibió los fondos. Mueve la transacción a Paid → Completed. |
payout_void | PayoutAccepted, PayoutHold, PayoutReleased, WaitingPayout | La red de payout anulando la transacción. Según la configuración del tenant, se revierte automáticamente o queda en PendingReversalApproval. |
hold_released | PayoutHold | La red de payout liberando una retención de cumplimiento. Reanuda el flujo. |
cancelled | Cualquier estado cancelable | Cancelación iniciada por el cliente (anula el pago y cancela el payout). |
refunded | Estados reembolsables | Marca la transacción como reembolsada. |
Si la transacción no está en un estado válido para el evento, el endpoint devuelve un error explicando el estado actual.
Flujo de prueba típico (Tarjeta + 3DS)
- Cree la transacción → estado
WaitingChallenge3ds,paymentStatus: ActionRequired - Fuerce el 3DS:
{ "event": "payment_authorized" } - La transacción progresa automáticamente →
PayoutAccepted→ManualReview→ReviewApproved→PaymentCaptured→WaitingPayout - Fuerce la entrega:
{ "event": "payout_paid" } - La transacción llega a
Completed
Flujo de prueba típico (ACH)
- Cree la transacción → progresa a
WaitingSettlement - Fuerce la liquidación:
{ "event": "ach_settled" } - La transacción progresa automáticamente →
PaymentSettled→PaymentCaptured→WaitingPayout - Fuerce la entrega:
{ "event": "payout_paid" } - La transacción llega a
Completed
Escenarios de prueba de cumplimiento
Ciertos valores en los datos del remitente activan comportamientos de cumplimiento específicos en el sandbox:
| Parámetro | Valor | Resultado | Estado de cumplimiento | Estado del payout |
|---|---|---|---|---|
address.zipcode | 99999 | Transacción RECHAZADA | Rejected | Cancelled |
phoneNumber | +14155550000 | Transacción RECHAZADA | Rejected | Cancelled |
firstName + lastName | BLOCK LIST MATCH | Transacción RECHAZADA | Rejected | Cancelled |
firstName + lastName | OFAC MATCH | Transacción retenida para verificación | Pending | Pending (estado PayoutHold) |
Retención en la red de payout
Use el nombre de remitente JULIO SOLANO para activar una retención de cumplimiento en la red de payout:
{ "firstName": "JULIO", "lastName": "SOLANO", "...": "..." }
La transacción llega a PayoutHold después de la integración del payout. Libérela con el evento forzado hold_released (o la libera la red/backoffice).
Flujo esperado:
... → ProcessingPayout → PayoutHold → [hold released] → PayoutReleased → ...
Rechazo en la red de payout (datos del receptor faltantes)
Use el código postal 96738 en la dirección de facturación del remitente para activar una falla de validación de datos del receptor en la red de payout:
{ "address": { "zipcode": "96738", "...": "..." } }
El rechazo depende de que falten datos del beneficiario (país, ciudad, estado). Si el destinatario tiene datos de dirección completos, la transacción se acepta sin importar el código postal.
Rechazo del pago
Use un token de tarjeta que el sandbox del gateway rechace, o un token vencido. La transacción llega a PaymentDeclined → Cancelled.
Rechazo de 3DS
Cuando sea redirigido a la página de desafío 3DS, elija "Decline" (donde el sandbox lo ofrezca). El gateway reporta la falla y la transacción pasa a PaymentDeclined → Cancelled.
Tarjetas de prueba
Use tarjetas de prueba del sandbox para simular escenarios de 3DS. La lista completa está en tarjetas de prueba del Payments Gateway. Las más comunes:
| Número de tarjeta | Marca | Comportamiento 3DS |
|---|---|---|
4462030000000000 | VISA | Desafío 3DS |
4035874000424977 | VISA | Sin fricción (sin desafío) |
5425230000004415 | Mastercard | Desafío 3DS |
4000000000000002 | VISA | Rechazada |
Tokenícelas mediante el SDK del gateway, luego pase el token como
paymentMethod.tokenal crear una cuenta de fondeo.
Consulta de estado por polling
Después de crear una transacción, consulte GET /organizations/{tenant}/fx/transactions/{transactionId} y observe:
| Campo | Qué esperar |
|---|---|
complianceStatus | Pending → Approved (después de la integración del payout) |
payoutStatus | Pending → Processing → Completed |
paymentStatus | ActionRequired → null (después de que el 3DS se completa) |
receipt | Divulgaciones regulatorias (disponibles desde la creación) |
Para el rastro de auditoría completo de transiciones, use GET /fx/transactions/{transactionId}/status — vea Transacción. En producción, prefiera los webhooks en lugar del polling.
