إضافة اشتراكات Discourse

هل قمت بتكوين الويبهوكس (webhooks) بشكل صحيح؟ أتذكر أنها كانت معقدة بعض الشيء في الإعداد، ويمكن أن تكون التعليمات الخاصة بكيفية القيام بذلك أوضح قليلاً.

نعم، لقد تم إعداد خطافات الويب (webhooks) بشكل جيد، هكذا كانت الاستجابة تتدفق.

لقد اكتشفت المشكلة. التعليمات تفتقر إلى نقطة حيث يتعين علينا إعداد العلامات المخصصة باسم المجموعة للترقية إليها في صفحة تكوين أسعار Stripe.

إنها تعمل بشكل جيد الآن بالنسبة لي. المكون الإضافي رائع ولكن التوثيق ليس مفصلاً.

إعجاب واحد (1)

هل يمكنك شرح ذلك بشكل أكبر قليلاً حتى نتمكن من جعل شخص ما يقوم بتحديث الوثائق؟ ما هي العلامة المخصصة التي أضفتها، وأين أضفتها؟

[دليل] كيفية إعداد اشتراكات Discourse باستخدام جداول أسعار Stripe (والعقبات الشائعة)

مرحباً بالجميع،

بعد عملية استكشاف أخطاء طويلة، أردت مشاركة دليل نهائي لإعداد المكون الإضافي الرسمي discourse-subscriptions باستخدام طريقة جدول أسعار Stripe الحديثة. هذا النهج قوي ولكنه يحتوي على بعض الخطوات الحاسمة التي ليست واضحة على الفور ويمكن أن تؤدي إلى أخطاء مثل فشل webhooks (404 Not Found) أو عدم إضافة المستخدمين إلى المجموعات بعد دفع ناجح.

إليك العملية خطوة بخطوة التي تم التأكد من أنها تعمل.


الجزء الأول: إعداد Stripe

تستخدم هذه العملية Stripe كـ “مصدر للحقيقة” لجميع المنتجات والأسعار.

1. إنشاء المنتجات والأسعار الخاصة بك

  • في لوحة تحكم Stripe الخاصة بك، تأكد من أنك في وضع مباشر (Live Mode).
  • انتقل إلى المنتجات (Products) > كتالوج المنتجات (Product catalog).
  • قم بإنشاء منتجاتك الرئيسية أولاً (على سبيل المثال، “عضوية مميزة”، “وصول VIP”).
  • ضمن كل منتج، قم بإنشاء جميع الأسعار المرتبطة (على سبيل المثال، XX / شهر، XXX / سنة).

2. خطوة البيانات الوصفية (Metadata) الحاسمة لكي يقوم المكون الإضافي بإضافة المستخدمين تلقائيًا إلى مجموعة، يجب عليك إضافة بيانات وصفية محددة إلى كل كائن سعر (Price object) تقوم بإنشائه. قد تجعل واجهة مستخدم لوحة تحكم Stripe هذا الأمر صعب العثور عليه.

  • عند إنشاء سعر جديد (أو إذا كان بإمكانك العثور على خيار “تحرير السعر” (Edit price))، يجب عليك إضافة بيانات وصفية. قد تحتاج إلى النقر فوق “خيارات إضافية” (Additional options) أثناء إنشاء السعر للكشف عن حقول البيانات الوصفية.
  • انقر فوق + إضافة بيانات وصفية (+ Add metadata) وأدخل ما يلي:
    • المفتاح (KEY): group_name
    • القيمة (VALUE): معرف/اسم المجموعة الفريد والقابل للاستخدام في عنوان URL من Discourse، وليس اسمها الكامل.

مثال:

  • إذا كان الاسم الكامل لمجموعة Discourse الخاصة بك هو “Enclave Plus”، فمن المحتمل أن يكون معرفها هو EnclavePlus.
  • يجب عليك استخدام EnclavePlus كقيمة. استخدام "Enclave Plus" مع مسافة سيفشل.
  • يجب عليك تكرار هذا لكل خطة سعر تريد ربطها بمجموعة.

3. إنشاء جدول أسعار Stripe الخاص بك

  • انتقل إلى المنتجات (Products) > جداول الأسعار (Pricing tables).
  • قم بإنشاء جدول جديد وأضف الأسعار التي قمت بتكوينها للتو.
  • بعد نشر الجدول، انقر فوق زر “نسخ الكود” (Copy code) للحصول على معرف جدول الأسعار (Pricing table ID) الخاص بك (يبدأ بـ prctbl_...).

