الانتقال إلى المحتوى الرئيسي

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

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

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

جلسات الدفع

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

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function main() {
  const session = await client.checkoutSessions.create({
    product_cart: [
      { product_id: 'prod_subscription_monthly', quantity: 1 }
    ],
    // Optional: configure trials for subscription products
    subscription_data: { trial_period_days: 14 },
    customer: {
      email: 'subscriber@example.com',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

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

فيما يلي مثال على الاستجابة:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
أعد توجيه العميل إلى checkout_url.

الويب هوكس

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

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

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

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

تدفق الدفع الناجح عندما ينجح الدفع، ستتلقى الويب هوكس التالية:
  1. subscription.active - يشير إلى تفعيل الاشتراك
  2. payment.succeeded - يؤكد الدفع الأولي:
    • بالنسبة للفوترة الفورية (0 أيام تجريبية): توقع خلال 2-10 دقائق
    • بالنسبة للأيام التجريبية: فور انتهاء تلك الفترة
  3. subscription.renewed - يشير إلى خصم الدفع وتجديده للدورة التالية. (بشكل أساسي، كلما تم خصم الدفع لمنتجات الاشتراك، ستحصل على webhook subscription.renewed مع payment.succeeded)
سيناريوهات فشل الدفع
  1. فشل الاشتراك
  • subscription.failed - فشل إنشاء الاشتراك بسبب فشل إنشاء التفويض.
  • payment.failed - يشير إلى فشل الدفع.
  1. تعليق الاشتراك
  • subscription.on_hold - يتم تعليق الاشتراك بسبب فشل دفع التجديد أو فشل رسوم تغيير الخطة.
  • عندما يتم تعليق اشتراك، لن يتجدد تلقائيًا حتى يتم تحديث وسيلة الدفع.
أفضل ممارسة: لتبسيط التنفيذ، نوصي بالتركيز بشكل أساسي على تتبع أحداث الاشتراك لإدارة دورة حياة الاشتراك.
For a complete walkthrough of reading error_code/error_message, deciding when to retry, and surfacing failures to customers, see Handle Payment Failures.

subscription.failed مقابل subscription.on_hold

هذان الحدثان من السهل الخلط بينهما، لكنهما يتطلبان معالجة مختلفة تمامًا:
الحدثمتى يحدثالحالةقابل للاسترداد؟ماذا تفعل
subscription.failedلم يمكن إنشاء التفويض الأولي عند إنشاء الاشتراكfailedلا — نهائيلا تمنح الوصول. اطلب من العميل بدء اشتراك جديد بطريقة دفع مختلفة.
subscription.on_holdفشل دفع التجديد (أو رسوم تغيير الخطة) على اشتراك نشط بالفعلon_holdنعماسترد عن طريق تحديث طريقة الدفع؛ انظر التعامل مع الاشتراك المعلق أدناه.
subscription.failed نهائي — لا يمكن إعادة تفعيل الاشتراك. يجب على العميل إنشاء اشتراك جديد. لا تمنح الامتيازات عند حدوث هذا الحدث.

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

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

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

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

إعادة تفعيل الاشتراكات من الانتظار

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

Handle subscription.on_hold webhook

عند استلامك لويب هوك subscription.on_hold، قم بتحديث حالة التطبيق وأبلغ العميل:
// Webhook handler
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'subscription.on_hold') {
    const subscription = event.data;
    
    // Update subscription status in your database
    await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
    
    // Notify customer to update payment method
    await sendEmailToCustomer(subscription.customer_id, {
      subject: 'Payment Required - Subscription On Hold',
      message: 'Your subscription is on hold. Please update your payment method to continue service.'
    });
  }
  
  res.json({ received: true });
});
2

Update payment method

عندما يكون العميل جاهزًا لتحديث طريقة الدفع الخاصة به، قم باستدعاء واجهة برمجة التطبيقات Update Payment Method:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created for remaining dues:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
}
يمكنك أيضًا استخدام معرف طريقة دفع موجودة إذا كان لدى العميل طرق دفع محفوظة:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitor webhook events

بعد تحديث طريقة الدفع، راقب هذه الأحداث الويب هوك:
  1. payment.succeeded - نجاح تحصيل التكاليف المتبقية
  2. subscription.active - تمت إعادة تفعيل الاشتراك
if (event.type === 'payment.succeeded') {
  const payment = event.data;
  
  // Check if this payment is for an on_hold subscription
  if (payment.subscription_id) {
    // Wait for subscription.active webhook to confirm reactivation
  }
}

if (event.type === 'subscription.active') {
  const subscription = event.data;
  
  // Update subscription status in your database
  await updateSubscriptionStatus(subscription.subscription_id, 'active');
  
  // Restore customer access
  await restoreCustomerAccess(subscription.customer_id);
  
  // Notify customer of successful reactivation
  await sendEmailToCustomer(subscription.customer_id, {
    subject: 'Subscription Reactivated',
    message: 'Your subscription has been reactivated successfully.'
  });
}

مثال على حمولة حدث الاشتراك


الخاصيةالنوعمطلوبالوصف
business_idstringنعمالمعرف الفريد للمشروع
timestampstringنعمالعلامة الزمنية لحدوث الحدث (ليس بالضرورة عند تسليمه)
typestringنعمنوع الحدث. انظر أنواع الأحداث
dataobjectنعمالحمولة الرئيسية للبيانات. انظر كائن البيانات

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

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

Change Plan API Reference

لمزيد من المعلومات التفصيلية حول تغيير خطط الاشتراك، يرجى الرجوع إلى وثائق واجهة برمجة التطبيقات لتغيير الخطة.

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

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

1. prorated_immediately

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

2. full_immediately

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

3. difference_immediately

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

السلوك

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

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

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

الاشتراكات بحسب الطلب

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

مرجع API المرتبط

Create Subscription

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

Change Subscription Plan

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

Update Payment Method

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

Patch Subscription

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