Integrar Yappy en un comercio panameño implica más que poner un botón de pago. Necesitas un flujo claro, el monto firmado en el servidor, estados que sobrevivan si el usuario interrumpe el proceso, y un backend que pueda explicar por qué un pedido quedó pagado o no.
Este artículo describe el patrón backend-first con Laravel y, cuando el front es WordPress o WooCommerce, deja el CMS como vitrina y checkout visual, y mueve la lógica sensible fuera del tema. Aplica a integraciones con Yappy, BAC Credomatic, Paguelo Fácil y pasarelas unificadas.
Qué es Yappy en la práctica
Yappy (Banco General) es una forma de cobro muy usada en Panamá. En integraciones comerciales típicas:
- Alta del comercio y credenciales (
merchantId/ secret) en el portal comercial. - Generación de una URL o intención de pago desde el servidor.
- El usuario completa el pago en el flujo de Yappy (app / redirect).
- El sistema recibe el resultado por redirect + notificación al endpoint y actualiza la orden.
Regla de oro: el pago nace en el backend
Antes de mostrar el botón en el front, el servidor debe:
- Crear o recuperar la orden con ítems, moneda e impuestos.
- Calcular el total en servidor (nunca confiar en el JSON del navegador).
- Guardar un registro de pago en estado
pendingconorder_idinterno. - Pedir a Yappy la URL / token de pago con esas cifras.
- Redirigir o devolver al front solo lo necesario para continuar.
WordPress / WooCommerce sin ensuciar el tema
En sitios WordPress con Elementor, temas a medida o WooCommerce, los secretos no deben ir en functions.php ni en snippets del page builder.
Patrón recomendado:
- WooCommerce crea el pedido local.
- Un endpoint o plugin delgado llama a la API Laravel (pasarela).
- Laravel habla con Yappy / BAC / Paguelo Fácil.
- WordPress refleja el estado cuando el backend confirma.
Implementación en Laravel
- Modelo
Order+Paymentcon estados normalizados. - Servicio
PaymentGatewaycon adapters detrás de una interfaz. - Endpoint protegido para iniciar pago: valida carrito, calcula total, persiste
pending. - Endpoint de callback/IPN: verifica firma, es idempotente, despacha job de conciliación.
- Página de retorno que consulta el estado en DB; no marca
paidpor query string. - Cola para reintentos cuando el banco notifica tarde.
- Secrets solo en env del host (Coolify: variables del servicio, no
.enven Git).
Estados normalizados
| Estado interno | Significado |
|---|---|
pending | Intención creada; sin confirmación confiable |
paid | Cobro confirmado por callback/validación de firma |
rejected | Rechazado por el proveedor |
cancelled | El usuario abortó |
expired | Timeout operativo |
Checklist técnico
- Credenciales solo en variables de entorno.
- Sandbox vs producción separados.
- Idempotencia: el mismo
order_idno crea dos cobros. - Persistir payload para auditoría.
- Validar lo que el proveedor envía de vuelta.
- Jobs para reintentos de conciliación.
- Logs sin secretos ni datos de tarjeta.
- Página de resultado que consulta el backend.
- Healthcheck y workers vivos en el deploy.
- Runbook de rotación de secrets y reprocesamiento de IPN.
Errores frecuentes en producción
- Confirmar venta solo porque el usuario llegó a
/pago-exitoso. - Dejar el secret en un plugin de WordPress versionado en Git.
- Mezclar lógica de Yappy, BAC y Paguelo Fácil en un solo
ifgigante. - Olvidar el caso "usuario pagó y cerró la app" sin callback.
- Deploy con
latesty secretos horneados en la imagen Docker.
La integración conecta con Docker, CI/CD y Coolify, auditoría de seguridad y pagos en línea .