🧪 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
| Pasarela | Numero de tarjeta | Resultado |
|---|---|---|
| Stripe | 4242 4242 4242 4242 | Pago exitoso |
| Stripe | 4000 0000 0000 0002 | Pago rechazado |
| Stripe | 4000 0025 0000 3155 | Requiere autenticacion 3DS |
| PayPal | 4111 1111 1111 1111 | Pago exitoso (sandbox) |
| Redsys | 4548 8120 4940 0004 | Pago exitoso |
| Redsys | 4548 8120 4940 0004 (CVC 666) | Pago rechazado |
| Braintree | 4111 1111 1111 1111 | Pago exitoso |
| Braintree | 4000 1111 1111 1115 | Rechazado (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
| Error | Causa probable | Solucion |
|---|---|---|
| Cart already ordered | validateOrder() llamado dos veces | Verificar $cart->orderExists() antes de llamar |
| Secure key mismatch | El cliente no coincide con el carrito | Comparar $customer->secure_key con el parametro |
| Payment method not available | hookPaymentOptions no registrado | Verificar que el hook esta activo y el modulo habilitado |
| Order confirmation redirect loop | La URL de confirmacion regenera el carrito | Limpiar el carrito en session despues de validateOrder() |
| Webhook signature invalid | El secret del webhook no coincide | Verificar el secret en la configuracion del modulo |
#Checklist de QA antes de produccion
| Prueba | Estado |
|---|---|
| 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.