الانتقال إلى المحتوى الرئيسي
كل المقالات
دليل12 دقيقة قراءة

التحصيل على WooCommerce في المغرب

متجر WooCommerce في المغرب: اقبلوا البطاقة مع ‎3-D Secure والنقد في الوكالة بالدرهم، بإضافة ChariPay المتاحة على GitHub أو عبر رابط الدفع ثم صفحة الدفع عبر API.

للتحصيل على WooCommerce في المغرب، تتوفر إضافة ChariPay لـWooCommerce على GitHub؛ ويمكنكم أيضًا الاستخلاص دون تثبيتها: تحتفظون بإحدى طرق الدفع غير المتصلة التي يوفرها WooCommerce، ويؤدي زبناؤكم ثمن الطلب على صفحة ChariPay — بالبطاقة مع ‎3-D Secure أو نقدًا في وكالة Damane Cash أو Chaabi Cash أو Tasshilat أو Barid Cash أو Chari —، بالدرهم، والمال متاح في اللحظة في حساب الأداء الخاص بكم. للانطلاق، يكفي رابط دفع ترسلونه من البوابة؛ وللأتمتة، ينشئ خادمكم جلسة دفع لكل طلب، وتنقل API REST الخاصة بـWooCommerce الطلب إلى حالة «قيد التنفيذ» (processing) بمجرد أن يؤكد الويب هوك الأداء. إليكم المراحل الثلاث، ثم النقد، والاسترداد، والمطابقة.

WooPayments في المغرب: الوضع الحالي

WooPayments، أي حل الدفع المدمج الذي يقترحه WooCommerce، مخصّص للأفراد والشركات في البلدان المدرجة في لائحته الرسمية، والمغرب ليس ضمنها (اللائحة قُرئت في 2 أكتوبر 2026). لا تستطيع شركة قائمة في المغرب إذن استعماله للتحصيل. في المقابل، يأتي WooCommerce بثلاث طرق دفع غير متصلة، لا تستقبل أي أداء عبر الإنترنت: التحويل البنكي المباشر، والأداء بالشيك، والدفع عند الاستلام. وتتيح إضافة ChariPay لـWooCommerce، المتاحة على GitHub، لمتجركم الاستخلاص عبر ChariPay. ويفصّل هذا الدليل المسارين اللذين يعملان دون تثبيتها؛ وفيهما تكون بوابة الدفع هي صفحة ChariPay التي يؤدي عليها زبونكم ثمن طلبه.

تكفي هذه الطرق غير المتصلة لربط كل شيء. تُضبط كل واحدة منها بعنوان يظهر للزبون لحظة الاختيار، ووصف يظهر إن اختارها، وتعليمات للأداء. وتختلف حالاتها، وهذا ما يهمّ في ما يلي؛ ونذكر كل حالة مع معرّفها في API بين قوسين، لأن الاسم المعروض يتغير بحسب لغة لوحة التحكم، أما المعرّف فلا يتغير. مع التحويل البنكي المباشر، كما مع الأداء بالشيك، يضع WooCommerce الطلب في حالة «قيد الانتظار» (on-hold) ريثما تؤكدون الأداء. ومع الدفع عند الاستلام، ينقله إلى «قيد التنفيذ» (processing) إلى حين التحصيل، مع أن شيئًا لم يُدفع بعد. وبالنسبة إلى أداء عبر ChariPay، السلوك الأول هو الصحيح: طلب ينتظر التأكيد، لا تجهّزونه إلا بعد وصول المال.

ما تضيفه صفحة ChariPay إلى المتجر: البطاقة — Visa وMastercard وMaroc Pay — مع ‎3-D Secure، والنقد في الوكالة للزبناء الذين لا يملكون بطاقة، ومبالغ بالدرهم، وحساب أداء باسم شركتكم تمسكه Chari Money، مؤسسة أداء مرخَّصة من بنك المغرب، حيث يصبح كل أداء ناجح متاحًا في اللحظة. ولتروا موقع WooCommerce بين طرق البيع الأخرى عبر الإنترنت — موقع مطوَّر حسب الطلب، أو Shopify، أو واجهة مستضافة —، اقرؤوا دليلنا عن الدفع الإلكتروني للتجارة الإلكترونية في المغرب.

