Skip to main content
يوفّر adaptor ‏@dodopayments/fastify لتطبيق Fastify لديك ثلاثة معالجات مسارات: يعيد Checkout عناوين URL الخاصة بـ checkout، ويرسل CustomerPortal العميل إلى Customer Portal، ويتحقق Webhooks من طلبات webhook ويستدعي معالجات الأحداث لديك.

Checkout Handler

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

Customer Portal

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

Webhooks

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

التثبيت

1

Install the Package

شغّل الأمر التالي في جذر مشروعك:
تتطلب الحزمة Fastify 5.4.0 أو إصدارًا أحدث.
2

Set Up Environment Variables

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

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

تسجّل الأمثلة المسارات على نسخة Fastify تم إنشاؤها باستخدام Fastify(). يحتاج مسار webhook إلى نص الطلب الخام، لذلك يضيف المثال محلل نص داخل plugin لا يحتوي إلا على مسار webhook.
استخدم هذا المعالج لدمج checkout الخاصة بـ Dodo Payments في تطبيق Fastify لديك. وهو يدعم تدفقات الدفع static ‏(GET) وdynamic ‏(POST) وsession ‏(POST). يعيد Checkout() قيمة getHandler لتدفق static وقيمة postHandler لتدفقَي dynamic وsession. سجّل كل تدفق POST على مسار خاص به.

معالج مسار Checkout

يدعم adaptor تدفقات checkout الثلاثة الخاصة بـ Dodo Payments. عيّن type في إعدادات المعالج لاختيار التدفق الذي يقدمه المسار. يستجيب كل تدفق بصيغة JSON تحتوي على checkout_url ليفتحه العميل.
  • Static Payment Links: ‏type: "static"، GET. ينشئ payment link لمنتج واحد من query parameters، بعد التحقق من وجود المنتج.
  • Dynamic Payment Links: ‏type: "dynamic"، POST. ينشئ دفعة لمرة واحدة أو اشتراكًا باستخدام payment link، وفقًا لكون المنتج متكررًا أم لا.
  • Checkout Sessions: ‏type: "session"، POST. ينشئ checkout session من product cart وتفاصيل العميل. استخدم هذا التدفق لعمليات الدمج الجديدة.
يقبل Checkout الخيارات التالية: يعيد Checkout كائنًا يحتوي على معالجين. سجّل getHandler لـ GET عندما تكون قيمة type هي static، وسجّل postHandler لـ POST عندما تكون القيمة dynamic أو session.

Query Parameters المدعومة

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
يتم تمرير أي query parameter يبدأ بـ metadata_ إلى checkout باعتباره metadata، مثل metadata_orderId=123.
يسري disable flag فقط عندما تكون قيمته true ويحتوي الحقل المطابق على قيمة، مثل email مع disableEmail. يمرّر المعالج هذه المعلمات إلى static payment link.
إذا كان productId مفقودًا، يعيد المعالج استجابة 400. كما تؤدي query parameters غير الصالحة، أو عدم وجود المنتج في حسابك، إلى استجابة 400.

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

يعيد static checkout استجابة JSON تحتوي على checkout URL:
  • أرسل المعلمات في JSON body ضمن طلب POST.
  • يدعم الدفعات لمرة واحدة والدفعات المتكررة. يسترجع المعالج المنتج، ثم ينشئ اشتراكًا إذا كان المنتج متكررًا، ودفعة لمرة واحدة خلاف ذلك.
  • يحتاج body إلى 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 لعمليات الدمج الجديدة.

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

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

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

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

معالج مسار Customer Portal

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

Query Parameters

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

معالج مسار Webhook

يتحقق معالج webhook من كل طلب باستخدام webhook secret الخاص بك، الذي يتم تمريره باعتباره webhookKey، ثم يستدعي معالجات الأحداث لديك.
يحتاج معالج webhook إلى نص الطلب الخام كسلسلة نصية، لذلك أضف content type parser لـ application/json مع parseAs: 'string'. يطبّق Fastify parser على كل مسار ضمن النطاق الذي تضيفه إليه. أضفه داخل plugin يسجّل مسار webhook فقط، كما في المثال. عند إضافته إلى النسخة الجذرية، سيمرّر أيضًا سلسلة نصية إلى معالجات checkout التي تستخدم POST، والتي ستعيد بدورها 400.
  • Method: لا يُسمح إلا بطلبات POST. تعيد الطرق الأخرى 405.
  • Signature Verification: يتحقق من headers ‏webhook-id وwebhook-timestamp وwebhook-signature باستخدام webhookKey، وفق مواصفة Standard Webhooks. يعيد 401 عند فشل التحقق.
  • Payload Validation: يتم التحقق باستخدام Zod. يعيد 400 للـ payload غير الصالح.
  • Error Handling:
    • 401: توقيع غير صالح
    • 400: payload غير صالح
    • 500: خطأ داخلي أثناء التحقق
  • Event Routing: يستدعي onPayload لكل حدث، ثم يستدعي المعالج الخاص بنوع الحدث، ويعيد 200 عند اكتمالهما. لا يلتقط المعالج الأخطاء التي تطرحها معالجات الأحداث لديك.

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

كل معالج اختياري وغير متزامن. للاطلاع على payload الخاص بكل حدث، راجع Webhook Event Guide.

Prompt لـ LLM

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