Aller au contenu principal
Tous les articles
Guide14 min de lecture

Encaisser sur Shopify au Maroc

Boutique Shopify, clients marocains : accepter la carte 3-D Secure et les espèces en agence, par lien de paiement puis checkout par l'API, sans plugin.

Pour encaisser sur Shopify au Maroc, il n'y a pas de plugin à installer : vous créez dans Shopify un moyen de paiement manuel, 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. Pour démarrer, un lien de paiement envoyé depuis le portail suffit, sans une ligne de code ; quand le volume grandit, le checkout hébergé par l'API prend le relais, avec un webhook qui marque la commande payée. Ce guide déroule les trois étapes, puis les espèces, les remboursements et le rapprochement.

Shopify Payments au Maroc : la situation

Shopify Payments, le module d'encaissement intégré à Shopify, n'est utilisable que par les entreprises établies dans les pays de sa liste officielle, et le Maroc n'y figure pas (liste relue le 2 octobre 2026). Une boutique marocaine ne peut donc pas l'activer. Shopify accepte d'autres prestataires dans son propre checkout, mais sa documentation pour les développeurs réserve la création de ces extensions de paiement aux partenaires qu'il approuve et à certains marchands Shopify Plus. Il n'existe pas de plugin ChariPay pour Shopify — ni app, ni extension de checkout —, et nous n'en promettons pas.

Ce qui reste ouvert à toute boutique, ce sont les moyens de paiement manuels. Shopify permet d'en créer un sur mesure, avec trois champs : un nom, des détails affichés à côté du moyen de paiement au moment du choix, et des instructions affichées sur la page de confirmation, une fois la commande passée. La commande est enregistrée comme non payée, et vous la marquez payée depuis sa fiche dès que l'argent est reçu. C'est sur ce mécanisme, documenté par Shopify, que ChariPay se branche : le client commande sur votre boutique, paie sur une page ChariPay, et la commande passe payée — à la main au premier niveau, automatiquement ensuite.

Ce que la page ChariPay apporte à votre 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 la vue d'ensemble — méthodes à proposer, coût réel du paiement à la livraison, site sur mesure —, lisez notre guide du paiement e-commerce au Maroc.

Étape 1 — le lien de paiement dans la commande

Le premier niveau ne demande ni développeur ni accès technique, et vous pouvez le répéter à blanc avant de l'ouvrir à vos clients : Commencer en mode test. Après le clic, trois champs — nom, e-mail professionnel, entreprise —, puis le lien d'activation reçu par e-mail pour choisir 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 paiement de test au montant d'une vraie commande et payez-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 sans validation à attendre : la vérification de votre entreprise (KYB) ne conditionne que le passage en production.

Le circuit tient ensuite en cinq gestes :

  1. 1Créez le moyen de paiement manuel dans Shopify. Donnez-lui un nom qui dit ce que le client va vivre — « Carte bancaire ou espèces en agence », par exemple. Dans les détails, annoncez la suite : « Après votre commande, vous recevez un lien de paiement sécurisé. » Dans les instructions, précisez le canal : WhatsApp, SMS ou e-mail.
  2. 2Recevez la commande, non payée. Shopify l'enregistre ainsi pour tout moyen de paiement manuel : ne la préparez pas encore.
  3. 3Créez le lien de paiement depuis le portail ChariPay, au montant exact, avec le numéro de commande dans la description (« Commande #1042 »), à usage unique, et une expiration adaptée : 24 heures, 7 jours, 30 jours ou une date précise.
  4. 4Envoyez-le par WhatsApp, par e-mail ou en QR code. Le client paie sur une page hébergée qui affiche votre nom et votre logo : par carte avec 3-D Secure, ou en espèces en agence.
  5. 5Marquez la commande payée dans Shopify quand le portail affiche le lien comme payé, puis expédiez. Shopify prévoit ce geste sur la fiche de la commande, pour un paiement reçu en dehors de Shopify.

Ce circuit suffit tant que vous traitez les commandes une à une, et il sert aussi hors de la boutique : une vente conclue sur Instagram, un acompte, une commande prise par téléphone. La page Liens de paiement détaille les options — QR code, affiche PDF, clients enregistrés —, et le guide lien de paiement ou checkout aide à décider quand passer au niveau suivant.

Étape 2 — le checkout hébergé par session

Quand les commandes s'enchaînent, créer chaque lien à la main devient le goulot d'étranglement. Le deuxième niveau automatise ce geste, toujours sans plugin : rien ne s'installe dans Shopify, et c'est un petit service sur votre serveur qui relie les deux plateformes.

  1. 1Shopify prévient votre serveur. Dans les réglages de notifications de Shopify, créez un webhook sur la création de commande, au format JSON, vers une adresse https:// de votre serveur, et vérifiez l'authenticité de ces notifications selon la documentation de Shopify.
  2. 2Votre serveur crée une session de paiement pour chaque commande passée avec votre moyen de paiement manuel.
  3. 3Le client reçoit le `checkoutUrl` par e-mail, SMS ou 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).