المرحلة الأولى — رابط الدفع في الطلب

لا يمسّ المستوى الأول شيفرة WordPress ولا أي خادم، ويمكنكم تجربته قبل فتحه لزبنائكم: ابدؤوا في وضع الاختبار. ما يحدث بعد النقر: ثلاثة حقول — الاسم، والبريد الإلكتروني المهني، والشركة —، ثم رابط التفعيل الذي يصلكم بالبريد، ثم اختيار كلمة المرور. في البوابة، سينشئ مطوّركم مفتاح الاختبار للمرحلة الثانية؛ أما أنتم، فأنشئوا رابطًا تجريبيًا بمبلغ طلب نموذجي، وادفعوه ببطاقة الاختبار 4918 9141 0719 5005 (رمز CVV 123، ورمز ‎3-D Secure 555). كل ذلك مجاني، بلا حدّ زمني، ولا موافقة تنتظرونها: التحقق من شركتكم (KYB) لا يشترطه إلا الانتقال إلى الإنتاج.

بعد ذلك، يختصر المسار في خمس حركات:

  1. 1أعيدوا تسمية طريقة غير متصلة. في إعدادات الدفع لدى WooCommerce، فعّلوا التحويل البنكي المباشر وامنحوه عنوانًا يصف المسار الحقيقي — «بطاقة بنكية أو نقدًا في الوكالة» —، ثم اكتبوا في الوصف: «بعد الطلب، يصلكم رابط دفع آمن عبر واتساب أو البريد الإلكتروني». واتركوا بياناته البنكية فارغة: فـWooCommerce يعرضها على صفحة تأكيد الطلب وفي البريد المرسل إلى الزبون.
  2. 2يصل الطلب في حالة «قيد الانتظار» (`on-hold`). ينتظر WooCommerce تأكيدكم للأداء؛ أما المخزون فقد خُصم سلفًا.
  3. 3أنشئوا رابط الدفع في بوابة ChariPay بالمبلغ المضبوط، مع «الطلب رقم 5871» في الوصف، للاستعمال مرة واحدة، وبمدة صلاحية: 24 ساعة، أو 7 أيام، أو 30 يومًا، أو تاريخ محدد.
  4. 4أرسلوه عبر واتساب أو البريد الإلكتروني أو على شكل رمز QR. يدفع الزبون على صفحة مستضافة تحمل اسمكم وشعاركم: بالبطاقة مع ‎3-D Secure، أو نقدًا في الوكالة.
  5. 5انقلوا الطلب إلى «قيد التنفيذ» (`processing`) حين تُظهر البوابة الرابط مدفوعًا. في WooCommerce، تعني هذه الحالة أن الأداء وصل وأن الطلب ينتظر التجهيز؛ ثم يصير «مكتملًا» (completed) بعد تنفيذه.

يصمد هذا المسار ما دامت الطلبات تصل بوتيرة تستطيعون متابعتها يدويًا، ويصلح أيضًا خارج المتجر: عرض سعر مقبول، أو عربون، أو بيع اتُّفق عليه على واتساب. تعرض صفحة روابط الدفع الخيارات — رمز QR، والملصق PDF، والزبناء المسجَّلون —، ويقدّم دليل رابط الدفع أم صفحة الدفع معايير الانتقال إلى المستوى التالي. وفي موقع تعريفي بلا WooCommerce، يؤدي زر الدفع المهمة نفسها: راجعوا زر الدفع في موقع إلكتروني.

المرحلة الثانية — صفحة الدفع المستضافة عبر جلسة

