Intégrer Yappy dans un commerce panaméen, c'est bien plus qu'ajouter un bouton de paiement. Il faut un flux clair, un montant signé côté serveur, des états qui survivent aux interruptions de l'utilisateur, et un backend capable d'expliquer pourquoi une commande est payée ou non.
Cet article décrit le modèle backend-first avec Laravel et, lorsque le front est WordPress ou WooCommerce, laisse le CMS comme vitrine et interface de checkout tout en déplaçant la logique sensible hors du thème. S'applique aux intégrations Yappy, BAC Credomatic, Paguelo Fácil et passerelles unifiées.
Yappy en pratique
Yappy (Banco General) est un moyen de paiement très utilisé au Panama. Dans les intégrations commerciales typiques :
- Inscription du commerce et credentials (
merchantId/ secret) sur le portail commercial. - Génération d'une URL ou intention de paiement depuis le serveur.
- L'utilisateur finalise le paiement dans le flux Yappy (app / redirect).
- Le système reçoit le résultat via redirect + notification endpoint et met à jour la commande.
Règle d'or : le paiement naît dans le backend
Avant d'afficher le bouton côté front, le serveur doit :
- Créer ou récupérer la commande avec articles, devise et taxes.
- Calculer le total côté serveur (ne jamais faire confiance au JSON du navigateur).
- Enregistrer un paiement en état
pendingavec unorder_idinterne. - Demander à Yappy l'URL / token de paiement avec ces montants.
- Rediriger ou renvoyer au front uniquement ce qui est nécessaire pour continuer.
WordPress / WooCommerce sans polluer le thème
Sur des sites WordPress avec Elementor, thèmes sur mesure ou WooCommerce, les secrets ne doivent pas se trouver dans functions.php ni dans des snippets du page builder.
Modèle recommandé :
- WooCommerce crée la commande locale.
- Un endpoint ou plugin léger appelle l'API Laravel (passerelle).
- Laravel communique avec Yappy / BAC / Paguelo Fácil.
- WordPress reflète l'état lorsque le backend confirme.
Implémentation Laravel
- Modèles
Order+Paymentavec états normalisés. - Service
PaymentGatewayavec adapters derrière une interface. - Endpoint protégé pour démarrer le paiement : valide le panier, calcule le total, persiste
pending. - Endpoint callback/IPN : vérifie la signature, est idempotent, dispatch un job de réconciliation.
- Page de retour qui consulte l'état en DB ; ne marque pas
paidvia query string. - File d'attente pour les retries quand la banque notifie tard.
- Secrets uniquement dans l'env de l'hôte (Coolify : variables du service, pas de
.envdans Git).
États normalisés
| État interne | Signification |
|---|---|
pending | Intention créée ; pas de confirmation fiable |
paid | Paiement confirmé par callback/validation de signature |
rejected | Rejeté par le fournisseur |
cancelled | L'utilisateur a abandonné |
expired | Timeout opérationnel |
Checklist technique
- Credentials uniquement dans les variables d'environnement.
- Sandbox et production séparés.
- Idempotence : le même
order_idne crée pas deux prélèvements. - Persister le payload pour l'audit.
- Valider ce que le fournisseur renvoie.
- Jobs pour les retries de réconciliation.
- Logs sans secrets ni données de carte.
- Page de résultat qui interroge le backend.
- Healthcheck et workers actifs au déploiement.
- Runbook de rotation des secrets et retraitement IPN.
Erreurs fréquentes en production
- Confirmer une vente uniquement parce que l'utilisateur est arrivé sur
/pago-exitoso. - Laisser le secret dans un plugin WordPress versionné dans Git.
- Mélanger la logique Yappy, BAC et Paguelo Fácil dans un seul
ifgéant. - Oublier le cas « l'utilisateur a payé et fermé l'app » sans callback.
- Déployer avec
latestet des secrets intégrés dans l'image Docker.
Cette intégration est liée à Docker, CI/CD et Coolify, l'audit de sécurité et les paiements en ligne .