Skip to main content

المتطلبات الأساسية

لدمج واجهة برمجة تطبيقات مدفوعات دودو، ستحتاج إلى:
  • حساب تاجر مدفوعات دودو
  • بيانات اعتماد واجهة برمجة التطبيقات (مفتاح API ومفتاح سرية webhook) من لوحة التحكم
للحصول على دليل أكثر تفصيلاً حول المتطلبات الأساسية، تحقق من هذا القسم.

تكامل واجهة برمجة التطبيقات

جلسات الدفع

استخدم جلسات الدفع Checkout Sessions لبيع منتجات الاشتراك من خلال صفحة دفع مستضافة وآمنة. مرّر منتج الاشتراك الخاص بك في product_cart وأعد توجيه العملاء إلى checkout_url.
Mixed Checkout: يمكنك دمج منتجات الاشتراك مع منتجات لمرة واحدة في نفس جلسة الدفع. يتيح ذلك حالات استخدام مثل رسوم الإعداد مع الاشتراكات، حزم الأجهزة مع برامج الخدمة السحابية، والمزيد. راجع دليل جلسات الدفع للحصول على أمثلة.

استجابة واجهة برمجة التطبيقات

فيما يلي مثال على الاستجابة:
إعادة توجيه العميل إلى checkout_url.

Webhooks

عند دمج الاشتراكات، ستستلم webhooks لمتابعة دورة حياة الاشتراك. تساعدك هذه webhooks في إدارة حالات الاشتراك وسيناريوهات الدفع بشكل فعال. لإعداد نقطة نهاية webhook الخاصة بك، يُرجى اتباع دليل التكامل التفصيلي.

أنواع أحداث الاشتراك

تتبع الأحداث التالية في webhook تغييرات حالة الاشتراك:
  1. subscription.active - تم تنشيط الاشتراك بنجاح.
  2. subscription.updated - تم تحديث كائن الاشتراك (يتم تشغيله عند تغيير أي حقل).
  3. subscription.on_hold - تم تعليق الاشتراك بسبب فشل التجديد.
  4. subscription.failed - فشل إنشاء الاشتراك أثناء إنشاء التفويض.
  5. subscription.renewed - تم تجديد الاشتراك لفترة الفوترة التالية.
لإدارة دورة حياة الاشتراكات بشكل موثوق، نوصي بتتبع هذه الأحداث الخاصة بالاشتراك.
استخدم subscription.updated للحصول على إشعارات في الوقت الفعلي حول أي تغييرات في الاشتراك، مما يبقي حالة التطبيق متزامنة دون الاستطلاع من API.

سيناريوهات الدفع

تدفق الدفع الناجح تعتمد إشعارات webhooks التي تتلقاها وتوقيتها على ما إذا كان المنتج يتضمن فترة تجريبية. الفوترة الفورية (0 أيام تجريبية):
  1. subscription.active: تتم الموافقة على التفويض وتفعيل الاشتراك.
  2. payment.succeeded: يؤكد عملية الخصم الأولى. توقّع وصوله خلال دقيقتين إلى 10 دقائق من إتمام الدفع.
مع فترة تجريبية:
  1. عند بدء الفترة التجريبية (إتمام الدفع): يتم تشغيل subscription.active بعد الموافقة على طريقة الدفع. لا يتم تحصيل أي مبلغ متكرر حتى الآن. يتم تأجيل الخصم الحقيقي الأول حتى انتهاء الفترة التجريبية.
  2. عند انتهاء الفترة التجريبية: يتم تحصيل المبلغ المتكرر، وتتلقى payment.succeeded مع subscription.renewed.
كل تجديد لاحق:
  • subscription.renewed: يتم تشغيله في كل دورة فوترة عند خصم دفعة التجديد، ودائمًا بالتزامن مع payment.succeeded. كما يتضمن next_billing_date المحدّث.
