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

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

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

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

جلسات الدفع

استخدم جلسات الدفع لبيع منتجات الاشتراك مع عملية دفع آمنة ومستضافة. قم بتمرير منتج الاشتراك الخاص بك في product_cart وأعد توجيه العملاء إلى checkout_url التي تم إرجاعها.
لا يمكنك خلط منتجات الاشتراك مع المنتجات لمرة واحدة في نفس جلسة الدفع.
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: '[email protected]',
      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 للحصول على إشعارات في الوقت الفعلي حول أي تغييرات في الاشتراك، مما يحافظ على حالة تطبيقك متزامنة دون الحاجة إلى استعلام واجهة برمجة التطبيقات.

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

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

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

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

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

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

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

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

التعامل مع ويب هوك subscription.on_hold

عندما تتلقى ويب هوك 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 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

مراقبة أحداث الويب هوك

بعد تحديث طريقة الدفع، راقب هذه أحداث الويب هوك:
  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نعمالحمولة الرئيسية للبيانات. انظر كائن البيانات

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

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

مرجع واجهة برمجة التطبيقات لتغيير الخطة

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

خيارات النسبة المئوية

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

1. prorated_immediately

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

2. full_immediately

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

3. difference_immediately

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

السلوك

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

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

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

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

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