Module de paiement intégrant la passerelle CAWL Solutions / Worldline pour Thelia 2.6. Supporte plus de 30 méthodes de paiement incluant les cartes bancaires, portefeuilles numériques, virements et paiement fractionné.
- Fonctionnalités
- Prérequis
- Installation
- Configuration
- Méthodes de paiement supportées
- Test du module
- Intégration Frontend
- API OpenAPI
- Dépannage
- Sécurité
- Changelog
- Support
- 30+ méthodes de paiement : Cartes (Visa, Mastercard, CB, Amex), PayPal, Apple Pay, Google Pay, Klarna, Bancontact, iDEAL, etc.
- Environnement Test/Production : Basculement facile entre les modes
- Hosted Checkout : Page de paiement sécurisée hébergée par Worldline
- Webhooks : Notifications de paiement en temps réel avec validation de signature HMAC-SHA256
- Multi-langue : FR, EN, ES, IT, DE
- Compatible OpenAPI : Intégration native avec le module OpenApi de Thelia
- Logs détaillés : Journalisation configurable pour le débogage
- Dashboard de test : Interface d'administration pour tester l'API
- Thelia : Version 2.6.x
- PHP : 8.2 ou supérieur
- Extensions PHP : curl, json, openssl
- SDK Worldline :
online-payments/sdk-php: ^5.0(installé via Composer) - Compte CAWL Solutions : Identifiants API (PSPID, API Key, API Secret)
composer require cawl/thelia-payment
composer require online-payments/sdk-php:^5.0-
Télécharger le module et le placer dans
local/modules/CawlPayment/ -
Installer le SDK Worldline :
composer require online-payments/sdk-php:^5.0- Activer le module via la CLI Thelia :
php Thelia module:activate CawlPayment- Vider le cache :
rm -rf var/cache/*local/modules/CawlPayment/
├── Config/
│ ├── config.xml # Services et configuration
│ ├── module.xml # Métadonnées du module
│ ├── routing.xml # Routes
│ ├── schema.xml # Schéma BDD Propel
│ └── TheliaMain.sql # Script SQL d'installation
├── Controller/
│ ├── Admin/ # Contrôleurs backoffice
│ └── Front/ # Contrôleurs frontend
├── EventListeners/ # Écouteurs d'événements
├── I18n/ # Traductions (fr_FR, en_US, es_ES, it_IT, de_DE)
├── Model/ # Modèles Propel
├── Service/ # Services (CawlApiService)
├── templates/
│ └── backOffice/ # Templates administration
├── CawlPayment.php # Classe principale du module
└── README.md # Cette documentation
Accédez à la configuration via : Administration > Modules > CawlPayment > Configurer
Sélectionnez l'environnement actif :
- Test : Pour les développements et tests (sandbox Worldline)
- Production : Pour les transactions réelles
Votre identifiant marchand CAWL Solutions. Cet identifiant est fourni lors de la création de votre compte.
| Champ | Description |
|---|---|
| Test API Key | Clé API pour l'environnement de test |
| Test API Secret | Secret API pour l'environnement de test |
| Test Webhook Key | Clé webhook pour l'environnement de test |
| Test Webhook Secret | Secret webhook pour valider les notifications |
| Champ | Description |
|---|---|
| Production API Key | Clé API pour l'environnement de production |
| Production API Secret | Secret API pour l'environnement de production |
| Production Webhook Key | Clé webhook pour l'environnement de production |
| Production Webhook Secret | Secret webhook pour valider les notifications |
Important : Ne jamais utiliser les identifiants de test en production et vice-versa.
Cliquez sur le bouton "Tester la connexion" pour vérifier que vos identifiants sont corrects. Un message de succès ou d'erreur s'affichera.
Sélectionnez les méthodes de paiement à proposer à vos clients. Les méthodes sont chargées dynamiquement depuis l'API CAWL en fonction de votre contrat.
| Catégorie | Méthodes |
|---|---|
| Cartes bancaires | Visa, Mastercard, CB, American Express, Maestro, JCB, Diners Club |
| Portefeuilles | PayPal, Apple Pay, Google Pay, WeChat Pay, Alipay |
| Virements bancaires | iDEAL, Bancontact, Giropay, EPS, Przelewy24, Sofort, SEPA |
| Paiement fractionné | Klarna (Pay Now, Pay Later, Slice It), Oney 3x/4x |
| Titres restaurant | Edenred, Sodexo, Up Déjeuner |
- Activer les logs : Active l'enregistrement des requêtes/réponses API dans
var/log/cawlpayment.log
Attention : Désactivez les logs en production pour des raisons de performance et de confidentialité.
| Option | Description |
|---|---|
| Montant minimum | Montant minimum pour utiliser ce mode de paiement (0 = pas de minimum) |
| Montant maximum | Montant maximum autorisé (0 = pas de maximum) |
Les webhooks permettent de recevoir les notifications de paiement en temps réel (confirmation, échec, remboursement, etc.).
https://votre-site.com/cawlpayment/webhook
- Connectez-vous au Portail Marchand CAWL (test) ou Production
- Allez dans Configuration > Webhooks
- Ajoutez l'URL du webhook de votre site
- Copiez la Webhook Key et le Webhook Secret générés
- Collez-les dans la configuration du module Thelia
payment.created- Paiement initiépayment.pending_capture- En attente de capturepayment.captured- Paiement capturépayment.cancelled- Paiement annulépayment.rejected- Paiement rejetépayment.refunded- Remboursement effectué
Pour renforcer la sécurité des webhooks, vous pouvez activer une whitelist d'adresses IP autorisées. Seules les requêtes provenant des IP listées seront acceptées.
| Option | Description |
|---|---|
| Activer la whitelist | Active/désactive la vérification des IP sources |
| Liste des IP autorisées | Liste des adresses IP séparées par des virgules |
IP Worldline à autoriser :
# Environnement de test (preprod)
91.208.214.0/24
185.8.52.0/22
# Environnement de production
91.208.214.0/24
185.8.52.0/22
Note : La whitelist IP est une couche de sécurité supplémentaire. La validation de signature HMAC-SHA256 reste la méthode principale de vérification.
| Code | Nom | ID Produit |
|---|---|---|
visa |
Visa | 1 |
mastercard |
Mastercard | 3 |
cb |
Carte Bancaire | 130 |
amex |
American Express | 2 |
maestro |
Maestro | 117 |
jcb |
JCB | 125 |
diners |
Diners Club | 132 |
| Code | Nom | ID Produit |
|---|---|---|
paypal |
PayPal | 840 |
applepay |
Apple Pay | 302 |
googlepay |
Google Pay | 320 |
wechatpay |
WeChat Pay | 863 |
alipay |
Alipay | 861 |
| Code | Nom | ID Produit | Pays |
|---|---|---|---|
ideal |
iDEAL | 809 | Pays-Bas |
bancontact |
Bancontact | 3012 | Belgique |
giropay |
Giropay | 5408 | Allemagne |
eps |
EPS | 5700 | Autriche |
przelewy24 |
Przelewy24 | 3124 | Pologne |
multibanco |
Multibanco | 5500 | Portugal |
twint |
TWINT | 5600 | Suisse |
| Code | Nom | ID Produit |
|---|---|---|
klarna_paynow |
Klarna Pay Now | 3301 |
klarna_paylater |
Klarna Pay Later | 3302 |
klarna_sliceit |
Klarna Slice It | 3303 |
oney3x |
Oney 3x | 5110 |
oney4x |
Oney 4x | 5111 |
Utilisez ces numéros de carte dans l'environnement de test :
| Carte | Numéro | Date | CVV |
|---|---|---|---|
| Visa | 4012 0000 3333 0026 |
Toute date future | 123 |
| Mastercard | 5399 9999 9999 9999 |
Toute date future | 123 |
| Carte | Numéro | Date | CVV |
|---|---|---|---|
| Visa | 4874 9700 0000 0014 |
Toute date future | 123 |
| Carte | Numéro | Date | CVV | Raison |
|---|---|---|---|---|
| Visa | 4000 0200 0000 0000 |
Toute date future | 123 | Fonds insuffisants |
Depuis l'interface de configuration du module (Administration > Modules > CawlPayment > Configurer), le bouton "Test API Connection" (en haut à droite) permet de vérifier que les identifiants sont corrects et que l'API Worldline est accessible.
La commande cawlpayment:test-transaction permet de créer une transaction sandbox sans passer par le checkout Thelia. Elle vérifie automatiquement la configuration avant de lancer le paiement.
# Montant par défaut : 10,00 EUR
ddev exec php Thelia cawlpayment:test-transaction
# Montant personnalisé (en centimes)
ddev exec php Thelia cawlpayment:test-transaction --amount=4567 --currency=EURLa commande effectue 7 vérifications avant de créer le checkout :
- Environnement Thelia ≠ production
- Module configuré sur "test"
- PSPID configuré
api_key_testconfiguréeapi_secret_testconfiguré- Au moins une méthode de paiement activée
- Connexion API live (appel sandbox)
En cas d'échec, un message indique précisément quelle configuration est manquante.
Après le paiement, Worldline redirige vers l'URL de retour du module. En développement local (DDEV), cette URL n'est pas accessible depuis les serveurs Worldline car *.ddev.site résout sur 127.0.0.1.
Solution : exposer DDEV via ngrok
- Installer ngrok :
sudo snap install ngrok - Créer un compte gratuit sur ngrok.com et récupérer l'authtoken
- Configurer DDEV dans
.ddev/config.yaml:
ngrok_args: --authtoken=<votre-token>- Démarrer le tunnel dans un terminal dédié (laisser tourner) :
ddev share- Copier l'URL publique affichée (ex :
https://xxxx.ngrok-free.app) - Dans Admin > CawlPayment > Configuration > Test Credentials, renseigner cette URL dans le champ "Test return URL base"
- Relancer
cawlpayment:test-transaction
Worldline redirigera vers l'URL ngrok après le paiement. Le résultat (statut, paymentId, isPaid) est enregistré dans var/log/log-thelia.txt avec le préfixe [CawlPayment][test-return].
Note : le plan gratuit ngrok affiche une page d'avertissement à la première visite — cliquer sur "Visit Site" pour continuer.
Depuis Admin > CawlPayment > Configuration > Test Credentials, un panneau "Create a test transaction" permet de lancer un checkout sandbox sans passer par le terminal :
- Saisir le montant en euros et la devise (défaut : 10,00 EUR)
- Cliquer "Create test transaction" — le module vérifie la configuration puis appelle l'API
- Un lien "Open checkout" apparaît avec le
hostedCheckoutId— cliquer pour accéder à la page de paiement Worldline - Après le paiement, utiliser le panneau "Module logs" (juste en dessous) et cliquer "Refresh" pour voir le statut retourné par Worldline (
[CawlPayment][test-return])
Cette interface équivaut à
ddev exec php Thelia cawlpayment:test-transaction --amount=<n> --currency=EURsans quitter le navigateur.
ddev exec php vendor/bin/phpunit --configuration local/modules/CawlPayment/phpunit.xml.dist --testsuite "CawlPayment Test Suite"- Le client sélectionne CawlPayment comme mode de paiement
- Le client choisit sa méthode de paiement (carte, PayPal, etc.)
- Redirection vers la page Hosted Checkout de Worldline
- Le client effectue le paiement
- Redirection vers la page de confirmation Thelia
- Le webhook confirme le statut final du paiement
| Route | URL | Description |
|---|---|---|
| Success | /cawlpayment/success |
Retour après paiement réussi |
| Failure | /cawlpayment/failure |
Retour après échec |
| Cancel | /cawlpayment/cancel |
Retour après annulation |
| Webhook | /cawlpayment/webhook |
Réception des notifications |
Le module s'intègre avec le module OpenApi de Thelia pour exposer les options de paiement.
GET /open_api/payment/module/{moduleId}/options
{
"paymentModuleOptionGroups": [
{
"code": "cawl_payment_methods",
"title": "Choisissez votre moyen de paiement",
"description": "Sélectionnez le moyen de paiement souhaité",
"minimumSelectedOptions": 1,
"maximumSelectedOptions": 1,
"options": [
{
"code": "product_1",
"title": "Visa",
"description": "Visa",
"image": "https://payment.preprod.direct.worldline-solutions.com/...",
"valid": true
}
]
}
]
}POST /cawlpayment/pay/{orderId}/{methodCode}
Cause : Aucune méthode de paiement n'est activée ou les identifiants API sont incorrects.
Solution :
- Vérifiez que le PSPID est configuré
- Testez la connexion API
- Activez au moins une méthode de paiement
Cause : Le secret webhook ne correspond pas ou n'est pas configuré.
Solution :
- Vérifiez que le Webhook Secret est correctement copié depuis le portail CAWL
- Assurez-vous d'utiliser le bon secret (test vs production)
Cause : Le cache Symfony n'est pas à jour.
Solution :
rm -rf var/cache/*Cause : Le webhook n'a pas été reçu ou traité.
Solution :
- Vérifiez l'URL du webhook dans le portail CAWL
- Vérifiez les logs dans
var/log/cawlpayment.log - Assurez-vous que votre serveur accepte les requêtes POST externes
Les logs sont enregistrés dans :
var/log/cawlpayment.log
Format des logs :
[2024-01-15 10:30:00] [CawlPayment] Creating hosted checkout for order #123
[2024-01-15 10:30:01] [CawlPayment] Hosted checkout created: abc123
[2024-01-15 10:32:00] [CawlPayment Webhook] Received webhook notification
[2024-01-15 10:32:00] [CawlPayment Webhook] Order #123 marked as PAID
- Chiffrement AES-256-GCM des credentials API en base de données (
SecureConfigService) - Validation HMAC-SHA256 des webhooks
- Pas d'exposition des erreurs internes aux utilisateurs
- Journalisation sécurisée (pas de credentials dans les logs)
- Injection de dépendances pour les services
- Protection CSRF sur les formulaires admin
- Vérification des permissions admin
- Désactivez les logs en production
- Utilisez HTTPS obligatoirement
- Configurez le Webhook Secret en production
- Limitez les accès au back-office
- Mettez à jour régulièrement le module
Avant de basculer en mode production, vérifier les points suivants :
- Basculer l'environnement sur
productiondans Admin > CawlPayment > Environment - Renseigner les credentials de production (PSPID, API Key, API Secret, Webhook Key, Webhook Secret)
- Vérifier le comportement de capture sur le compte marchand CAWL production :
- Auto-capture activée → le paiement passe directement en
statusCode=9(CAPTURED) après autorisation. Le webhook notifie quasi immédiatement et la commande est confirmée automatiquement. - Capture manuelle → le paiement reste en
statusCode=5(PENDING_CAPTURE) jusqu'à capture explicite depuis le portail marchand. La commande ne sera pas confirmée automatiquement — à adapter selon le process métier. ⚠️ Ce point est critique : un compte en capture manuelle sans process de capture explicite laissera les commandes en attente indéfiniment.
- Auto-capture activée → le paiement passe directement en
- Configurer l'URL webhook dans le portail CAWL production (
https://votre-site.fr/cawlpayment/webhook) - Désactiver les logs (Admin > CawlPayment > Options > Enable logging)
- Tester un paiement réel à faible montant et vérifier le statut dans le portail marchand
Voir CHANGELOG.md pour l'historique complet des versions.
- Interface admin de test : création de transaction sandbox sans terminal
- Viewer de logs
[CawlPayment]avec rafraîchissement en temps réel - Commande console
cawlpayment:test-transactionavec vérifications pré-flight - Support ngrok : champ
test_base_url+ guide d'installation dans l'admin - Fix :
showResultPage(false)pour déclencher la redirection Worldline - Fix :
webhook_keysorti du chiffrement AES (identifiant, pas un secret) - Tests unitaires : CawlApiService, SecureConfigService, webhook, transactions
- Correction compatibilité Thelia 2.6 (services, hooks, routing)
- Migration SDK
online-payments/sdk-phpv5 (DefaultConnection) - Réécriture back-office : Bootstrap 3 natif, suppression CSS custom
- Chiffrement AES-256-GCM des credentials API en base de données
- Version initiale
- Support de 30+ méthodes de paiement
- Intégration Hosted Checkout Worldline
- Support webhooks avec validation signature
- Multi-langue (FR, EN, ES, IT, DE)
- Intégration OpenAPI
Aucun bug connu pour le moment.
Corrigé (voir CHANGELOG
[Unreleased]) — les méthodes de paiement sont désormais filtrées en mode test :createTestHostedCheckout()appliquePaymentProductFiltersà partir des méthodes activées dans Admin > CawlPayment > Payment Methods, comme en production.
Pour toute question ou problème :
- Email : support@cawl-solutions.com
- Documentation Thelia : https://doc.thelia.net/
Ce module est distribué sous licence propriétaire CAWL Solutions.
© 2026 CAWL Solutions - Tous droits réservés.