عند خصم مبلغ فعليًا لاشتراك، تتلقى subscription.renewed و payment.succeeded. استخدم subscription.renewed (بدلًا من payment.succeeded وحده) كإشارة لتمديد الوصول للدورة التالية.
سيناريوهات فشل الدفع
  1. فشل الاشتراك
  • subscription.failed - فشل إنشاء الاشتراك بسبب تعذّر إنشاء التفويض.
  • payment.failed - يشير إلى فشل الدفع.
  1. تعليق الاشتراك
  • subscription.on_hold - تم تعليق الاشتراك بسبب فشل دفعة التجديد أو فشل خصم تغيير الخطة.
  • عند تعليق الاشتراك، لن يتم تجديده تلقائيًا حتى يتم تحديث طريقة الدفع.
أفضل ممارسة: لتبسيط عملية التنفيذ، نوصي بمتابعة أحداث الاشتراك بشكل أساسي لإدارة دورة حياة الاشتراك.
للاطلاع على شرح كامل لقراءة error_code/error_message، وتحديد وقت إعادة المحاولة، وعرض حالات الفشل للعملاء، راجع معالجة حالات فشل الدفع.

subscription.failed مقابل subscription.on_hold

من السهل الخلط بين هذين الحدثين، لكنهما يتطلبان معالجة مختلفة تمامًا:
subscription.failed نهائي. لا يمكن إعادة تفعيل الاشتراك. يجب على العميل إنشاء اشتراك جديد. لا تمنح الاستحقاقات مطلقًا عند تشغيل هذا الحدث.

معالجة الاشتراك المعلّق

عندما يدخل الاشتراك في حالة on_hold، يجب تحديث طريقة الدفع لإعادة تفعيله. يشرح هذا القسم متى يتم تعليق الاشتراكات وكيفية معالجتها.

متى يتم تعليق الاشتراكات

يتم تعليق الاشتراك عندما:
  • تفشل دفعة التجديد: تفشل رسوم التجديد التلقائية بسبب عدم كفاية الرصيد أو انتهاء صلاحية البطاقة أو رفض البنك
  • تفشل رسوم تغيير الخطة: تفشل رسوم فورية أثناء ترقية الخطة أو تخفيضها
  • تفشل الموافقة على طريقة الدفع: يتعذّر اعتماد طريقة الدفع للرسوم المتكررة
لن يتم تجديد الاشتراكات في حالة on_hold تلقائيًا. يجب تحديث طريقة الدفع لإعادة تفعيل الاشتراك.

إعادة تفعيل الاشتراكات المعلّقة

لإعادة تفعيل اشتراك في حالة on_hold، استخدم Update Payment Method API. سيقوم ذلك تلقائيًا بما يلي:
  1. إنشاء رسوم بالمبالغ المستحقة المتبقية
  2. إنشاء فاتورة بالرسوم
  3. معالجة الدفع باستخدام طريقة الدفع الجديدة
  4. إعادة تفعيل الاشتراك إلى حالة active عند نجاح الدفع
1

Handle subscription.on_hold webhook

عند تلقي webhook من نوع subscription.on_hold، حدّث حالة تطبيقك وأبلغ العميل:
2

Update payment method

عندما يكون العميل مستعدًا لتحديث طريقة الدفع، استدعِ Update Payment Method API:
يمكنك أيضًا استخدام معرّف طريقة دفع موجود إذا كان العميل قد حفظ طرق دفع:
3

Monitor webhook events

بعد تحديث طريقة الدفع، راقب أحداث webhook التالية:
  1. payment.succeeded - نجح تحصيل المبالغ المستحقة المتبقية
  2. subscription.active - تمت إعادة تفعيل الاشتراك

نموذج لحمولة حدث اشتراك


تغيير خطط الاشتراك

يمكنك ترقية خطة الاشتراك أو تخفيضها باستخدام نقطة نهاية change plan API. يتيح لك ذلك تعديل منتج الاشتراك وكميته ومعالجة التقسيم النسبي.

Change Plan API Reference

للحصول على معلومات تفصيلية حول تغيير خطط الاشتراك، يُرجى الرجوع إلى وثائق Change Plan API.

خيارات التقسيم النسبي

عند تغيير خطط الاشتراك، يتوفر لديك خياران لمعالجة الرسوم الفورية:

