Encaisser sur WooCommerce au Maroc
Boutique WooCommerce au Maroc : accepter la carte 3-D Secure et les espèces en agence, par module ChariPay, lien de paiement ou checkout par l'API.
Pour encaisser sur WooCommerce au Maroc, le module ChariPay pour WooCommerce est disponible sur GitHub ; sans installer le module, vous pouvez aussi garder une méthode de paiement hors ligne de WooCommerce, et vos clients règlent la commande sur une page ChariPay — par carte avec 3-D Secure ou en espèces dans une agence Damane Cash, Chaabi Cash, Tasshilat, Barid Cash ou Chari —, en dirhams, avec l'argent disponible à l'instant sur votre compte de paiement. Un lien de paiement envoyé depuis le portail suffit pour démarrer ; pour automatiser, votre serveur crée une session de paiement à chaque commande, et l'API REST de WooCommerce passe la commande « En cours » (processing) dès que le webhook confirme le paiement. Voici les trois étapes, puis les espèces, les remboursements et le rapprochement.
WooPayments au Maroc : la situation
WooPayments, la solution de paiement intégrée proposée par WooCommerce, est réservée aux particuliers et aux entreprises des pays de sa liste officielle, et le Maroc n'y figure pas (liste relue le 2 octobre 2026). Une entreprise établie au Maroc ne peut donc pas s'en servir pour encaisser. WooCommerce embarque en revanche trois méthodes hors ligne, qui ne prennent aucun paiement en ligne : le virement bancaire direct, le paiement par chèque et le paiement à la livraison. ChariPay publie de son côté un module pour WooCommerce, disponible sur GitHub, qui permet à une boutique WooCommerce d'encaisser avec ChariPay. Ce guide décrit les deux voies qui fonctionnent sans installer le module : la passerelle de paiement, ici, c'est la page ChariPay sur laquelle votre client règle sa commande.
Ces méthodes hors ligne suffisent à tout brancher. Chacune se règle avec un titre affiché au client au moment du choix, une description visible s'il la choisit, et des instructions de paiement. Leurs statuts diffèrent, et c'est ce qui compte pour la suite ; nous les citons avec leur slug d'API entre parenthèses, car le libellé affiché dépend de la langue de votre back-office, pas le slug. Avec le virement bancaire direct, comme avec le chèque, WooCommerce met la commande « En attente » (on-hold), le temps que vous confirmiez le paiement. Avec le paiement à la livraison, il la passe « En cours » (processing) jusqu'à l'encaissement, alors que rien n'est encore payé. Pour un paiement ChariPay, le premier comportement est le bon : une commande qui attend sa confirmation, et que vous ne préparez qu'une fois l'argent reçu.
Ce que la page ChariPay apporte à la boutique : la carte — Visa, Mastercard, Maroc Pay — avec 3-D Secure, les espèces en agence pour les clients sans carte, des montants en dirhams, et un compte de paiement au nom de votre entreprise, tenu par Chari Money, établissement de paiement agréé par Bank Al-Maghrib, où chaque paiement réussi est disponible à l'instant. Pour situer WooCommerce parmi les autres façons de vendre en ligne — site sur mesure, Shopify, boutique hébergée —, lisez notre guide du paiement e-commerce au Maroc.
Étape 1 — le lien de paiement dans la commande
Le premier niveau ne touche ni au code de WordPress ni à un serveur, et vous pouvez le répéter avant de l'ouvrir à vos clients : Commencer en mode test. Le parcours, après le clic : trois champs — nom, e-mail professionnel, entreprise —, le lien d'activation reçu par e-mail, puis le choix de votre mot de passe. Dans le portail, votre développeur créera la clé de test de l'étape 2 ; vous, créez un lien de test au montant d'une commande type et réglez-le avec la carte de test 4918 9141 0719 5005 (CVV 123, code 3-D Secure 555). C'est gratuit, sans limite de durée, et aucune validation n'est à attendre : la vérification de votre entreprise (KYB) ne conditionne que le passage en production.
Le circuit tient ensuite en cinq gestes :
- 1Rebaptisez une méthode hors ligne. Dans les réglages de paiement de WooCommerce, activez le virement bancaire direct et donnez-lui un titre qui décrit le vrai parcours — « Carte bancaire ou espèces en agence » — puis, en description : « Après la commande, vous recevez un lien de paiement sécurisé par WhatsApp ou par e-mail. » Laissez vides ses coordonnées bancaires : WooCommerce les afficherait sur la page de confirmation de commande et dans l'e-mail envoyé au client.
- 2La commande arrive « En attente » (`on-hold`). WooCommerce attend votre confirmation de paiement ; le stock, lui, est déjà décompté.
- 3Créez le lien de paiement dans le portail ChariPay, au montant exact, avec « Commande n° 5871 » en description, à usage unique, et une expiration : 24 heures, 7 jours, 30 jours ou une date précise.
- 4Envoyez-le par WhatsApp, par e-mail ou en QR code. Le client paie sur une page hébergée à votre nom et à votre logo : par carte avec 3-D Secure, ou en espèces en agence.
- 5Passez la commande « En cours » (`processing`) quand le portail affiche le lien comme payé. Pour WooCommerce, ce statut signifie que le paiement est reçu et que la commande attend sa préparation ; elle passera « Terminée » (
completed) une fois exécutée.
Ce circuit suffit tant que les commandes arrivent à un rythme que vous suivez à la main, et il sert aussi hors de la boutique : un devis accepté, un acompte, une vente conclue sur WhatsApp. La page Liens de paiement présente les options — QR code, affiche PDF, clients enregistrés —, et le guide lien de paiement ou checkout donne les critères pour passer au niveau suivant. Sur un site vitrine sans WooCommerce, un bouton de paiement fait le même travail : voir bouton de paiement sur un site web.
Étape 2 — le checkout hébergé par session
Le deuxième niveau supprime la création manuelle du lien, toujours sans installer le module : rien ne s'installe dans WordPress. WooCommerce sait déjà prévenir un serveur extérieur et accepter une mise à jour de commande par son API REST ; il suffit d'un petit service, sur votre serveur, entre WooCommerce et ChariPay.
- 1WooCommerce prévient votre serveur. Dans WooCommerce > Réglages > Avancé > Webhooks, ajoutez un webhook sur la création de commande, vers une adresse
https://de votre serveur, avec un secret : WooCommerce s'en sert pour générer une empreinte de chaque livraison, que votre serveur vérifie selon la documentation de WooCommerce. - 2Votre serveur crée une session de paiement pour chaque commande passée avec votre méthode hors ligne.
- 3Le client reçoit le `checkoutUrl` par e-mail ou par WhatsApp, avec vos outils d'envoi habituels, et paie sur le checkout hébergé. Une session n'encaisse que la carte, avec 3-D Secure : pour garder les espèces, votre service crée plutôt un lien de paiement à usage unique (voir plus bas).
La création de la session, en sandbox, avec une clé de test qui ne quitte jamais votre serveur :
curl -X POST 'https://api-psp.charipay.ma/v1/payment-sessions' \
-H 'X-CHARI-PAY-API-KEY: chari_sk_test_...' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: woocommerce-5871-session' \
-d '{
"amount": 250.00,
"orderId": "WC-5871",
"externalId": "woocommerce-5871",
"config": {
"customer": {
"email": "amine.bennani@example.com",
"firstName": "Amine",
"lastName": "Bennani",
"phone": "+212600000000"
},
"urls": {
"accept": "https://votre-boutique.ma/commande/paiement-recu",
"decline": "https://votre-boutique.ma/commande/paiement-refuse",
"notification": "https://api.votre-boutique.ma/webhooks/charipay"
}
},
"metadata": { "source": "woocommerce", "wcOrder": "5871" }
}'La réponse 201 renvoie sessionId, sessionToken, verifyKey, expiresAt et le checkoutUrl à transmettre. Le numéro de commande WooCommerce voyage dans orderId, la référence lisible, renvoyée dans les webhooks sans contrainte d'unicité, et dans externalId, unique par compte et par environnement, qui rend l'appel rejouable — si WooCommerce livre deux fois la même commande, l'API renvoie la session existante en 200 au lieu d'en créer une seconde. Les quatre champs de config.customer sont obligatoires, toute URL déclarée doit être en https://, et metadata — au plus 4 Ko — revient telle quelle dans le webhook de paiement : wcOrder y porte l'identifiant de commande dont l'étape 3 aura besoin. La session est à usage unique et expire par défaut 72 heures après sa création, sauf expiresAt plus court. Le même appel sert en production : seule la clé change, chari_sk_live_… au lieu de chari_sk_test_…. Le module Sessions de paiement détaille chaque champ, et la page checkout hébergé montre l'écran que voit votre client.
Étape 3 — le webhook qui met la commande à jour
La redirection vers votre URL accept dit que le client est revenu, pas qu'il a payé : un client peut payer puis fermer l'onglet, et ne jamais revoir votre boutique. La commande WooCommerce ne passe donc « En cours » qu'à réception du webhook ChariPay. L'événement payment.succeeded arrive sur l'URL de notification de la session avec X-CHARI-SIGNATURE, un HMAC-SHA256 en hexadécimal minuscule calculé sur horodatage + "." + corps brut, et X-CHARI-TIMESTAMP, en millisecondes. La vérification, telle que la documentation de l'API la publie :
const crypto = require('crypto');
function verify(rawBody, signature, timestamp, secret) {
// Fenêtre anti-rejeu de ±5 minutes — l'horodatage est en millisecondes.
if (Math.abs(Date.now() - Number(timestamp)) > 5 * 60 * 1000) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
// Une signature malformée doit répondre false — jamais jeter (500 → retentatives).
if (!/^[0-9a-f]{64}$/i.test(signature)) return false;
// Comparaison en temps constant : jamais `===`.
return crypto.timingSafeEqual(Buffer.from(expected, 'hex'), Buffer.from(signature, 'hex'));
}Autour de cette fonction, votre service fait cinq choses, dans cet ordre :
- 1Il vérifie la signature sur le corps brut, avant tout parsing, et rejette un horodatage décalé de plus de cinq minutes.
- 2Il déduplique sur `Chari-Event-Id` : une même notification peut arriver plusieurs fois ;
Chari-Webhook-Ididentifie la livraison, pas l'événement. - 3Il retrouve la commande grâce à la
metadata, renvoyée telle quelle dans l'événement :wcOrderdonne son identifiant. - 4Il la passe « En cours » par l'API REST de WooCommerce :
PUT /wp-json/wc/v3/orders/<id>avec le statutprocessing. - 5Il répond `2xx` une fois la mise à jour et la déduplication enregistrées, et laisse le reste — e-mail, étiquette d'expédition — à une tâche de fond.
Sans réponse 2xx, ChariPay rejoue : immédiatement, puis après 1 min, 5 min, 30 min, 1 h, et toutes les 6 h, jusqu'à 16 tentatives sur environ 72 heures. Un hébergement mutualisé en maintenance pendant cette fenêtre ne fait donc rien perdre : le journal des livraisons du portail montre chaque tentative et la réponse de votre serveur, et permet un rejeu en un clic. Les pièges classiques — signature vérifiée après parsing, absence de déduplication, traitement lourd dans la requête — sont décrits dans réussir son intégration des webhooks.
Espèces en agence pour les clients sans carte
Une boutique marocaine perd des ventes si elle n'accepte que la carte : une partie des clients n'en a pas, ou refuse de la saisir en ligne. Le paiement à la livraison répond à ce besoin, mais il expédie des colis que personne n'a encore payés. Les espèces en agence règlent la question à la commande. Une session de paiement n'encaisse que la carte : le paiement en espèces passe toujours par un lien de paiement à usage unique — une référence par dépôt —, celui de l'étape 1, sur la page duquel le client choisit les espèces, ou un lien créé par votre service avec POST /v1/payment-links et paymentMethod: CASH, qui porte la même metadata qu'une session. Le client reçoit une référence et dépose le montant dans une agence partenaire. Dès que le réseau confirme le dépôt, le lien passe « Payé », vous êtes notifié dans le portail, et le montant est disponible à l'instant sur votre compte de paiement. Côté serveur, l'état du lien se lit par GET /v1/payment-links/{reference} : quand il est « Payé », votre service passe la commande « En cours » par le même appel qu'à l'étape 3.
ChariPay est la seule passerelle de paiement au Maroc à encaisser aussi les espèces en agence. Pour une boutique WooCommerce, trois règles :
- Pas d'expiration sur le lien espèces : créez-le sans
expiresAt, comme le portail le fait avec « Paiement en agence » — le client paie quand il passe en agence. Pour une commande « En attente » qui ne doit plus le rester, annulez le lien (POST /v1/payment-links/{reference}/cancel) : un lien annulé ne peut plus être payé. - Gardez « En attente » (`on-hold`) jusqu'au dépôt. C'est précisément la différence avec le paiement à la livraison : chez vous, « En cours » voudra toujours dire « payé ».
- Contrôlez le montant reçu. Une agence encaisse ce qu'on lui remet ; si le dépôt diffère du total de la commande, l'écart doit apparaître avant l'expédition.
La référence est générée à la première ouverture de la page de paiement : c'est la page qui la présente au client. Le paiement par référence, son parcours et sa traçabilité comptable sont détaillés dans encaisser en espèces par référence.
Remboursements et rapprochement
Un article retourné, une commande annulée après paiement : le remboursement se fait depuis le portail ChariPay ou par POST /v1/refunds, en désignant l'opération d'origine par son operationId, avec un motif et votre refundReference, en totalité ou partiellement grâce à refundAmount. Cette référence protège du double remboursement : la création répond 202, et un rejeu de la même référence renvoie le remboursement existant en 200. Le montant est prélevé sur le solde disponible de votre compte de paiement, et l'opération est bloquée si le solde ne suffit pas. L'événement refund.succeeded signale l'aboutissement — un remboursement n'est pas instantané côté banque —, et rembourser un client est gratuit. Le module remboursements de l'API donne les champs et les réponses ; côté WooCommerce, un remboursement total correspond au statut « Remboursée » (refunded), à poser sur la commande pour garder deux historiques concordants.
Pour le rapprochement, tout repose sur le numéro de commande WooCommerce, présent dans orderId, dans votre externalId et dans votre metadata ; l'événement de paiement d'une session vous renvoie votre metadata, telle quelle, et votre orderId. L'export CSV du portail, ou GET /v1/transactions/export.csv par l'API, liste chaque mouvement — carte, dépôt en espèces, remboursement, versement — avec sa référence ; le portail distingue, pour chaque opération, montant payé, frais et net. Les horodatages de l'export sont en UTC : convertissez-les à l'heure marocaine avant de les comparer à vos commandes. Le versement vers votre banque suit son propre rythme : automatique chaque nuit dès qu'un compte de règlement est configuré, ou par virement instantané à la demande, avec une référence reprise sur votre relevé.
Questions fréquentes
Existe-t-il un plugin ChariPay pour WooCommerce ?
Oui : le module ChariPay pour WooCommerce est disponible sur GitHub ; il permet à une boutique WooCommerce d'encaisser avec ChariPay. Sans installer le module, une boutique WooCommerce encaisse aussi avec ChariPay par deux voies réelles : le lien de paiement, créé dans le portail et envoyé au client, puis le checkout hébergé par l'API, avec une session par commande et un webhook signé qui fait passer la commande « En cours » (processing). Les deux partent d'une méthode hors ligne de WooCommerce.
WooPayments est-il disponible au Maroc ?
Non. Le Maroc ne figure pas dans la liste officielle des pays où WooPayments est proposé aux particuliers et aux entreprises, relue le 2 octobre 2026. Votre boutique WooCommerce fonctionne pourtant très bien au Maroc : vous activez une méthode hors ligne, et le client paie sur la page ChariPay, par carte avec 3-D Secure ou en espèces dans une agence partenaire.
Puis-je encaisser en dirhams ?
Oui, et seulement en dirhams : l'API exprime les montants en MAD, en unités majeures, sans champ devise — 250.00 vaut 250,00 MAD. Si votre boutique WooCommerce est réglée en dirhams, le total de la commande passe tel quel dans le lien ou la session. Le solde, les remboursements et les versements sont eux aussi en dirhams : aucune conversion entre le paiement du client et votre comptabilité.
Comment gérer un panier abandonné ?
Ici, le panier abandonné est une commande « En attente » (on-hold) jamais réglée. Donnez une expiration à chaque session et à chaque lien réglé par carte — 72 heures par défaut pour une session, expiresAt pour raccourcir —, envoyez une seule relance avec un nouveau lien, puis passez la commande « Annulée » (cancelled) dans WooCommerce ; un lien espèces n'expire pas : annulez-le en même temps que la commande. Une session créée avec notifyOnFailure: true vous prévient aussi d'un paiement par carte refusé, par l'événement payment.failed.
Quand l'argent est-il disponible ?
Dès que le paiement réussit, par carte ou en espèces : le montant est crédité à l'instant sur votre compte de paiement ChariPay, tenu par Chari Money avec un RIB au nom de votre entreprise, et vous pouvez l'utiliser aussitôt pour un virement, une facture ou un remboursement. Le versement vers votre banque est une opération à part, automatique chaque nuit dès qu'un compte de règlement est configuré, ou par virement instantané à la demande.
Faut-il modifier le code de WordPress ?
Non. Au premier niveau, vous renommez une méthode hors ligne dans les réglages et vous créez les liens depuis le portail ChariPay. Au second, le code vit sur votre serveur, pas dans WordPress : il reçoit les webhooks natifs de WooCommerce, appelle l'API ChariPay, puis met la commande à jour par l'API REST de WooCommerce. Vos mises à jour de WordPress et de WooCommerce restent indépendantes de l'encaissement.
Combien cela coûte-t-il ?
La sandbox est gratuite, sans limite de durée et sans engagement. Le passage en production coûte 6 000 MAD TTC de mise en service, réglés une seule fois ; la commission par transaction réussie, en pourcentage, et la caution sont fixées après étude de votre dossier. Rembourser un client ne coûte rien. La page Tarification détaille ce qui est inclus sans supplément, du compte de paiement avec RIB aux espèces en agence.
Prochaine étape
Commencer en mode test : ouvrez votre compte, réglez avec la carte de test un lien au montant d'une commande type, puis ouvrez un lien en espèces pour voir le parcours proposé au client. Quand votre serveur reçoit son premier payment.succeeded et passe une commande de test « En cours », l'intégration est faite : le jour du passage en production, seuls la clé et le secret de webhook changeront. Le guide du paiement e-commerce au Maroc donne la vue d'ensemble des méthodes et des coûts ; pour une boutique sous Shopify, lisez encaisser sur Shopify au Maroc.
Sources
- WooCommerce — WooPayments: supported countries — lu le 2026-10-02
- WooCommerce — Core payment options — lu le 2026-10-02
- WooCommerce — Direct Bank Transfer (BACS) — lu le 2026-10-02
- WooCommerce — Check Payments — lu le 2026-10-02
- WooCommerce — Cash on Delivery — lu le 2026-10-02
- WooCommerce — Order statuses — lu le 2026-10-02
- WooCommerce — Webhooks — lu le 2026-10-02
- WooCommerce REST API — Orders — lu le 2026-10-02
Écrit par Équipe ChariPay.