يلغي المستوى الثاني إنشاء الرابط يدويًا، دائمًا دون تثبيت الإضافة: لا شيء يُثبَّت في WordPress في هذا المسار. فـWooCommerce يعرف أصلًا كيف يُخطر خادمًا خارجيًا وكيف يقبل تحديث طلب عبر API REST الخاصة به؛ ولا يلزم سوى خدمة صغيرة، على خادمكم، بين WooCommerce وChariPay.

  1. 1يُخطر WooCommerce خادمكم. من WooCommerce > الإعدادات > متقدم > Webhooks، أضيفوا ويب هوك على حدث إنشاء الطلب، نحو عنوان https:// على خادمكم، مع سرّ: يستعمله WooCommerce لتوليد بصمة لكل تسليم، يتحقق منها خادمكم كما يشرح توثيق WooCommerce.
  2. 2ينشئ خادمكم جلسة دفع لكل طلب تمّ بطريقتكم غير المتصلة.
  3. 3يتلقى الزبون `checkoutUrl` عبر البريد أو واتساب، بأدوات الإرسال المعتادة لديكم، ويدفع على صفحة الدفع المستضافة. لا تستخلص الجلسة إلا البطاقة مع ‎3-D Secure: وللإبقاء على النقد، تنشئ خدمتكم بدلًا منها رابط دفع يُستعمل مرة واحدة (انظروا أدناه).

إنشاء الجلسة في السندبوكس، بمفتاح اختبار لا يغادر خادمكم أبدًا:

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: 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" }
  }'

يعيد الرد 201 كلًّا من sessionId وsessionToken وverifyKey وexpiresAt وcheckoutUrl الذي ترسلونه. ينتقل رقم طلب WooCommerce في orderId، المرجع المقروء الذي يعود في الويب هوك دون أي قيد تفرّد، وفي externalId، الفريد لكل حساب ولكل بيئة، الذي يجعل النداء قابلًا للإعادة — إن سلّم WooCommerce الطلب نفسه مرتين، تعيد API الجلسة الموجودة بالرمز 200 بدل إنشاء ثانية. الحقول الأربعة في config.customer إلزامية، وكل عنوان تصرّحون به يجب أن يبدأ بـhttps://، ويعود metadata — في حدود 4 كيلوبايت — كما هو في ويب هوك الأداء: فيه يحمل wcOrder معرّف الطلب الذي ستحتاجه المرحلة الثالثة. الجلسة للاستعمال مرة واحدة، وتنتهي افتراضيًا بعد 72 ساعة من إنشائها، ما لم يُحدَّد expiresAt أقصر. والنداء نفسه يصلح في الإنتاج: لا يتغير إلا المفتاح، chari_sk_live_… بدل chari_sk_test_…. تفصّل وحدة جلسات الدفع كل حقل، وتُريكم صفحة صفحة الدفع المستضافة الشاشة التي يراها زبونكم.

المرحلة الثالثة — الويب هوك الذي يحدّث الطلب

العودة إلى عنوان accept تخبركم بأن الزبون عاد، لا بأنه دفع: قد يدفع الزبون ثم يغلق النافذة ولا يرى متجركم مجددًا. لذلك لا ينتقل طلب WooCommerce إلى «قيد التنفيذ» إلا عند وصول ويب هوك ChariPay. يصل الحدث payment.succeeded إلى عنوان الإشعار الخاص بالجلسة مع X-CHARI-SIGNATURE، وهو HMAC-SHA256 بالنظام الست عشري بحروف صغيرة يُحسب على timestamp + "." + rawBody، وX-CHARI-TIMESTAMP بالمللي ثانية. التحقق كما ينشره توثيق API:

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

حول هذه الدالة، تقوم خدمتكم بخمسة أمور، بهذا الترتيب:

  1. 1تتحقق من التوقيع على المحتوى الخام، قبل أي تحليل، وترفض طابعًا زمنيًا منحرفًا بأكثر من خمس دقائق.
  2. 2تزيل التكرار على أساس `Chari-Event-Id`: قد يصل الإشعار نفسه عدة مرات؛ وChari-Webhook-Id يعرّف التسليم لا الحدث.
  3. 3تعثر على الطلب بفضل metadata الذي يعود كما هو في الحدث: يعطي wcOrder معرّفه.
  4. 4تنقله إلى «قيد التنفيذ» عبر API REST الخاصة بـWooCommerce: النداء PUT /wp-json/wc/v3/orders/<id> بالحالة processing.
  5. 5تجيب بـ`2xx` بعد حفظ التحديث وسجل إزالة التكرار، وتترك الباقي — البريد، وملصق الشحن — لمهمة في الخلفية.