1. prorated_immediately

  • يحسب المبلغ المقسّم نسبيًا بناءً على الوقت المتبقي في دورة الفوترة الحالية
  • يحمّل العميل الفرق فقط بين الخطة القديمة والجديدة
  • خلال الفترة التجريبية، ينقل المستخدم فورًا إلى الخطة الجديدة ويحمّل العميل المبلغ مباشرةً

2. full_immediately

  • يحمّل العميل مبلغ الاشتراك الكامل للخطة الجديدة
  • يتجاهل أي وقت أو أرصدة متبقية من الخطة السابقة
  • مفيد عندما تريد إعادة ضبط دورة الفوترة أو تحصيل المبلغ الكامل بغض النظر عن التقسيم النسبي

3. difference_immediately

  • عند الترقية، يتم تحميل العميل فورًا الفرق بين مبلغي الخطتين.
  • على سبيل المثال، إذا كانت الخطة الحالية بقيمة 30 دولارًا وقام العميل بالترقية إلى خطة بقيمة 80 دولارًا، فسيتم تحميله 50 دولارًا فورًا.
  • عند التخفيض، تتم إضافة المبلغ غير المستخدم من الخطة الحالية كرصيد داخلي وتطبيقه تلقائيًا على تجديدات الاشتراك المستقبلية.
  • على سبيل المثال، إذا كانت الخطة الحالية بقيمة 50 دولارًا وانتقل العميل إلى خطة بقيمة 20 دولارًا، فسيتم إضافة المبلغ المتبقي، وهو 30 دولارًا، إلى الرصيد واستخدامه في دورة الفوترة التالية.

4. do_not_bill

  • يطبّق تغيير الخطة فورًا، لكنه لا يفرض أي رسوم وقت التغيير.
  • تتم فوترة الخطة المحدّثة (والكمية/الإضافات) عند التجديد المجدول التالي، مع الحفاظ على تاريخ الفوترة الأصلي.
تُعيد أوضاع «التحصيل الآن» الثلاثة ضبط دورة الفوترة. تنقل prorated_immediately وdifference_immediately وfull_immediately قيمة next_billing_date للاشتراك إلى تاريخ التغيير. وحده do_not_bill يحافظ على تاريخ التجديد الأصلي، لكنه لا يفرض رسومًا فورية.

السلوك

  • عند استدعاء واجهة API هذه، يبدأ Dodo Payments فورًا تحصيل رسوم بناءً على خيار التقسيم النسبي المحدد
  • إذا كان تغيير الخطة تخفيضًا واستخدمت prorated_immediately، فسيتم حساب الأرصدة وإضافتها تلقائيًا إلى رصيد الاشتراك. وتكون هذه الأرصدة خاصة بذلك الاشتراك ولن تُستخدم إلا لمقاصة الدفعات المتكررة المستقبلية للاشتراك نفسه
  • يتجاوز خيار full_immediately حساب الأرصدة ويحصّل المبلغ الكامل للخطة الجديدة
اختر خيار التقسيم النسبي بعناية: استخدم prorated_immediately للفوترة العادلة التي تراعي الوقت غير المستخدم، أو full_immediately عندما تريد تحصيل المبلغ الكامل للخطة الجديدة بغض النظر عن دورة الفوترة الحالية.

معالجة الرسوم

  • عادةً ما تكتمل معالجة الرسوم الفورية التي تبدأ عند تغيير الخطة خلال أقل من دقيقتين
  • إذا فشلت هذه الرسوم الفورية لأي سبب، فسيتم تعليق الاشتراك تلقائيًا حتى حل المشكلة

الاشتراكات عند الطلب

تتيح لك الاشتراكات عند الطلب تحصيل الرسوم من العملاء بمرونة، وليس وفق جدول ثابت فقط. وهذه الميزة متاحة لجميع الحسابات.
لإنشاء اشتراك عند الطلب: لإنشاء اشتراك عند الطلب، استخدم نقطة نهاية API ‏POST /subscriptions وأدرج الحقل on_demand في نص الطلب. يتيح لك ذلك اعتماد طريقة دفع دون تحصيل فوري، أو تعيين سعر أولي مخصص. لتحصيل رسوم من اشتراك عند الطلب: بالنسبة إلى الرسوم اللاحقة، استخدم نقطة النهاية ‏POST /subscriptions//charge وحدد المبلغ المراد تحصيله من العميل لهذه المعاملة.
للحصول على دليل كامل خطوة بخطوة (بما في ذلك أمثلة الطلبات/الاستجابات وسياسات إعادة المحاولة الآمنة ومعالجة webhooks)، راجع دليل الاشتراكات عند الطلب.

