GitHub Repository
شيفرة أساسية بسيطة للاشتراكات باستخدام Next.js وSupabase وDodo Payments.
Live Demo
استكشف العرض التجريبي المنشور.
نظرة عامة
البدء الجاهز لاشتراكات Supabase هو تطبيق Next.js 15 وReact 19 يبيع الاشتراكات باستخدام Dodo Payments. يوفر Supabase تسجيل الدخول عبر Google OAuth وقاعدة بيانات Postgres، بينما يعرّف Drizzle ORM المخطط. تستقبل Supabase Edge Function خطافات الويب من Dodo Payments وتخزّن عمليات الدفع والاشتراكات، وتعرض لوحة تحكم أساسية خطة كل مستخدم وفواتيره. إذا كنت تحتاج فقط إلى معالجات مسارات checkout وCustomer Portal وخطافات الويب لتطبيق موجود، فاستخدم بدلًا من ذلك محوّلًا لإطار العمل:Next.js Adaptor
Express Adaptor
المتطلبات الأساسية
قبل البدء، تحتاج إلى:- Node.js 18 أو إصدار أحدث، أو Bun 1.0 أو إصدار أحدث.
- مشروع Supabase. تحتاج إلى عنوان URL الخاص به، وanon key، وservice role key، وسلسلة اتصال قاعدة البيانات.
- حساب Dodo Payments، للحصول على API key وسر توقيع خطاف الويب.
- عميل Google Cloud OAuth، للحصول على Client ID وClient Secret.
البدء السريع
1
Clone and Install
استنسخ المستودع، ثم ثبّت التبعيات باستخدام Bun أو npm أو pnpm:
2
Create a Supabase Project
أنشئ مشروع Supabase. تستخدم الخطوات اللاحقة مرجع المشروع الخاص به، وهو النطاق الفرعي في
https://[your-project-ref].supabase.co. انسخ القيم التالية:NEXT_PUBLIC_SUPABASE_URL، عنوان URL للمشروعNEXT_PUBLIC_SUPABASE_ANON_KEY، مفتاح anonSUPABASE_SERVICE_ROLE_KEY، مفتاح service roleDATABASE_URL، سلسلة اتصال قاعدة البيانات
3
Configure Google OAuth
في Google Cloud، أضف عنوان URI لإعادة التوجيه المصرّح به هذا إلى عميل OAuth:
https://[your-project-ref].supabase.co/auth/v1/callback. بعد ذلك، في Supabase Auth، فعّل موفّر Google باستخدام Client ID وClient Secret.4
Configure Dodo Payments
مع إيقاف مفتاح Live Mode في الشريط الجانبي، أنشئ API key ضمن Developer → API Keys في لوحة تحكم Dodo Payments. أبقِ
DODO_PAYMENTS_ENVIRONMENT مضبوطًا على test_mode أثناء التطوير.5
Add the Webhook in Dodo Payments
ضمن Developer → Webhooks، أضف نقطة نهاية باستخدام عنوان URL هذا. ستنشر الدالة التي تخدمها في خطوة لاحقة.حدّد أحداث الدفع والاشتراك التي تتعامل معها الدالة:
- أحداث الدفع:
payment.succeededوpayment.failedوpayment.processingوpayment.cancelled - أحداث الاشتراك:
subscription.activeوsubscription.plan_changedوsubscription.renewedوsubscription.on_holdوsubscription.cancelledوsubscription.expiredوsubscription.failed
DODO_WEBHOOK_SECRET.6
Create .env.local
أنشئ ملف يقرأ تطبيق Next.js كل متغير في هذا الملف باستثناء
.env.local في الدليل الجذر:DODO_WEBHOOK_SECRET. تقرأ Edge Function المتغير DODO_WEBHOOK_SECRET من أسرار Supabase، التي تضبطها عند نشرها.7
Provision the Database Schema
ادفع مخطط Drizzle إلى قاعدة بيانات Supabase:
الجداول التي أُنشئت:
users وsubscriptions وpayments.8
Deploy the Webhook Function
سجّل الدخول إلى Supabase، وخزّن سر التوقيع باعتباره سرًا للدالة، وانشر Edge Function يشغّل البرنامج النصي تعني استجابة
dodo-webhook. استبدل [your-project-ref] بمرجع مشروعك:deploy:webhook supabase functions deploy dodo-webhook --no-verify-jwt، بحيث يمكن لـ Dodo Payments استدعاء الدالة من دون رمز مصادقة Supabase. يوفّر Supabase المتغيرين SUPABASE_URL وSUPABASE_SERVICE_ROLE_KEY للدالة تلقائيًا.للتحقق من النشر، أرسل طلبًا غير موقّع:cURL
400 مع Invalid webhook signature أن الدالة قيد التشغيل وأن سرها مضبوط. وتعني استجابة 500 مع Server configuration error أن DODO_WEBHOOK_SECRET غير مضبوط. لإرسال حدث اختبار موقّع، افتح نقطة النهاية في Developer → Webhooks واستخدم علامة التبويب Testing.9
Create Products and Features
ضمن Products في لوحة تحكم Dodo Payments، انقر على Add Product لإنشاء منتج اشتراك لكل خطة. اختياريًا، لإدراج ميزات الخطة في التطبيق، أضف إدخال بيانات وصفية بالمفتاح قيم البيانات الوصفية هي سلاسل نصية أو أرقام أو قيم منطقية، لذا خزّن المصفوفة كسلسلة JSON. تحلّل واجهة التسعير قيمة
features ومصفوفة JSON من السلاسل النصية كقيمتها. ستبدو البيانات الوصفية للمنتج كما يلي:features وتعرض كل عنصر.10
Run the Dev Server
أصبح لديك الآن هيكل SaaS عامل للاشتراكات، ومجهّز باستخدام Supabase وDodo Payments. للتأكد من عمله من البداية إلى النهاية، اشترك في خطة باستخدام بطاقة اختبار. بعد وصول خطاف الويب، تعرض لوحة التحكم خطتك الجديدة.
ما يتضمنه المشروع
- المصادقة عبر Supabase، مع إعداد Google OAuth
- checkout للاشتراكات عبر Dodo Payments
- Supabase Edge Function لخطافات الويب (
dodo-webhook) - مخطط Drizzle ORM، مع البرنامجين النصيين
db:generateوdb:migrateلعمليات الترحيل - لوحة تحكم تتضمن الفواتير وحالة الاشتراك وميزات الخطة
- إجراءات الخادم لتغيير الخطط وإلغاء الاشتراك واستعادة اشتراك ملغى
الملفات والمسارات الرئيسية
توجد معالج خطاف الويب ومسارات التطبيق ومخطط قاعدة البيانات في هذه الملفات:- Edge Function
- Next.js Routes
- Database (Drizzle)
متغيرات البيئة
يقرأ تطبيق Next.js وEdge Function هذه المتغيرات:Supabase
Supabase
.env.example SUPABASE_SERVICE_ROLE_KEY، لكن عميل المسؤول في التطبيق الموجود في lib/supabase/admin.ts يحتاج إليه. أضِفه بنفسك.Dodo Payments
Dodo Payments
Google OAuth
Google OAuth
لا يقرأ التطبيق بيانات اعتماد Google من متغيرات البيئة. أدخل Client ID وClient Secret في إعدادات موفّر Google في Supabase Auth، وأضف عنوان URI لإعادة التوجيه هذا إلى عميل OAuth في Google Cloud:
التحقق واستكشاف الأخطاء وإصلاحها
Webhook signature invalid (400)
Webhook signature invalid (400)
- تأكد من أن السر
DODO_WEBHOOK_SECRETالخاص بالدالة يطابق سر التوقيع الخاص بنقطة النهاية في لوحة تحكم Dodo Payments. - تأكد من نشر أحدث إصدار من الدالة
dodo-webhook. - تتحقق الدالة من ترويسات Standard Webhooks
webhook-idوwebhook-signatureوwebhook-timestamp. تأكد من أن الوكيل الوسيط لا يحذفها.
Database push fails
Database push fails
- تحقّق من صيغة
DATABASE_URL. - يستخدم الاتصال المباشر (
db.[project-ref].supabase.co:5432) IPv6 ما لم يتضمن مشروعك إضافة IPv4. في شبكة تعمل بنظام IPv4 فقط، استخدم سلسلة اتصال مجمّع الجلسات بدلاً من ذلك (وثائق اتصال Supabase). - انتظر من دقيقتين إلى 3 دقائق بعد إنشاء المشروع قبل أول عملية دفع.
OAuth redirect mismatch
OAuth redirect mismatch
- يجب أن يكون URI لإعادة التوجيه هو
https://[ref].supabase.co/auth/v1/callback. - استخدم URI نفسه في Google Cloud وفي موفّر المصادقة في Supabase.
للاطلاع على المستودع الأصلي والخطوات التفصيلية، راجع dodo-supabase-subscription-starter.