Skip to main content

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

CampoValor
Banco0001 (Banco Central de Venezuela)
Teléfono4145223698
CédulaV15854963
OTP12345678

Pago Móvil Rechazado

CampoValor
Banco0001 (Banco Central de Venezuela)
Teléfono4121234597
CédulaV12345708
OTP12345678

Pago Móvil Pendiente

CampoValor
CédulaV8866332211
Teléfono4227786632
OTP12345678

Escenarios de Prueba

EscenarioDatos a UsarResultado Esperado
Pago exitosoDatos “Aceptado”Webhook payment.succeeded
Pago fallidoDatos “Rechazado”Webhook payment.failed
Pago pendienteDatos “Pendiente”Estado pending, webhook posterior
Sesión expiradaEsperar 60+ minutoscheckout.session.expired
CancelaciónClick en “Cancelar”Redirect a cancelUrl

Herramientas de Testing

webhook.site

Ideal para ver los webhooks que envía Cobrix:
1

Crear URL temporal

Ve a webhook.site y copia tu URL única
2

Configurar en Cobrix

Usa esa URL como endpoint de webhook en el panel de Cobrix
3

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)