Skip to main content
يوفر المهايئ @dodopayments/express لتطبيق Express ثلاثة معالجات للمسارات: يعيد checkoutHandler عناوين URL لـ checkout، ويرسل CustomerPortal العميل إلى Customer Portal، ويتحقق Webhooks من طلبات webhook ويستدعي معالجات الأحداث لديك.

Checkout Handler

أنشئ payment links وcheckout sessions من تطبيق Express لديك.

Customer Portal

اسمح للعملاء بإدارة اشتراكاتهم وتفاصيلهم.

Webhooks

تحقّق من أحداث webhook الخاصة بـ Dodo Payments وعالجها.

التثبيت

1

Install the Package

شغّل الأمر التالي في جذر مشروعك:
2

Set Up Environment Variables

أنشئ ملف .env في جذر مشروعك:
أنشئ مفتاح API ضمن Developer → API Keys. أضف نقطة نهاية webhook ضمن Developer → Webhooks وانسخ سر التوقيع الخاص بها إلى DODO_PAYMENTS_WEBHOOK_KEY. أثناء التطوير، استخدم مفتاح API في وضع الاختبار مع DODO_PAYMENTS_ENVIRONMENT=test_mode، لأن مفتاح وضع الاختبار يعمل فقط مع وضع الاختبار. DODO_PAYMENTS_RETURN_URL اختياري.
لا ترفع ملف .env أو الأسرار إلى نظام التحكم في الإصدارات.

أمثلة على معالجات المسارات

تسجّل الأمثلة المسارات في تطبيق Express أُنشئ باستخدام express(). تقرأ معالجات checkout التي تستخدم POST ومعالج webhook القيمة req.body، لذلك يسجّل كل مثال express.json() قبل مساراته.
استخدم هذا المعالج لدمج checkout الخاص بـ Dodo Payments في تطبيق Express لديك. وهو يدعم تدفقات الدفع الثابتة (GET) والديناميكية (POST) وتدفقات الجلسات (POST). سجّل كل تدفق POST في مسار مستقل، لأن أول معالج يُسجّل لمسار ما يستجيب لكل طلب يُرسل إليه.

معالج مسار Checkout

يدعم المهايئ تدفقات checkout الثلاثة في Dodo Payments. اضبط type في إعدادات المعالج لاختيار التدفق الذي يقدمه المسار. يستجيب كل تدفق ببيانات JSON تحتوي على checkout_url ليفتحه العميل.
  • Payment Links الثابتة: type: "static"، GET. ينشئ payment link لمنتج واحد من معلمات الاستعلام بعد التحقق من وجود المنتج.
  • Payment Links الديناميكية: type: "dynamic"، POST. ينشئ دفعة لمرة واحدة أو اشتراكًا باستخدام payment link، وفقًا لما إذا كان المنتج متكررًا.
  • Checkout Sessions: type: "session"، POST. ينشئ checkout session من سلة منتجات وتفاصيل العميل. استخدم هذا التدفق للتكاملات الجديدة.
يأخذ checkoutHandler الخيارات التالية: سجّل المعالج لـ GET عندما تكون قيمة type هي static، ولـ POST عندما تكون type هي dynamic أو session. يعيد المعالج الحالة 405 للطرق الأخرى.

معلمات الاستعلام المدعومة

string
مطلوب
معرّف المنتج، مثل ?productId=pdt_nZuwz45WAs64n3l07zpQR.
integer
افتراضي:"1"
كمية المنتج.
string
الاسم الكامل للعميل. يتم تجاهله إذا تم توفير firstName أو lastName.
string
الاسم الأول للعميل.
string
اسم العائلة للعميل.
string
عنوان البريد الإلكتروني للعميل.
string
بلد العميل، بوصفه رمز ISO 3166-1 alpha-2.
string
عنوان الشارع للعميل.
string
مدينة العميل.
string
ولاية أو مقاطعة العميل.
string
الرمز البريدي للعميل.
boolean
اضبط القيمة على true لتعطيل حقل الاسم الكامل.
boolean
اضبط القيمة على true لتعطيل حقل الاسم الأول.
boolean
اضبط القيمة على true لتعطيل حقل اسم العائلة.
boolean
اضبط القيمة على true لتعطيل حقل البريد الإلكتروني.
boolean
اضبط القيمة على true لتعطيل حقل البلد.
boolean
اضبط القيمة على true لتعطيل حقل العنوان.
boolean
اضبط القيمة على true لتعطيل حقل المدينة.
boolean
اضبط القيمة على true لتعطيل حقل الولاية.
boolean
اضبط القيمة على true لتعطيل حقل الرمز البريدي.
string
عملة الدفع، مثل USD.
boolean
افتراضي:"true"
إظهار محدد العملة أو إخفاؤه.
number
يثبّت المبلغ المُحصّل، بوحدات العملة الأساسية، مثل 12.5 مقابل $12.50. يعمل مع منتجات Pay What You Want فقط، ويتم تجاهله إذا كان أقل من الحد الأدنى لسعر المنتج.
boolean
افتراضي:"true"
إظهار قسم الخصومات أو إخفاؤه.
string
تُمرَّر أي معلمة استعلام تبدأ بـ metadata_ إلى checkout كبيانات وصفية، مثل metadata_orderId=123.
يصبح خيار التعطيل فعالًا فقط عندما تكون قيمته true ويحتوي الحقل المطابق على قيمة، مثل email مع disableEmail. يمرّر المعالج هذه المعلمات إلى static payment link.
إذا كانت productId مفقودة، يعيد المعالج استجابة 400. كما تؤدي معلمات الاستعلام غير الصالحة أو عدم وجود منتج في حسابك إلى استجابة 400.

