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

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

لدمج واجهة برمجة تطبيقات مدفوعات دودو، ستحتاج إلى:
  • حساب تاجر مدفوعات دودو
  • بيانات اعتماد واجهة برمجة التطبيقات (مفتاح 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 - يتم تعليق الاشتراك بسبب فشل دفع التجديد أو فشل رسوم تغيير الخطة.
  • عندما يتم تعليق اشتراك، لن يتجدد تلقائيًا حتى يتم تحديث وسيلة الدفع.
أفضل ممارسة: لتبسيط التنفيذ، نوصي بالتركيز بشكل أساسي على تتبع أحداث الاشتراك لإدارة دورة حياة الاشتراك.

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

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

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

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

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

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

Handle subscription.on_hold webhook

عندما تتلقى 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 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 وحدد المبلغ الذي سيتم فرضه على العميل لتلك المعاملة.
للحصول على دليل كامل خطوة بخطوة — بما في ذلك أمثلة الطلب/الاستجابة، سياسات إعادة المحاولة الآمنة، ومعالجة الويب هوك — راجع دليل الاشتراكات حسب الطلب.