إن لم تصل إجابة 2xx، تعيد ChariPay المحاولة: فورًا، ثم بعد دقيقة، و5 دقائق، و30 دقيقة، وساعة، ثم كل 6 ساعات، حتى 16 محاولة على مدى 72 ساعة تقريبًا. لا يضيع إذن شيء إن كانت استضافتكم المشتركة في صيانة خلال هذه المدة: يعرض سجل التسليمات في البوابة كل محاولة وردّ خادمكم، ويتيح إعادة الإرسال بنقرة واحدة. والفخاخ المعتادة — التحقق من التوقيع بعد التحليل، وغياب إزالة التكرار، والمعالجة الثقيلة داخل الطلب — مشروحة في إنجاح إدماج الويب هوك.

النقد في الوكالة للزبناء بلا بطاقة

يخسر المتجر المغربي مبيعات إن اكتفى بالبطاقة: بعض الزبناء لا يملكونها، أو يرفضون إدخالها على الإنترنت. يلبّي الدفع عند الاستلام هذه الحاجة، لكنه يشحن طرودًا لم يدفع أحد ثمنها بعد. أما النقد في الوكالة فيحسم المسألة عند الطلب. لا تستخلص جلسة الدفع إلا البطاقة: يمرّ الأداء نقدًا دائمًا عبر رابط دفع يُستعمل مرة واحدة — مرجع واحد لكل إيداع —، إما رابط المرحلة الأولى، الذي يختار الزبون النقد في صفحته، أو رابط تنشئه خدمتكم عبر POST /v1/payment-links مع paymentMethod: CASH، ويحمل metadata نفسه الذي تحمله الجلسة. يتلقى الزبون مرجعًا، ويودع المبلغ في وكالة شريكة. وبمجرد أن تؤكد الشبكة الإيداع، يصبح الرابط «مدفوعًا» ويصلكم الإشعار في بوابة التاجر، ويصبح المبلغ متاحًا في اللحظة في حساب الأداء الخاص بكم. ومن جهة الخادم تُقرأ حالة الرابط عبر GET /v1/payment-links/{reference}: فإذا صار «مدفوعًا»، نقلت خدمتكم الطلب إلى «قيد التنفيذ» بالنداء نفسه الذي في المرحلة الثالثة.

ChariPay هي بوابة الدفع الوحيدة في المغرب التي تستخلص النقد أيضًا في الوكالات. ولمتجر WooCommerce، ثلاث قواعد:

  • لا مدة صلاحية لرابط النقد: أنشئوه دون expiresAt، كما تفعل بوابة التاجر مع خيار «Paiement en agence» — يدفع الزبون حين يمرّ بالوكالة. وللطلب «قيد الانتظار» الذي لا ينبغي أن يبقى كذلك، ألغوا الرابط (POST /v1/payment-links/{reference}/cancel): فالرابط الملغى لا يمكن أداؤه.
  • أبقوا «قيد الانتظار» (`on-hold`) حتى الإيداع. هذا بالضبط ما يميّزه عن الدفع عند الاستلام: في متجركم، ستعني «قيد التنفيذ» دائمًا «مدفوع».
  • راقبوا المبلغ الواصل. تستلم الوكالة ما يُسلَّم إليها؛ وإن اختلف الإيداع عن مجموع الطلب، يجب أن يظهر الفرق قبل الشحن.

يُولَد المرجع عند أول فتح لصفحة الدفع: الصفحة هي التي تعرضه على الزبون. والدفع بالمرجع، ومساره، وأثره المحاسبي، مفصّلة في التحصيل النقدي بالمرجع.

