Testing en Sandbox
El ambiente de Sandbox te permite probar toda la integración sin procesar pagos reales.
URL Base de Sandbox
https://sandbox-api.cobrix.co/api
URL de Checkout Sandbox
https://sandbox.cobrix.co/checkout/{token}
Datos de Prueba - Pago Móvil
En el ambiente de Sandbox puedes simular diferentes escenarios de Pago Móvil:
Pago Móvil Aceptado
| Campo | Valor |
|---|
| Banco | 0001 (Banco Central de Venezuela) |
| Teléfono | 4145223698 |
| Cédula | V15854963 |
| OTP | 12345678 |
Pago Móvil Rechazado
| Campo | Valor |
|---|
| Banco | 0001 (Banco Central de Venezuela) |
| Teléfono | 4121234597 |
| Cédula | V12345708 |
| OTP | 12345678 |
Pago Móvil Pendiente
| Campo | Valor |
|---|
| Cédula | V8866332211 |
| Teléfono | 4227786632 |
| OTP | 12345678 |
Escenarios de Prueba
| Escenario | Datos a Usar | Resultado Esperado |
|---|
| Pago exitoso | Datos “Aceptado” | Webhook payment.succeeded |
| Pago fallido | Datos “Rechazado” | Webhook payment.failed |
| Pago pendiente | Datos “Pendiente” | Estado pending, webhook posterior |
| Sesión expirada | Esperar 60+ minutos | checkout.session.expired |
| Cancelación | Click en “Cancelar” | Redirect a cancelUrl |
Herramientas de Testing
webhook.site
Ideal para ver los webhooks que envía Cobrix:
Configurar en Cobrix
Usa esa URL como endpoint de webhook en el panel de Cobrix
Probar
Realiza un pago de prueba y observa el webhook en webhook.site
ngrok
Para exponer tu servidor local a internet:
# Instalar
npm install -g ngrok
# Exponer puerto 3000
ngrok http 3000
# Usar la URL generada
# https://abc123.ngrok.io/webhooks/cobrix
Simular Webhook Manualmente
Puedes enviar webhooks de prueba a tu endpoint:
#!/bin/bash
# Configuración
SECRET="whsec_tu_secret"
ENDPOINT="http://localhost:3000/webhooks/cobrix"
# Timestamp actual
TIMESTAMP=$(date +%s)
# Payload de prueba
PAYLOAD='{
"id": "evt_test_'$(date +%s)'",
"event": "payment.succeeded",
"created_at": "'$(date -u +%Y-%m-%dT%H:%M:%S.000Z)'",
"data": {
"payment": {
"transactionId": "txn_test_123",
"checkoutSessionId": "cs_test_456",
"status": "succeeded",
"method": "pagoMovil",
"amountMinor": 5000,
"currency": "USD",
"paidAt": "'$(date -u +%Y-%m-%dT%H:%M:%S.000Z)'"
},
"metadata": {
"orderId": "ORD-TEST-001"
}
}
}'
# Calcular firma
SIGNATURE=$(echo -n "${TIMESTAMP}.${PAYLOAD}" | openssl dgst -sha256 -hmac "$SECRET" | cut -d' ' -f2)
# Enviar webhook
curl -X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-H "X-Cobrix-Signature: t=${TIMESTAMP},v1=${SIGNATURE}" \
-H "X-Cobrix-Timestamp: ${TIMESTAMP}" \
-d "$PAYLOAD"
Script de Prueba del Flujo Completo
// test-integration.js
const axios = require('axios');
const API_URL = 'https://sandbox-api.cobrix.co/api';
const ACCESS_TOKEN = process.env.COBRIX_ACCESS_TOKEN;
const COMPANY_ID = process.env.COBRIX_COMPANY_ID;
const client = axios.create({
baseURL: API_URL,
headers: { 'Authorization': `Bearer ${ACCESS_TOKEN}` }
});
async function testIntegration() {
console.log('Iniciando prueba de integración...\n');
try {
// Paso 1: Resolver cliente
console.log('1. Resolviendo cliente...');
const { data: customer } = await client.post('/checkout/resolve-customer', {
companyId: COMPANY_ID,
email: `test-${Date.now()}@ejemplo.com`,
name: 'Cliente de Prueba'
});
console.log(` Cliente: ${customer.companyCustomerId} (nuevo: ${customer.isNew})\n`);
// Paso 2: Crear sesión
console.log('2. Creando sesión de checkout...');
const { data: session } = await client.post('/checkout/session', {
companyId: COMPANY_ID,
companyCustomerId: customer.companyCustomerId,
amountMinor: 5000,
currency: 'USD',
successUrl: 'https://ejemplo.com/success',
cancelUrl: 'https://ejemplo.com/cancel'
});
console.log(` Sesión creada: ${session.sessionId}`);
console.log(` Checkout URL: https://sandbox.cobrix.co/checkout/${session.token}\n`);
console.log('Prueba completada exitosamente!');
console.log('\nResumen:');
console.log(` - Customer ID: ${customer.companyCustomerId}`);
console.log(` - Session ID: ${session.sessionId}`);
console.log(` - Checkout URL: https://sandbox.cobrix.co/checkout/${session.token}`);
} catch (error) {
console.error('Error:', error.response?.data || error.message);
process.exit(1);
}
}
testIntegration();
Ejecutar:
COBRIX_ACCESS_TOKEN=xxx COBRIX_COMPANY_ID=xxx node test-integration.js
Verificar Configuración de Webhook
// test-webhook-endpoint.js
const crypto = require('crypto');
const axios = require('axios');
const WEBHOOK_URL = 'http://localhost:3000/webhooks/cobrix';
const WEBHOOK_SECRET = process.env.COBRIX_WEBHOOK_SECRET;
async function testWebhook() {
const timestamp = Math.floor(Date.now() / 1000);
const payload = JSON.stringify({
id: `evt_test_${timestamp}`,
event: 'payment.succeeded',
created_at: new Date().toISOString(),
data: {
payment: {
transactionId: 'txn_test',
status: 'succeeded',
method: 'pagoMovil',
amountMinor: 5000,
currency: 'USD'
}
}
});
const signature = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(`${timestamp}.${payload}`)
.digest('hex');
try {
const response = await axios.post(WEBHOOK_URL, payload, {
headers: {
'Content-Type': 'application/json',
'X-Cobrix-Signature': `t=${timestamp},v1=${signature}`,
'X-Cobrix-Timestamp': timestamp.toString()
}
});
console.log('Webhook recibido correctamente');
console.log('Response:', response.data);
} catch (error) {
console.error('Error:', error.response?.status, error.response?.data);
}
}
testWebhook();
Checklist de Testing
Antes de solicitar certificación, verifica:
Crear sesión de checkout funciona
Resolver cliente funciona (nuevo y existente)
URL de checkout carga correctamente
Pago Móvil con datos “Aceptado” completa exitosamente
Pago Móvil con datos “Rechazado” falla correctamente
Webhook payment.succeeded se procesa
Webhook payment.failed se maneja
Verificación de firma funciona
Idempotencia implementada (procesar mismo webhook 2 veces)
Timeout de firma funciona (webhook con timestamp viejo)