4. تكوين نقطة نهاية Webhook (إصلاح خطأ 404) هذه هي النقطة الأكثر شيوعًا للفشل.

  • انتقل إلى المطورون (Developers) > Webhooks وانقر فوق + إضافة نقطة نهاية (+ Add endpoint).
  • يجب أن يكون عنوان URL لنقطة النهاية (Endpoint URL) بالتنسيق التالي: https://your-discourse-site.com/s/hooks
  • ملاحظة: المسار الصحيح هو /s/hooks، وليس /s/stripe/webhook.
  • بالنسبة لـ الأحداث المراد إرسالها (Events to send)، أضف على الأقل:
    • checkout.session.completed
    • customer.subscription.deleted
  • قم بإنشاء نقطة النهاية وانسخ سر التوقيع (Signing secret) (يبدأ بـ whsec_...).

الجزء الثاني: تكوين Discourse

الآن، لنقم بتكوين المكون الإضافي لاستخدام كل ما قمت بإعداده في Stripe.

1. إدخال مفاتيح API ومعرف جدول الأسعار

  • انتقل إلى Admin > Settings وابحث عن discourse subscriptions.
  • أدخل مفاتيح Stripe الحية الخاصة بك:
    • discourse subscriptions public key (pk_live_...)
    • discourse subscriptions secret key (sk_live_...)
    • discourse subscriptions webhook secret (whsec_...)
  • قم بتمكين وضع جدول الأسعار:
    • حدد مربع discourse subscriptions pricing table enabled.
    • الصق معرف prctbl_... الخاص بك في حقل discourse subscriptions pricing table id.

2. ربط منتجات Stripe بمجموعات Discourse حتى مع جدول الأسعار، تحتاج إلى إخبار Discourse أي مجموعة تنتمي إلى أي منتج.

  • انتقل إلى Admin > Plugins > Subscriptions وانقر فوق علامة التبويب المنتجات (Products).
  • انقر فوق إنشاء منتج جديد (Create New Product).
  • أدخل اسم المنتج (Product Name) الذي يطابق تمامًا اسم المنتج في Stripe (على سبيل المثال، Enclave Plus).
  • احفظ المنتج. في صفحة المنتج، قم بالتمرير لأسفل وانقر فوق إضافة خطة جديدة (Add New Plan).
  • هذه الخطة هي مجرد “جسر”. الحقل الحاسم الوحيد هو مجموعة المستخدمين (User Group).
    • اسم مستعار للخطة (Plan Nickname): Enclave Plus Group Link (أو أي شيء لمرجعك).
    • مجموعة المستخدمين (User Group): حدد مجموعة Discourse الصحيحة من القائمة المنسدلة.
    • يمكن ترك الحقول الأخرى (المبلغ، الفاصل الزمني) كافتراضية، حيث سيتم تجاهلها.
  • احفظ الخطة. كرر هذا لجميع منتجاتك المختلفة.

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

  • المشكلة: تفشل Webhooks مع خطأ 404 Not Found.
    • الحل: عنوان URL لنقطة النهاية في Stripe غير صحيح. يجب أن يكون https://your-discourse-site.com/s/hooks.
  • المشكلة: Webhook ناجح (200 OK) ويظهر الدفع في ملف تعريف الفواتير للمستخدم، ولكن لم تتم إضافته إلى المجموعة.
    • الحل: البيانات الوصفية الخاصة بك غير صحيحة. تحقق من ثلاثة أشياء:
      1. يجب أن تكون البيانات الوصفية على كائن سعر Stripe (Stripe Price)، وليس كائن المنتج (Product object).
      2. يجب أن يكون مفتاح البيانات الوصفية هو group_name بالضبط.
      3. يجب أن تكون قيمة البيانات الوصفية هي المعرف/الاسم الفريد للمجموعة (على سبيل المثال، EnclavePlus)، وليس اسمها الكامل مع المسافات.

آمل أن يوفر هذا الدليل وقتًا وإحباطًا للآخرين في هذا الإعداد المعقد ولكنه قوي للغاية.

5 إعجابات

لقد اختبرت هذا للتو وكان مثاليًا! سنمضي قدمًا في تحديث الوثائق الأصلية لتضمين هذا!

4 إعجابات

الجزء الرئيسي المفقود في التوثيق هو هذا. أشير إلى ذلك لأنك اقتبست جزءًا آخر.