الاسترداد والمطابقة

منتج أُعيد، أو طلب أُلغي بعد أدائه: ينطلق الاسترداد من بوابة ChariPay أو عبر POST /v1/refunds، بالإشارة إلى العملية الأصلية بـoperationId، مع سبب ومرجع الاسترداد refundReference، كليًا أو جزئيًا عبر refundAmount. يحمي هذا المرجع من الاسترداد المزدوج: يجيب الإنشاء بـ202، وتعيد إعادةُ المرجع نفسه الاسترداد الموجود بـ200. يُقتطع المبلغ من الرصيد المتاح في حساب الأداء الخاص بكم، وتُوقَف العملية إن لم يكفِ الرصيد. ويعلن الحدث refund.succeeded اكتمالها — فالاسترداد ليس فوريًا من جهة البنك —، واسترجاع المال للزبون مجاني. تقدّم وحدة الاسترداد عبر API الحقول والردود؛ ومن جهة WooCommerce، يقابل الاسترداد الكلي حالة «مسترد» (refunded)، تضعونها على الطلب كي يبقى السجلان متطابقين.

في المطابقة، يقوم كل شيء على رقم طلب WooCommerce، الحاضر في orderId وفي externalId وmetadata الخاصين بكم؛ ويعيد إليكم حدث الأداء الخاص بالجلسة metadata كما هو، وorderId أيضًا. يسرد تصدير CSV من البوابة، أو GET /v1/transactions/export.csv عبر API، كل حركة — بطاقة، أو إيداع نقدي، أو استرداد، أو دفعة — مع مرجعها؛ وتميّز البوابة لكل عملية المبلغ المدفوع والرسوم والصافي. والطوابع الزمنية للتصدير بتوقيت UTC: حوّلوها إلى التوقيت المغربي قبل مقارنتها بطلباتكم. وتسير الدفعة نحو بنككم على إيقاعها الخاص: تلقائية كل ليلة متى ضُبط حساب التسوية، أو بتحويل فوري عند الطلب، مع مرجع يظهر في كشفكم.

أسئلة شائعة

هل توجد إضافة ChariPay لـWooCommerce؟

نعم: إضافة ChariPay لـWooCommerce متاحة على GitHub، وتتيح لمتجركم الاستخلاص عبر ChariPay. وإن فضّلتم عدم تثبيتها، يستخلص متجر WooCommerce مع ChariPay عبر طريقين آخرين: رابط الدفع، الذي يُنشأ في البوابة ويُرسَل إلى الزبون، ثم صفحة الدفع المستضافة عبر API، بجلسة لكل طلب وويب هوك موقَّع ينقل الطلب إلى «قيد التنفيذ» (processing). وينطلق الطريقان من إحدى طرق الدفع غير المتصلة في WooCommerce.

هل WooPayments متاح في المغرب؟

لا. المغرب ليس ضمن اللائحة الرسمية للبلدان التي يُعرض فيها WooPayments على الأفراد والشركات، كما قُرئت في 2 أكتوبر 2026. ومع ذلك، يعمل متجركم على WooCommerce في المغرب على أحسن وجه: تفعّلون طريقة غير متصلة، ويدفع الزبون على صفحة ChariPay، بالبطاقة مع ‎3-D Secure أو نقدًا في وكالة شريكة.

هل يمكنني التحصيل بالدرهم؟

نعم، وبالدرهم وحده: تعبّر API عن المبالغ بالدرهم المغربي MAD، بالوحدات الكبرى، دون حقل للعملة — 250.00 تعني 250 درهمًا. إن كان متجركم على WooCommerce مضبوطًا على الدرهم، ينتقل مجموع الطلب كما هو إلى الرابط أو الجلسة. والرصيد والاستردادات والدفعات بالدرهم أيضًا: لا تحويل بين أداء الزبون ومحاسبتكم.

كيف أتعامل مع سلة متروكة؟