Voici la création de la session en sandbox, avec une clé de test ; la clé voyage dans l'en-tête X-CHARI-PAY-API-KEY et ne quitte jamais votre serveur.

bash
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: shopify-1042-session' \
  -d '{
    "amount": 249.00,
    "orderId": "#1042",
    "externalId": "shopify-1042",
    "config": {
      "customer": {
        "email": "amine.bennani@example.com",
        "firstName": "Amine",
        "lastName": "Bennani",
        "phone": "+212600000000"
      },
      "urls": {
        "accept": "https://votre-boutique.ma/pages/paiement-recu",
        "decline": "https://votre-boutique.ma/pages/paiement-refuse",
        "notification": "https://api.votre-boutique.ma/webhooks/charipay"
      }
    },
    "metadata": { "source": "shopify", "shopifyOrderId": "5512345678901" }
  }'

La réponse, en 201, renvoie sessionId, sessionToken, verifyKey, expiresAt et le checkoutUrl à transmettre au client. orderId porte le numéro visible de la commande ; il revient dans les webhooks, sans contrainte d'unicité. externalId, dérivé du numéro de commande, rend l'appel rejouable : si la même commande vous est notifiée deux fois, 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 : c'est elle qui transporte l'identifiant de la commande Shopify dont l'étape 3 aura besoin. Une session est à usage unique et expire par défaut 72 heures après sa création ; expiresAt la raccourcit. La base d'URL est la même en sandbox et en production : c'est la clé, chari_sk_test_… ou chari_sk_live_…, qui choisit l'environnement. Chaque champ est décrit dans le module Sessions de paiement, et la page checkout hébergé montre ce que voit votre client.

Étape 3 — le webhook qui met la commande à jour

Un client qui a payé ne revient pas toujours sur votre boutique : il ferme l'onglet, sa connexion coupe, son téléphone se verrouille. La commande ne passe donc payée qu'à réception du webhook ChariPay, jamais sur la seule redirection vers votre URL accept. ChariPay envoie l'événement payment.succeeded à l'URL de notification de la session, avec deux en-têtes : X-CHARI-SIGNATURE, un HMAC-SHA256 en hexadécimal minuscule calculé sur la chaîne horodatage + "." + corps brut, et X-CHARI-TIMESTAMP, l'horodatage en millisecondes. Voici la vérification telle que la documentation de l'API la publie :

javascript
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'));
}

