Ir al contenido

Modo Sandbox

El modo Sandbox es un entorno de pruebas por cliente que permite hacer llamadas reales a la API, recibir respuestas con formato real, y probar el flujo completo de webhooks — sin mover dinero real ni crear transacciones.

Un administrador de Rivopay establece tu status de cliente a SANDBOX. Para pasar a producción, deberás completar un conjunto de pruebas que validen tu integración antes de que tu status cambie a ACTIVE.

Cliente con status SANDBOX
Authorizer lee client.status === 'SANDBOX'
→ isSandbox: true (pasa en el contexto del request)
Handler (payin/payout)
→ getProvider(cuenta, isSandbox=true)
→ El provider usa mockRequest() internamente
Respuesta idéntica a producción:
{ txId, qrCode, copiaECola, estimatedFees, ... }
(datos simulados pero con formato real)
TX guardada en la DB con sandbox: true
Status: PENDING — queda esperando simulación
OperaciónMock devuelto
POST /v1/br/payin/pix/instantQR code fake con formato real, expiresAt en 30 min
GET /v1/br/payin/pix/{txId}status: PENDING
POST /v1/br/payout/pix/keyid: mock-payout-{timestamp}, status: PROCESSING
GET /v1/br/payout/pix/{txId}status: PROCESSING

Como no existe una transacción real, el webhook de confirmación nunca llega automáticamente. Para completar el flujo usa el endpoint de simulación:

POST /v1/sandbox/simulate/{txId}

{ "outcome": "completed" }
{ "outcome": "failed" }

El campo outcome es opcional — por defecto es "completed".

Lo que hace internamente:

1. Busca la TX en la base de datos
2. Verifica que sandbox: true → si no, 400
3. Verifica que status sea PENDING o PROCESSING → si no, 409
4. Actualiza TX → COMPLETED o FAILED
5. Si outcome=completed y tipo=PAYIN:
→ Acredita el saldo y registra el movimiento contable
→ Acredita el balance del cliente en el ledger
6. Dispara webhook al webhookUrl del cliente:
→ payin.completed / payin.failed
→ payout.completed / payout.failed
→ Payload incluye sandbox: true
7. Responde: { simulated: true, txId, outcome, status }
1. POST /v1/br/payin/pix/instant
← { txId: "abc123", qrCode: "00020126...", status: "PENDING" }
2. (muestras el QR — nadie paga en realidad)
3. POST /v1/sandbox/simulate/abc123
Body: { "outcome": "completed" }
← { simulated: true, status: "COMPLETED" }
4. → Tu webhookUrl recibe:
{
"eventType": "payin.completed",
"txId": "abc123",
"amount": 10000,
"feeCharged": 300,
"netAmount": 9700,
"sandbox": true
}
5. GET /v1/br/payin/pix/abc123
← { status: "COMPLETED", feeClient: 300, ... }
SituaciónComportamiento
Simular TX de producción (sandbox: false)400 Only sandbox transactions can be simulated
Simular TX ya COMPLETED409 Cannot simulate: transaction is already COMPLETED
Cliente con status SUSPENDED401 — el authorizer rechaza el request
Cliente pasa a status ACTIVEisSandbox = false automáticamente — transacciones reales
Variable MOCK=true en el entorno (staging global)Todos los clientes usan mock independientemente de su status