هنا، السلة المتروكة طلب «قيد الانتظار» (on-hold) لم يُدفع أبدًا. حدّدوا مدة صلاحية لكل جلسة ولكل رابط يُؤدّى بالبطاقة — 72 ساعة افتراضيًا للجلسة، وexpiresAt لتقصيرها —، وأرسلوا تذكيرًا واحدًا برابط جديد، ثم انقلوا الطلب إلى «ملغى» (cancelled) في WooCommerce؛ أما رابط النقد فلا مدة صلاحية له: ألغوه مع الطلب. والجلسة المنشأة مع notifyOnFailure: true تنبّهكم أيضًا إلى أداء بالبطاقة رُفض، عبر الحدث payment.failed.

متى يصبح المال متاحًا؟

بمجرد نجاح الأداء، بالبطاقة أو نقدًا: يُقيَّد المبلغ في اللحظة في حساب الأداء ChariPay الخاص بكم، الذي تمسكه Chari Money مع RIB باسم شركتكم، ويمكنكم استعماله فورًا في تحويل أو أداء فاتورة أو استرداد. أما الدفعة نحو بنككم فعملية مستقلة، تلقائية كل ليلة متى ضُبط حساب التسوية، أو بتحويل فوري عند الطلب.

هل يجب تعديل شيفرة WordPress؟

لا. في المستوى الأول، تعيدون تسمية طريقة غير متصلة في الإعدادات وتنشئون الروابط من بوابة ChariPay. وفي المستوى الثاني، تعيش الشيفرة على خادمكم لا داخل WordPress: تستقبل الويب هوك الأصلية لـWooCommerce، وتنادي API الخاصة بـChariPay، ثم تحدّث الطلب عبر API REST الخاصة بـWooCommerce. وتبقى تحديثات WordPress وWooCommerce مستقلة عن التحصيل.

كم يكلّف ذلك؟

السندبوكس مجانية، بلا حدّ زمني ودون التزام. ويكلّف الانتقال إلى الإنتاج رسوم تفعيل قدرها 6 000 درهم شاملة الضريبة، تُؤدّى مرة واحدة؛ أما العمولة عن كل أداء ناجح، بنسبة مئوية، والضمان فيُحدَّدان بعد دراسة ملفكم. واسترجاع المال للزبون لا يكلّف شيئًا. تفصّل صفحة الأسعار ما هو مشمول دون مقابل إضافي، من حساب الأداء مع RIB إلى النقد في الوكالة.

الخطوة التالية

ابدؤوا في وضع الاختبار: افتحوا حسابكم، وادفعوا ببطاقة الاختبار رابطًا بمبلغ طلب نموذجي، ثم افتحوا رابطًا بالنقد لتروا المسار الذي يُعرض على الزبون. وحين يتلقى خادمكم أول حدث payment.succeeded وينقل طلبًا تجريبيًا إلى «قيد التنفيذ»، يكون الإدماج قد اكتمل: يوم الانتقال إلى الإنتاج، لا يتغير إلا المفتاح وسرّ الويب هوك. يقدّم دليل الدفع الإلكتروني للتجارة الإلكترونية في المغرب الصورة الكاملة عن الطرق والكلفة؛ ولمتجر على Shopify، اقرؤوا التحصيل على Shopify في المغرب.

المصادر

بقلم فريق ChariPay.

اقرؤوا بعده

دليل4 دقائق قراءة

رابط دفع أم صفحة دفع مدمجة — أيّهما تختارون

رابط الدفع أم صفحة الدفع المستضافة: طريقتان للتحصيل عبر الإنترنت وعبئا عمل مختلفان. المعايير التي تحسم فعلًا — الحجم، والمبلغ، والفريق، والتخصيص.

مستعدون للتجربة بأنفسكم؟

أنشئوا حسابكم واستخلصوا في وضع الاختبار اليوم: مجانًا، ودون موافقة تنتظرونها. سؤال؟ يجيب فريقنا التجّار والمطوّرين على حد سواء.

  • مجاني ودون التزام
  • وضع الاختبار منذ التسجيل
  • لا موافقة تنتظرونها