تنسيق الاستجابة

يعيد checkout الثابت استجابة JSON تحتوي على عنوان URL لـ checkout:
  • أرسل المعلمات كنص JSON في طلب POST.
  • يدعم الدفعات لمرة واحدة والدفعات المتكررة. يسترجع المعالج المنتج، ثم ينشئ اشتراكًا إذا كان المنتج متكررًا، ودفعة لمرة واحدة خلاف ذلك.
  • يحتاج النص إلى billing (مع street وcity وstate وcountry وzipcode) وcustomer، بالإضافة إلى product_id (مع quantity اختياري) أو product_cart. تحتاج الاشتراكات إلى product_id.
  • يمرّر المعالج أيضًا metadata وallowed_payment_method_types وbilling_currency وdiscount_codes (أو discount_code المهمل) وreturn_url وshow_saved_payment_methods وtax_id. وبالنسبة إلى الاشتراكات، يمرّر أيضًا addons وon_demand وtrial_period_days. ويتجاهل الحقول الأخرى.
  • للحصول على تفاصيل الحقول، راجع:
يستدعي Dynamic Checkout نقطتي النهاية المهملتين POST /payments وPOST /subscriptions. استخدم Checkout Sessions للتكاملات الجديدة.

تنسيق الاستجابة

يعيد checkout الديناميكي استجابة JSON تحتوي على payment link بوصفه عنوان URL لـ checkout:
أرسل حمولة checkout session كنص JSON. ينشئ المعالج checkout session يعالج تدفق الدفع الكامل للمشتريات لمرة واحدة والاشتراكات، ثم يعيد checkout_url. الحقل product_cart مطلوب ويجب أن يحتوي على منتج واحد على الأقل.يعمل كل checkout_url مرة واحدة وينتهي بعد 24 ساعة، أو بعد 15 دقيقة عند تمرير confirm: true. لا يعيد session المنشأ باستخدام payment_method_id أي checkout_url، لذلك يستجيب المعالج بالحالة 400.راجع دليل تكامل Checkout Sessions لمزيد من التفاصيل والقائمة الكاملة للحقول المدعومة.

تنسيق الاستجابة

تعيد Checkout sessions استجابة JSON تحتوي على عنوان URL لـ checkout:

معالج مسار Customer Portal

ينشئ معالج مسار Customer Portal جلسة Customer Portal للعميل الموجود في customer_id ويعيد توجيه الطلب إلى رابط البوابة. يأخذ CustomerPortal خياري bearerToken وenvironment، مثل checkoutHandler. إذا تعذّر على Dodo Payments إنشاء الجلسة، يعيد المعالج الحالة 500.

معلمات الاستعلام

string
مطلوب
معرّف العميل لجلسة البوابة، مثل ?customer_id=cus_123.
boolean
إذا تم ضبطه على true، يُرسل بريدًا إلكترونيًا إلى العميل يحتوي على رابط البوابة.
يعيد 400 إذا كانت customer_id مفقودة. لا يصادق المعالج على الطلب، ويفتح البوابة لأي customer_id يتلقاه؛ لذلك ضع المسار خلف نظام المصادقة الخاص بك ومرّر معرّف العميل الذي سجّل الدخول فقط.

معالج مسار Webhook

يتحقق معالج webhook من كل طلب باستخدام سر webhook الخاص بك، الممرّر كـ webhookKey، ثم يستدعي معالجات الأحداث لديك.
سجّل express.json() قبل مسار webhook. يتحقق المعالج من التوقيع مقابل req.body، لذلك يرفض كل طلب ما لم يكن النص قد حُلّل كـ JSON. لا تستخدم express.raw() لهذا المسار.
  • الطريقة: لا تُدعم إلا طلبات POST. تعيد الطرق الأخرى الحالة 405.
  • التحقق من التوقيع: يتحقق من رؤوس webhook-id وwebhook-timestamp وwebhook-signature باستخدام webhookKey، وفق مواصفة Standard Webhooks. يعيد 401 عند فشل التحقق.
  • التحقق من الحمولة: يتم التحقق باستخدام Zod. يعيد 400 للحمولات غير الصالحة.
  • معالجة الأخطاء:
    • 401: توقيع غير صالح
    • 400: حمولة غير صالحة
    • 500: خطأ داخلي أثناء التحقق
  • توجيه الأحداث: يستدعي onPayload لكل حدث، ثم يستدعي المعالج الخاص بنوع الحدث، ويعيد 200 عند اكتمالهما. لا يلتقط المعالج الأخطاء التي تطرحها معالجات الأحداث لديك.

معالجات أحداث Webhook المدعومة

كل معالج اختياري وغير متزامن. للاطلاع على حمولة كل حدث، راجع دليل أحداث Webhook.

مطالبة لـ LLM

آخر تعديل في ٢٦ سبتمبر ٢٠٢٦