Skip to main content

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، مفتاح anon
  • SUPABASE_SERVICE_ROLE_KEY، مفتاح service role
  • DATABASE_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

أنشئ ملف .env.local في الدليل الجذر:
يقرأ تطبيق Next.js كل متغير في هذا الملف باستثناء 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 لإنشاء منتج اشتراك لكل خطة. اختياريًا، لإدراج ميزات الخطة في التطبيق، أضف إدخال بيانات وصفية بالمفتاح features ومصفوفة JSON من السلاسل النصية كقيمتها. ستبدو البيانات الوصفية للمنتج كما يلي:
قيم البيانات الوصفية هي سلاسل نصية أو أرقام أو قيم منطقية، لذا خزّن المصفوفة كسلسلة JSON. تحلّل واجهة التسعير قيمة features وتعرض كل عنصر.
10

Run the Dev Server

افتح http://localhost:3000 وسجّل الدخول باستخدام Google.
أصبح لديك الآن هيكل SaaS عامل للاشتراكات، ومجهّز باستخدام Supabase وDodo Payments. للتأكد من عمله من البداية إلى النهاية، اشترك في خطة باستخدام بطاقة اختبار. بعد وصول خطاف الويب، تعرض لوحة التحكم خطتك الجديدة.

ما يتضمنه المشروع

  • المصادقة عبر Supabase، مع إعداد Google OAuth
  • checkout للاشتراكات عبر Dodo Payments
  • Supabase Edge Function لخطافات الويب (dodo-webhook)
  • مخطط Drizzle ORM، مع البرنامجين النصيين db:generate وdb:migrate لعمليات الترحيل
  • لوحة تحكم تتضمن الفواتير وحالة الاشتراك وميزات الخطة
  • إجراءات الخادم لتغيير الخطط وإلغاء الاشتراك واستعادة اشتراك ملغى
أبقِ DODO_PAYMENTS_ENVIRONMENT مضبوطًا على test_mode حتى تُكمل الاختبارات من البداية إلى النهاية. للانتقال إلى الوضع المباشر، اضبطه على live_mode واستخدم مفتاح API للوضع المباشر.

الملفات والمسارات الرئيسية

توجد معالج خطاف الويب ومسارات التطبيق ومخطط قاعدة البيانات في هذه الملفات:

متغيرات البيئة

يقرأ تطبيق Next.js وEdge Function هذه المتغيرات:
لا يسرد .env.example‏ SUPABASE_SERVICE_ROLE_KEY، لكن عميل المسؤول في التطبيق الموجود في lib/supabase/admin.ts يحتاج إليه. أضِفه بنفسك.
لا يقرأ التطبيق بيانات اعتماد Google من متغيرات البيئة. أدخل Client ID وClient Secret في إعدادات موفّر Google في Supabase Auth، وأضف عنوان URI لإعادة التوجيه هذا إلى عميل OAuth في Google Cloud:

التحقق واستكشاف الأخطاء وإصلاحها

  • تأكد من أن السر DODO_WEBHOOK_SECRET الخاص بالدالة يطابق سر التوقيع الخاص بنقطة النهاية في لوحة تحكم Dodo Payments.
  • تأكد من نشر أحدث إصدار من الدالة dodo-webhook.
  • تتحقق الدالة من ترويسات Standard Webhooks ‏webhook-id وwebhook-signature وwebhook-timestamp. تأكد من أن الوكيل الوسيط لا يحذفها.
  • تحقّق من صيغة DATABASE_URL.
  • يستخدم الاتصال المباشر (db.[project-ref].supabase.co:5432) IPv6 ما لم يتضمن مشروعك إضافة IPv4. في شبكة تعمل بنظام IPv4 فقط، استخدم سلسلة اتصال مجمّع الجلسات بدلاً من ذلك (وثائق اتصال Supabase).
  • انتظر من دقيقتين إلى 3 دقائق بعد إنشاء المشروع قبل أول عملية دفع.
  • يجب أن يكون URI لإعادة التوجيه هو https://[ref].supabase.co/auth/v1/callback.
  • استخدم URI نفسه في Google Cloud وفي موفّر المصادقة في Supabase.
للاطلاع على المستودع الأصلي والخطوات التفصيلية، راجع dodo-supabase-subscription-starter.
آخر تعديل في ٢٦ سبتمبر ٢٠٢٦