أهم المعلومات حول فوترة الاشتراكات

اجعل مدة الاشتراك أطول من وتيرة الدفع. إذا كانت مدة الاشتراك تساوي وتيرة الدفع (مثلًا: المدة = شهر واحد، الوتيرة = شهر واحد)، يكون الاشتراك صالحًا لدورة واحدة ثم ينتقل إلى expired بدلًا من التجديد. للحصول على خطة شهرية مستمرة، عيّن مدة اشتراك طويلة (مثل 20 عامًا) مع وتيرة دفع شهرية.
تُثبّت العملة عند أول خصم ناجح. مرّر دائمًا billing_currency و billing_address.country صراحةً عند إنشاء checkout. إذا لم تحددهما، فسيتم اكتشافهما من عنوان IP الخاص بالعميل (Adaptive Currency)، وبمجرد إجراء الاشتراك لأول خصم له، تُثبّت العملة طوال فترة صلاحيته. ولا يمكن للعميل تغييرها إذا سافر لاحقًا.
تتطلب الفترات التجريبية تفويضًا بقيمة ‏$0، وليس تحصيلًا. عندما يتضمن الاشتراك فترة تجريبية، ينشئ بدء الفترة التجريبية تفويضًا بقيمة ‏$0 لحفظ البطاقة؛ ويحدث الخصم الحقيقي الأول عند انتهاء الفترة التجريبية. في قائمة المدفوعات، يظهر الاشتراك خلال الفترة التجريبية بدفعة واحدة بالضبط تتضمن amount: 0.
دورة حياة الاشتراك: on_hold = فشل التجديد (قابل للاسترداد: اطلب من العميل تحديث طريقة الدفع؛ وتنطبق محاولات إعادة التحصيل). expired = انتهت المدة دون تجديد ولا يمكن إعادة تفعيله. يجب على العميل إعادة الاشتراك. cancelled = أنهى العميل أو التاجر الاشتراك. معظم حالات فشل التجديد هي عمليات رفض من جهة المُصدر (عدم كفاية الرصيد أو رفض البطاقة)، وليست خطأً من Dodo.
تعمل البطاقات الهندية وفق تفويض إلكتروني من RBI. قد تستغرق الرسوم خارج الجلسة (التجديدات ورسوم تغيير الخطة) نحو 48 ساعة لتسويتها، وتتطلب عمليات الخصم التلقائي المتكررة التي تتجاوز ₹15,000 مصادقة جديدة من العميل (لذلك لا يمكن لترقية تتجاوز هذا الحد استخدام التفويض الحالي). أثناء وجود إحدى الرسوم في حالة processing، تفشل رسوم ثانية على الاشتراك نفسه مع ظهور الرسالة “Cannot create new charge as previous payment is not successful yet.” أما البطاقات غير الهندية فتتم المصادقة عليها بشكل شبه فوري.
تبلغ رسوم الاشتراكات حدًا أدنى قدره ‏$1 (أو ما يعادله بالعملة). يتم رفض المبالغ من $0.01–$0.99 مع product_price: value out of range؛ ولا يُسمح إلا بـ $0، من خلال إعداد mandate_only عند الطلب.

مرجع API ذي صلة

Create Subscription

مرجع API لإنشاء منتجات الاشتراك وإدارة دورة حياة الاشتراك

Change Subscription Plan

مرجع API لترقية خطط الاشتراك أو تخفيضها أو تغييرها باستخدام خيارات التقسيم النسبي

Update Payment Method

مرجع API لتحديث طرق الدفع وإعادة تفعيل الاشتراكات المعلّقة

Patch Subscription

مرجع API لتحديث تفاصيل الاشتراك وإعداده
آخر تعديل في ٣١ يوليو ٢٠٢٦