GitHub Repository
قالب Go + Dodo Payments الجاهز والبسيط
نظرة عامة
إن boilerplate الخاص بـ Go هو خادم Go بسيط يبيع منتجاتك في Dodo Payments من صفحة تسعير. ينشئ جلسات checkout، ويتحقق من webhooks ويعالجها، ويفتح Customer Portal. استنسخه كنقطة بداية لخلفية Go الخاصة بك.يتطلب boilerplate الإصدار Go 1.24.4 أو أحدث، وهو الإصدار المحدد في
go.mod. ويستخدم تخطيطًا يتكون من cmd وinternal وtemplates، ويعرض صفحة التسعير باستخدام قوالب HTML في Go، ويستدعي Dodo Payments API من خلال SDK dodopayments-go.الميزات
- الإعداد السريع: استنسخ المستودع، وأضف مفاتيح API إلى
.env، ثم شغّل الخادم باستخدامmake run. - تكامل الدفع: تدفق checkout ينشئ جلسات checkout باستخدام SDK
dodopayments-go. - واجهة مستخدم عصرية: صفحة تسعير ذات سمة داكنة، مبنية باستخدام قوالب HTML في Go وTailwind CSS.
- معالجة Webhook: يتحقق من توقيع كل webhook قبل معالجة الحدث.
- Customer Portal: إدارة الاشتراكات ذاتيًا من خلال Customer Portal.
- أفضل ممارسات Go: تخطيط مشروع منظم باستخدام
cmdوinternalوtemplates. - Checkout مملوء مسبقًا: يمرر اسم العميل وبريده الإلكتروني إلى checkout، حتى لا يضطر العميل إلى إدخالهما مرة أخرى.
المتطلبات الأساسية
قبل البدء، تحتاج إلى:- Go 1.24.4 أو أحدث. تحقق من الإصدار باستخدام
go version. - حساب Dodo Payments لإنشاء API key ومفتاح توقيع webhook في لوحة المعلومات.
- منتج واحد على الأقل تم إنشاؤه ضمن Products في لوحة المعلومات.
البدء السريع
1
Clone the Repository
2
Install Dependencies
make install الأمر go mod download ثم go mod tidy. لتنزيل الوحدات بدون make، شغّل:3
Get API Credentials
سجّل حسابًا في Dodo Payments، ثم انسخ المفتاحين من لوحة المعلومات:
- API Key: Developer → API Keys
- Webhook Key: Developer → Webhooks. لكل webhook endpoint مفتاح توقيع خاص به. لإنشاء endpoint يصل إلى خادمك المحلي، راجع اختبار Webhooks محليًا.
4
Configure Environment Variables
أنشئ ملف عيّن هذه القيم في يقرأ الخادم هذه المتغيرات عند بدء التشغيل:
.env في جذر المشروع باستخدام القالب:.env:.env
يتوقف الخادم عند بدء التشغيل إذا كان أي من المفتاحين المطلوبين مفقودًا. يعيّن
.env.example كلًا من PORT وDODO_PAYMENTS_RETURN_URL إلى المنفذ 8080. تستخدم هذه الصفحة المنفذ 8000، لذا عيّن كليهما إلى 8000 كما هو موضح، أو استبدل 8000 بـ 8080 في الأوامر الموجودة في هذه الصفحة.5
Add Your Products
استبدل المنتج النموذجي في يعيّن
internal/lib/products.go بمنتجاتك. انسخ معرّف كل منتج من Products في لوحة المعلومات:Price السعر الذي تعرضه صفحة التسعير فقط، بأصغر وحدة للعملة: يعرض 9999 بالشكل $99.99. يفرض checkout سعر المنتج في Dodo Payments.6
Run the Development Server
make run الخادم داخل bin/server ثم يشغّله. لتشغيل الخادم دون إنشاء ملف ثنائي أولًا، شغّل:سترى صفحة تسعير ذات سمة داكنة تعرض منتجاتك، وتكون جاهزة للشراء.
بنية المشروع
يحتوي المستودع على التخطيط التالي:API Endpoints
يتضمن boilerplate نقاط النهاية المُعدّة مسبقًا التالية:التخصيص
تحديث معلومات المنتج
حرّرinternal/lib/products.go لتغيير ما يلي:
- معرّفات المنتجات (من Products في لوحة معلومات Dodo Payments الخاصة بك)
- الأسماء
- الأسعار المعروضة في صفحة التسعير
- الميزات
- الأوصاف
/mo إلى كل سعر، ويعرض Custom بدلًا من السعر عندما تكون قيمة Price هي 100000 أو أكبر. لتغيير ذلك، حرّر templates/index.html.
ملء بيانات العميل مسبقًا
في.env، ترسل الدالة handleCheckout بيانات عميل ثابتة إلى /api/checkout. استبدلها ببيانات المستخدم الذي سجّل دخوله:
handlePortal استخدام بيانات العميل هذه، وتعود إلى الاسم والبريد الإلكتروني النموذجيين نفسيهما. في تطبيق إنتاجي، مرّر هذه القيم من نظام المصادقة لديك إلى كلتا الدالتين.
Webhook Events
يتحققinternal/api/webhook.go من كل طلب باستخدام client.Webhooks.Unwrap والمفتاح الموجود في DODO_PAYMENTS_WEBHOOK_KEY، ثم يوجّه الحدث حسب type الخاص به. لهذه الأحداث معالج، ويسجّل كل معالج بيانات الحدث:
يقبل المعالج أيضًا
subscription.on_hold وsubscription.failed وsubscription.expired وsubscription.plan_changed دون تنفيذ أي إجراء، ويسجّل كل نوع حدث آخر باعتباره غير مُعالج. ويستجيب بالرمز 200 لكل حدث تم التحقق منه. للاطلاع على جميع أنواع الأحداث، راجع دليل أحداث Webhook.
أضف منطق نشاطك التجاري إلى دوال المعالجة من أجل:
- تحديث أذونات المستخدمين في قاعدة بياناتك
- إرسال رسائل تأكيد بالبريد الإلكتروني
- توفير الوصول إلى المنتجات الرقمية
- تتبع التحليلات والمقاييس
اختبار Webhooks محليًا
لا يستطيع Dodo Payments الوصول إلىlocalhost. لتلقي webhooks أثناء التطوير، اكشف خادمك المحلي باستخدام نفق مثل ngrok:
/api/webhook:
DODO_PAYMENTS_WEBHOOK_KEY، ثم أعد تشغيل الخادم.
النشر
الإنشاء للإنتاج
يُجمّعmake build الخادم داخل bin/server:
make، شغّل:
النشر إلى Vercel
[.env إلى إعدادات مشروع Vercel، لأن .env غير موجود في المستودع. ثم عيّن webhook endpoint في لوحة المعلومات إلى https://yourdomain.com/api/webhook.
Docker
أنشئ ملفDockerfile في جذر المشروع. يجب أن تستخدم مرحلة الإنشاء Go 1.24.4 أو أحدث لمطابقة go.mod:
templates/ إلى جانب الملف الثنائي، لأن الخادم يحمّل القوالب من دليل العمل. أنشئ الصورة وشغّلها:
PORT من .env، لذا أبقِ PORT=8000 متطابقًا مع تعيين المنفذ.
اعتبارات الإنتاج
استكشاف الأخطاء وإصلاحها
Build errors or missing dependencies
Build errors or missing dependencies
تحقق من أن
go version يعرض Go 1.24.4 أو أحدث، ثم نزّل الوحدات مرة أخرى:Checkout session creation fails
Checkout session creation fails
الأسباب الشائعة:
- معرّف المنتج غير صالح. تحقق من وجوده ضمن Products في الوضع نفسه المستخدم مع API key.
- API key أو
DODO_PAYMENTS_ENVIRONMENTفي.envغير صحيح. يحتاج مفتاح وضع الاختبار إلىtest_mode. - لمعرفة الخطأ الدقيق، راجع سجلات الخادم. يسجّل المعالج كل طلب فاشل قبل أن يعيد
500.
Webhooks not receiving events
Webhooks not receiving events
للاختبار المحلي، اكشف خادمك باستخدام ngrok:عيّن عنوان URL الخاص بـ webhook في لوحة معلومات Dodo Payments إلى عنوان URL الخاص بـ ngrok. ثم عيّن
DODO_PAYMENTS_WEBHOOK_KEY في .env إلى مفتاح توقيع ذلك endpoint. إذا سجّل الخادم webhook verification failed، فهذا يعني أن المفتاح لا يطابق endpoint.Templates not loading
Templates not loading
يحمّل الخادم
templates/base.html وtemplates/index.html من دليل العمل. شغّل الخادم من جذر المشروع، أو غيّر مسارات القوالب في cmd/server/main.go.تعلّم المزيد
Go SDK
توثيق Go SDK الكامل
Webhooks Documentation
تعرّف على جميع أحداث webhook وأفضل الممارسات
Checkout Sessions
تعمّق في إعدادات جلسة checkout
API Reference
توثيق Dodo Payments API الكامل
الدعم
للحصول على المساعدة بشأن boilerplate:- اطرح أسئلتك في مجتمع Discord.
- راجع مستودع GitHub للاطلاع على المشكلات والتحديثات.
- تواصل مع فريق الدعم.