🧪 Testing de modulos de pago — sandbox y pruebas

Actualizado: 2024-12-01

Antes de activar un modulo de pago en produccion es imprescindible probarlo exhaustivamente en modo sandbox. Cada pasarela de pago tiene su propia API de pruebas con tarjetas y escenarios predefinidos.

#Modo sandbox en el modulo

Implementar modo sandbox con Configuration
php
<?php

class MyPaymentModule extends PaymentModule
{
    // ── Constantes de configuracion ──
    const CONFIG_SANDBOX     = 'MYPAY_SANDBOX';
    const CONFIG_API_KEY     = 'MYPAY_API_KEY';
    const CONFIG_SANDBOX_KEY = 'MYPAY_SANDBOX_KEY';

    // ── Obtener la API key correcta segun el modo ──
    private function getApiKey(): string
    {
        if (Configuration::get(self::CONFIG_SANDBOX)) {
            return (string) Configuration::get(self::CONFIG_SANDBOX_KEY);
        }
        return (string) Configuration::get(self::CONFIG_API_KEY);
    }

    // ── Obtener la URL base de la API ──
    private function getApiBaseUrl(): string
    {
        if (Configuration::get(self::CONFIG_SANDBOX)) {
            return 'https://sandbox.mypaymentgateway.com/api';
        }
        return 'https://api.mypaymentgateway.com/api';
    }

    // ── Mostrar aviso visual en el BO cuando sandbox esta activo ──
    public function getContent(): string
    {
        $output = '';
        if (Configuration::get(self::CONFIG_SANDBOX)) {
            $output .= $this->displayWarning(
                $this->trans('SANDBOX MODE ACTIVE — Do not use in production!', [], 'Modules.Mypayment.Admin')
            );
        }
        // ... resto del getContent()
        return $output;
    }
}

#Tarjetas de prueba estandar

PasarelaNumero de tarjetaResultado
Stripe4242 4242 4242 4242Pago exitoso
Stripe4000 0000 0000 0002Pago rechazado
Stripe4000 0025 0000 3155Requiere autenticacion 3DS
PayPal4111 1111 1111 1111Pago exitoso (sandbox)
Redsys4548 8120 4940 0004Pago exitoso
Redsys4548 8120 4940 0004 (CVC 666)Pago rechazado
Braintree4111 1111 1111 1111Pago exitoso
Braintree4000 1111 1111 1115Rechazado (fondos insuficientes)

#Simular webhooks de pago

Simular webhook con curl y con Stripe CLI
bash
# ── Simular webhook con curl ──
curl -X POST https://mitienda.com/module/mypayment/webhook \
  -H "Content-Type: application/json" \
  -H "X-Signature: sha256=ABC123" \
  -d '{
    "event": "payment.completed",
    "data": {
      "payment_id": "pay_test_123",
      "amount": 9900,
      "currency": "EUR",
      "metadata": {"cart_id": "42"}
    }
  }'

# ── Stripe CLI (recomendado para desarrollo local) ──
stripe listen --forward-to http://localhost/module/mypayment/webhook
stripe trigger payment_intent.succeeded

# ── PayPal IPN Simulator ──
# https://developer.paypal.com/developer/ipnSimulator/

#Errores comunes y solucion

ErrorCausa probableSolucion
Cart already orderedvalidateOrder() llamado dos vecesVerificar $cart->orderExists() antes de llamar
Secure key mismatchEl cliente no coincide con el carritoComparar $customer->secure_key con el parametro
Payment method not availablehookPaymentOptions no registradoVerificar que el hook esta activo y el modulo habilitado
Order confirmation redirect loopLa URL de confirmacion regenera el carritoLimpiar el carrito en session despues de validateOrder()
Webhook signature invalidEl secret del webhook no coincideVerificar el secret en la configuracion del modulo

#Checklist de QA antes de produccion

PruebaEstado
Pago exitoso → pedido creado con estado correcto
Pago fallido → pedido con estado error / sin pedido
Pago pendiente → estado pendiente visible en BO
Email de confirmacion recibido por el cliente
Email de nuevo pedido recibido por el admin
Factura generada correctamente (si aplica)
Doble submit no crea pedido duplicado
Webhook recibido y procesado correctamente
Modo sandbox desactivado antes de ir a produccion
Claves de produccion configuradas
HTTPS activo en la tienda
Prueba con varios importes (0.01, 99.99, 1000+)
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.