Votre service enchaîne ensuite cinq gestes :

  1. 1Vérifiez la signature sur les octets bruts, avant tout parsing : un JSON re-sérialisé ne produit plus les octets qui ont été signés.
  2. 2Dédupliquez sur `Chari-Event-Id`, pas sur Chari-Webhook-Id, qui identifie la livraison, pas l'événement.
  3. 3Retrouvez la commande Shopify grâce à la metadata, renvoyée telle quelle dans l'événement : shopifyOrderId donne l'identifiant de la commande.
  4. 4Marquez-la payée par l'API Admin de Shopify : la mutation orderMarkAsPaid, appelée avec l'identifiant global de la commande (gid://shopify/Order/…), enregistre une transaction pour le solde restant dû, et demande l'accès en écriture aux commandes (write_orders).
  5. 5Répondez `2xx` une fois la mise à jour et l'enregistrement de déduplication validés ; faites le reste — e-mail au client, préparation — en tâche de fond.

Si votre serveur ne répond pas, 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. Le journal des livraisons du portail montre chaque tentative, la réponse de votre serveur et le corps exact de l'événement, et permet un rejeu en un clic. Les cinq erreurs qui reviennent dans presque toutes les intégrations sont décrites dans réussir son intégration des webhooks.

Espèces en agence pour les clients sans carte

Une partie de vos clients n'a pas de carte, ou ne veut pas s'en servir en ligne. Plutôt que de les renvoyer au paiement à la livraison, proposez-leur les espèces à 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 marque la commande Shopify payée par la même mutation qu'à l'étape 3.

ChariPay est la seule passerelle de paiement au Maroc à encaisser aussi les espèces en agence. Trois réflexes pour une boutique Shopify :

  • 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 qui ne doit plus rester ouverte, annulez le lien (POST /v1/payment-links/{reference}/cancel) : un lien annulé ne peut plus être payé.
  • Ne préparez la commande qu'au paiement confirmé. Entre la commande et le dépôt, elle reste non payée dans Shopify, et c'est normal.
  • Regardez le montant déposé. Une agence encaisse ce qu'on lui remet : si le montant diffère de la commande, l'écart doit être visible chez vous avant l'expédition.

La référence naît à la première ouverture de la page de paiement : laissez la page la présenter au client plutôt que de la recopier. Vous pouvez garder le paiement à la livraison comme option, mais la commande réglée en agence part déjà payée, sans espèces qui voyagent avec le livreur. Le parcours complet, côté client et côté comptabilité, est dans encaisser en espèces par référence.

Remboursements et rapprochement

Un retour, une rupture de stock, un geste commercial : le remboursement part depuis le portail ChariPay ou par POST /v1/refunds, en citant l'opération d'origine par son operationId, avec un motif et votre propre refundReference — en totalité, ou pour un montant partiel avec refundAmount. La référence sert de clé d'idempotence : la création répond 202, un rejeu de la même référence renvoie le remboursement existant en 200, sans débiter deux fois. Le montant est déduit du solde disponible de votre compte de paiement ; si le solde ne couvre pas, l'opération est bloquée plutôt que de créer un découvert silencieux. L'événement refund.succeeded confirme l'aboutissement, car un remboursement n'est pas instantané côté banque, et rembourser un client est gratuit. Les champs et les codes de réponse sont dans le module remboursements de l'API ; côté Shopify, notez le remboursement sur la commande pour que les deux historiques racontent la même histoire.

Le rapprochement tient à une discipline simple : la même référence partout. Le numéro de commande Shopify voyage dans orderId, que l'événement de paiement d'une session vous renvoie, et l'identifiant de la commande dans votre metadata, renvoyée telle quelle. L'export CSV, depuis le portail ou par GET /v1/transactions/export.csv, reprend chaque mouvement — paiement par carte, dépôt en espèces, remboursement, versement — avec sa référence ; le portail distingue, pour chaque opération, le montant payé, les frais et le net. Les horodatages de l'export sont en UTC : convertissez-les à l'heure marocaine avant de comparer avec vos commandes. Le versement vers votre banque reste une opération distincte, automatique chaque nuit dès qu'un compte de règlement est configuré, ou par virement instantané à la demande, avec une référence qui figure sur votre relevé.

Questions fréquentes

Existe-t-il un plugin ChariPay pour Shopify ?

Non, il n'en existe pas, et nous n'en promettons pas : ni app, ni extension de checkout. Une boutique Shopify encaisse avec ChariPay par deux voies réelles : le lien de paiement, créé depuis le portail et envoyé au client, puis le checkout hébergé par l'API, avec une session par commande et un webhook signé qui marque la commande payée. Les deux s'appuient sur un moyen de paiement manuel, que Shopify permet de créer.

Shopify Payments est-il disponible au Maroc ?

Non. Le Maroc ne figure pas dans la liste officielle des pays où Shopify Payments est proposé, relue le 2 octobre 2026 ; une entreprise établie au Maroc ne peut donc pas l'activer. Votre boutique Shopify reste pleinement utilisable : vous y ajoutez un moyen de paiement manuel, 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 uniquement en dirhams : les montants de l'API sont en MAD, en unités majeures, sans champ devise — 249.00 vaut 249,00 MAD. Si votre boutique affiche ses prix en dirhams, le total de la commande se reporte tel quel dans le lien ou la session. Soldes, remboursements et versements sont aussi en dirhams, sans conversion entre ce que paie le client et ce que lit votre comptable.

Comment gérer un panier abandonné ?

Dans ce montage, le panier abandonné est une commande Shopify passée mais jamais payée. Donnez une expiration à chaque session et à chaque lien réglé par carte — 72 heures par défaut pour une session, expiresAt pour raccourcir —, relancez une fois le client avec un nouveau lien, puis annulez la commande dans Shopify ; un lien espèces n'expire pas : annulez-le en même temps que la commande. Créée avec notifyOnFailure: true, une session vous signale aussi un paiement par carte refusé par l'événement payment.failed.

Quand l'argent est-il disponible ?

À l'instant du paiement réussi, par carte comme en espèces : le montant est crédité sur votre compte de paiement ChariPay, tenu par Chari Money avec un RIB au nom de votre entreprise, et utilisable aussitôt pour un virement, un paiement de facture ou un remboursement. Le versement vers votre banque est une opération distincte : automatique chaque nuit dès qu'un compte de règlement est configuré, ou par virement instantané à la demande.

Faut-il un développeur pour commencer ?

Non. Le moyen de paiement manuel se configure dans Shopify, le lien de paiement se crée depuis le portail ChariPay et s'envoie par message : aucun code. Le développeur devient utile quand vous voulez automatiser, c'est-à-dire créer une session à chaque commande et marquer la commande payée à réception du webhook. Beaucoup de boutiques commencent sans lui et l'appellent quand les commandes s'enchaînent.

Combien cela coûte-t-il ?

La sandbox est gratuite, sans limite de durée et sans engagement. Au passage en production, la mise en service coûte 6 000 MAD TTC, réglés une seule fois ; la commission par transaction réussie, en pourcentage, et la caution sont définies après étude de votre dossier. Rembourser un client est gratuit. La page Tarification liste aussi ce qui est inclus sans supplément, dont le compte de paiement avec RIB et les espèces en agence.

Prochaine étape

Commencer en mode test : créez votre compte, payez avec la carte de test un lien au montant d'une vraie commande, puis ouvrez un second lien en espèces pour voir le parcours que découvre le client. Quand votre développeur voit arriver payment.succeeded sur son serveur, l'étape 3 est à portée de main. Pour la vue d'ensemble des méthodes et des coûts, lisez le guide du paiement e-commerce au Maroc ; si votre boutique tourne sous WordPress, voyez encaisser sur WooCommerce au Maroc.

Sources

Écrit par Équipe ChariPay.

À lire ensuite

Guide6 min de lecture

Lien de paiement ou checkout : lequel choisir

Lien de paiement ou checkout : deux façons d'encaisser en ligne, deux charges de travail, et les critères qui tranchent — volume, montant, équipe.

Guide5 min de lecture

3-D Secure : ce qui fait échouer un paiement

3-D Secure et taux de réussite : pourquoi un paiement par carte échoue, les causes réelles par ordre de fréquence et ce que vous pouvez corriger.

Prêt à essayer par vous-même ?

Créez votre compte et encaissez en mode test dès aujourd'hui : c'est gratuit, sans validation à attendre. Une question ? Notre équipe répond aux commerçants comme aux développeurs.

  • Gratuit, sans engagement
  • Mode test dès l'inscription
  • Aucune validation à attendre