إعجابَين (2)

هل هناك أي طريقة لتعيين تاريخ الربط تلقائيًا بهذا؟ إذا دفع شخص ما، يتعين عليّ يدويًا تعديل فترة الاشتراك لإعادة تعيينها في الأول من الشهر لكل مستخدم.

تقول وثائق Stripe أنه يمكن القيام بذلك باستخدام واجهة برمجة التطبيقات (API) عند الخروج، ولكننا حاليًا لا نملك طريقة لتعديله في المكون الإضافي.

نقل هذا إلى الموضوع الجديد لأنه قد يطول مع نشر التحديثات.

3 إعجابات

:partying_face: هذه الإضافة مضمنة الآن مع نواة Discourse كجزء من Bundling more popular plugins with Discourse core. إذا كنت تستضيف بنفسك وتستخدم الإضافة، فأنت بحاجة إلى إزالتها من app.yml قبل الترقية التالية.

إعجابَين (2)

كيف يمكنني إزالته من النواة؟ حيث سأستخدم نسخة المكون الإضافي التي قمت بتحسينها.

3 إعجابات

شيء مثل

rm - rf discourse-subscroptions

قبل git clone.

3 إعجابات

عذرًا، لم أفهم، أثناء إعادة البناء، سيقوم بجلب كود المكون الإضافي المدمج هذا وبنائه، كل ذلك في خطوة واحدة، أليس كذلك؟

لم أختبر هذا، لكنني متأكد من أن هذا سيعمل:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - rm -rf discourse-subscriptions
          - git clone https://github.com/yourForkUser/discourse-subscriptions

نظرًا لأن هذا يتم تشغيله من دليل الإضافات، فسيؤدي ذلك إلى إزالة discourse-subscriptions المضمنة الآن في النواة واستبدالها بتلك التي كنت تستخدمها دائمًا من قبل. لذا فإن إضافة هذا rm -rf فقط إلى app.yml الخاص بك قبل git clone (لهذا أو لأي إضافة أخرى لا تريد تضمينها أو تريد استبدالها) يجب أن يفعل ما تريده ويستبدل الإضافة الأساسية بالنسخة المتفرعة الخاصة بك.

6 إعجابات

حسنًا، عندما يقولون إن المكون الإضافي X أصبح الآن جزءًا من النواة، فكل ما يعنونه هو أن المكون الإضافي سيتم تجميعه مسبقًا في مستودع النواة في دليل المكونات الإضافية ولن نضطر إلى سحب هذا الكود اختياريًا. فهمت. هيكليًا لا شيء يتغير.

إعجاب واحد (1)

إذا كانت معبأة مسبقًا الآن. هل سأفقد كل البيانات في إصدار المكون الإضافي؟ هل سأضطر إلى إعداده مرة أخرى أم سيتم ترحيله؟

لن تفقد أي بيانات. فقط قم بإزالة السطر من app.yml وسيستمر المكون الإضافي في العمل كما كان من قبل.

إعجاب واحد (1)

هل من المتوقع أن لا يتم تحديث مبلغ الاشتراك الإجمالي فورًا بعد إدخال رمز قسيمة؟

تم الاختبار على Discourse 3.5.0.beta8-dev

لقد وجدت أنه إذا حاول المستخدم التسجيل وفشل دفعه، فسيتم إزالة الإدخال في جدول discourse_subscriptions_customer الذي يربطه بمعرف العميل الخاص به في Stripe. لست متأكدًا مما إذا كان هذا السلوك مقصودًا، ولكنه بغض النظر عن ذلك، لا أعتقد أنه سلوك جيد لأنه يؤدي إلى عملاء يتامى في Stripe يجب حذفهم يدويًا. وهذا يؤدي أيضًا إلى إنشاء عملاء مكررين إذا حاولوا مرة أخرى مما قد يؤثر على تقاريرنا.

3 إعجابات

هل هناك أي طريقة لإعادة تعيين الحملة؟ كنت آمل في هدف تبرع شهري ولكنها بداية شهر جديد ولا أرى طريقة لإعادة تعيينه إلى الصفر لهدف شهري جديد.

أود أن أرى هذا المكون الإضافي قيد التشغيل على موقع ويب. هل هناك أي شخص على استعداد لمشاركة رابط منتدى يستخدم مكون المكونات الإضافية للاشتراك؟ شكرًا!