مرحباً، لقد أجريت التغييرات التالية على هذه الإضافة وأردت أن أعرف ما إذا كان فريق Discourse منفتحًا على طلب سحب (PR).
أود أيضًا أن يتمكن الآخرون من إجراء اختبارات مكثفة. أنا حاليًا أختبر التدفقات بالسيناريوهات التي أعتبرها حرجة بالنسبة لي.
الإضافة الأصلية هي أساس ممتاز ولكنها تركز بشكل أساسي على الاشتراكات المتكررة عبر Stripe. لقد أجريت التغييرات التالية:
ملخص الميزات والتحسينات الجديدة
1. نظام دفع متعدد المزودين (مع Razorpay) لم تعد الإضافة مبرمجة بشكل ثابت لـ Stripe. تستخدم الآن بنية قائمة على المزودين تسمح بالعديد من بوابات الدفع.
تكامل Razorpay: تم دمج Razorpay بالكامل كمزود دفع ثانٍ. هذا أمر بالغ الأهمية للمجتمعات في أسواق مثل الهند حيث Razorpay بوابة مفضلة.
خطافات الويب الآمنة: تكامل Razorpay قوي ويتضمن معالج خطاف ويب آمن لتأكيد المدفوعات من الخادم إلى الخادم، مما يضمن عدم تفويت أي اشتراكات إذا أغلق المستخدم متصفحه بعد الدفع.
2. اشتراكات لمرة واحدة محدودة المدة تقدم هذه الميزة نوع منتج جديد ومرن يتجاوز الاشتراكات المتكررة القياسية.
وصول منتهي الصلاحية: يمكن للمسؤولين الآن إنشاء خطط دفع لمرة واحدة تمنح الوصول إلى المجموعة لمدة محددة (على سبيل المثال، تذكرة حدث لمدة 7 أيام، أو فترة تجريبية لمدة 30 يومًا، أو حزمة لمدة 90 يومًا).
انتهاء الصلاحية التلقائي: تعمل مهمة خلفية يومية تلقائيًا للتحقق من الاشتراكات منتهية الصلاحية وإزالة المستخدمين من المجموعات ذات الصلة، مما يضمن أن التحكم في الوصول مؤتمت بالكامل.
3. تجديد كامل لصفحة التسعير تم إعادة بناء صفحة الاشتراكات الافتراضية التي يراها المستخدم بالكامل لتحسين التحويلات وتجربة المستخدم.
واجهة مستخدم حديثة قائمة على البطاقات: تم استبدال قائمة المنتجات القديمة بتصميم نظيف ومتجاوب قائم على البطاقات يسهل قراءته ومقارنته.
متوافق مع الثيم: يستخدم التصميم الجديد متغيرات ثيم Discourse ومتوافق تمامًا مع الوضعين الفاتح والداكن.
الدفع في صفحة واحدة: تتم عملية الدفع بأكملها الآن في صفحة التسعير. يؤدي النقر على “اشتراك” إلى عرض نموذج الدفع مباشرة على الصفحة، مما يلغي خطوة مكررة ويقلل من احتكاك المستخدم.
4. منطق متقدم للبيع الإضافي وعرض القيمة تم تصميم بطاقات التسعير الجديدة لتكون أدوات بيع إضافي قوية.
التكلفة الفعالة شهريًا: تقوم واجهة المستخدم تلقائيًا بحساب وعرض “التكلفة شهريًا” لجميع أنواع الخطط (بما في ذلك خطط المرة الواحدة لمدة 3 أشهر أو سنوية)، مما يسمح للمستخدمين بمقارنة قيمة الخيارات المختلفة بسهولة.
المدخرات الصريحة: يتم عرض شارة “وفر X روبية” تلقائيًا على الخطط طويلة الأجل، مما يوضح بوضوح فائدة اختيار خطة ذات قيمة أعلى مقارنة بالخطط الأساسية.
5. لوحات تحكم موحدة للمسؤول والمستخدم تم إعادة هيكلة كل من صفحات الفوترة للمسؤول والمستخدم لتكون أبسط وأكثر قوة.
عرض موحد واحد: بدلاً من قوائم منفصلة لأنواع الدفع المختلفة، يوجد الآن جدول واحد يعرض جميع الاشتراكات من جميع المزودين (Stripe، Razorpay، يدوي).
معلومات واضحة: تعرض هذه العروض بوضوح المزود والحالة وتاريخ الانتهاء/التجديد والمبلغ لكل معاملة، مما يمنح كل من المسؤولين والمستخدمين سجلًا كاملاً لحقوقهم.
6. إدارة الاشتراكات اليدوية للمسؤولين تمت إضافة مجموعة جديدة من الأدوات لمنح المسؤولين مزيدًا من التحكم.
منح الاشتراك: يمكن للمسؤولين الآن منح أي خطة اشتراك يدويًا لأي مستخدم لمدة محددة. هذا مثالي للتعامل مع المدفوعات غير المتصلة بالإنترنت، أو توفير وصول مجاني، أو إجراء تصحيحات.
إلغاء الوصول: يمكن إلغاء الوصول للخطط غير المتكررة فورًا من لوحة تحكم المسؤول.
7. إصلاح خطأ حرج لإدارة المجموعات
تم إصلاح خطأ رئيسي في منطق إزالة المجموعة الأصلي. عند إلغاء الاشتراك أو إلغائه، يقوم النظام الآن بإجراء “فحص أمان” لمعرفة ما إذا كان لدى المستخدم أي اشتراكات نشطة أخرى لنفس المجموعة. لن تتم إزالة المستخدم من المجموعة إلا إذا لم يكن لديه أي طريقة أخرى صالحة للوصول إليها، مما يمنع إزالة المستخدمين بشكل غير صحيح.
نعم نعم بالطبع.. فقط أعطني يومًا واحدًا. أعمل على إصلاح بعض الأخطاء المتعلقة بالتعامل مع البيانات القديمة لـ Stripe عندما ننتقل إلى إصدار المكون الإضافي هذا بالحقول الجديدة.
سيرشدك هذا الدليل خلال إعداد موفري الدفع الضروريين وإنشاء منتجاتك وخططك الأولى.
1. إعداد الموفر
أولاً، انتقل إلى Admin > Settings > Plugins واختر موفر الدفع الأساسي الخاص بك من إعداد discourse_subscriptions_payment_provider. ثم اتبع التعليمات الخاصة بموفرك المختار أدناه.
أ) تكوين Stripe
إذا اخترت Stripe كموفر لك:
املأ مفاتيح API: في إعدادات Discourse الخاصة بك، قم بتوفير مفاتيح Stripe API الخاصة بك:
discourse_subscriptions_public_key (مفتاح Stripe القابل للنشر الخاص بك)
discourse_subscriptions_secret_key (مفتاح Stripe السري الخاص بك)
إعداد Webhook: هذه الخطوة حاسمة لتتبع المدفوعات المتكررة والإلغاءات وأحداث الاشتراك الأخرى.
في لوحة تحكم Stripe الخاصة بك، انتقل إلى Developers > Webhooks.
انقر فوق “Add an endpoint”.
بالنسبة لـ Endpoint URL، أدخل: https://your-discourse-url.com/s/hooks
انقر فوق “Select events” وأضف الأحداث الثلاثة التالية:
checkout.session.completed
customer.subscription.deleted
customer.subscription.updated
انقر فوق “Add endpoint”.
في الصفحة التالية، ابحث عن Signing secret (يبدأ بـ whsec_...).
انسخ هذا السر والصقه في إعداد discourse_subscriptions_webhook_secret في Discourse.
ب) تكوين Razorpay
إذا اخترت Razorpay كموفر لك:
املأ مفاتيح API:
في لوحة تحكم Razorpay الخاصة بك، انتقل إلى Settings > API Keys لإنشاء زوج مفاتيح جديد.
انسخ مفاتيحك والصقها في إعدادات Discourse المقابلة:
discourse_subscriptions_razorpay_key_id
discourse_subscriptions_razorpay_key_secret
إعداد Webhook: هذه الخطوة حاسمة للتأكد من التقاط الدفع بنجاح.
في لوحة تحكم Razorpay الخاصة بك، انتقل إلى Settings > Webhooks.
انقر فوق “+ Add New Webhook”.
بالنسبة لـ Webhook URL، أدخل: https://your-discourse-url.com/s/hooks/razorpay
قم بإنشاء Secret واحتفظ به بأمان للخطوة التالية.
ضمن Active Events، حدد payment.captured فقط.
انقر فوق “Create Webhook”.
انسخ السر الذي أنشأته للتو والصقه في إعداد discourse_subscriptions_razorpay_webhook_secret في Discourse.
2. إنشاء المنتجات والخطط
انتقل إلى Admin > Plugins > Subscriptions لإدارة منتجاتك وخططك.
إنشاء منتج
انتقل إلى علامة التبويب Products.
انقر فوق “Create New Product”.
املأ التفاصيل. يدعم حقل “Description” تنسيق markdown وسيتم عرضه للمستخدمين في صفحة التسعير الجديدة.
إنشاء خطط للمنتج
بعد إنشاء منتج، انقر فوق أيقونة التعديل (✎) بجواره.
في قسم “Pricing Plans”، انقر فوق “Add New Plan”.
يمكنك إنشاء نوعين من الخطط:
لإنشاء خطة متكررة (مثل شهرية/سنوية):
حدد مربع “Recurring Plan?”.
قم بتعيين Amount و Billing Interval (شهر، سنة، إلخ).
قم بتعيينها إلى User Group.
لإنشاء خطة لمرة واحدة ومحددة المدة (مثل بطاقة مرور لمدة 30 يومًا):
اترك مربع “Recurring Plan?”غير محدد.
قم بتعيين Amount.
سيظهر حقل جديد، “Duration (in days)”. أدخل عدد الأيام التي يجب أن يتمتع فيها المستخدم بالوصول (على سبيل المثال، 30).
قم بتعيينها إلى User Group.
3. أدوات إدارية جديدة
يتضمن هذا الإصدار أدوات جديدة لإدارة الاشتراكات يدويًا.
منح اشتراك:
من صفحة Admin > Plugins > Subscriptions الرئيسية، انقر فوق الزر “Grant Subscription”.
في النافذة المنبثقة التي تظهر، حدد اسم مستخدم وخطة.
إذا كانت الخطة المختارة خطة لمرة واحدة، يمكنك تحديد مدة بالأيام. إذا تركت هذا فارغًا، فسيتم منح المستخدم وصولاً دائمًا إلى المجموعة المرتبطة.
إلغاء اشتراك:
انتقل إلى علامة التبويب Subscriptions في قسم الإدارة.
أي اشتراك غير متكرر (أي، يدوي أو Razorpay) سيكون له زر “Revoke Access”.
سيؤدي النقر فوق هذا إلى إزالة المستخدم فورًا من المجموعة المرتبطة، وإنهاء وصوله.
لقد قمت بتحديث المستودع (repo) بالتغييرات/الإصلاحات التالية. أنا الآن جاهز لتثبيته واستخدامه على موقعي الإنتاجي.
ملخص تحسينات الاستقرار والأمان
1. تكامل Stripe Checkout الحديث تم تحديث المكون الإضافي لاستخدام تدفق Stripe Checkout الحديث القائم على إعادة التوجيه.
ما يعنيه هذا: بدلاً من نموذج بطاقة ائتمان على الصفحة، يتم الآن إرسال المستخدمين إلى صفحة آمنة مستضافة من Stripe لإكمال الدفع.
لماذا هو أفضل: هذا هو النهج الموصى به من Stripe. إنه يحسن الأمان، ويقلل من عبء الامتثال لمعايير PCI لموقعك، ويوفر تجربة مستخدم أفضل مع دعم طرق مثل Apple Pay و Google Pay.
2. منطق إعادة الشراء القوي للغاية تمت إعادة هيكلة المنطق الذي يمنع المستخدمين من إعادة شراء منتج لديهم اشتراك نشط فيه بالكامل.
الإصلاح: لقد أضفنا product_id إلى كل سجل اشتراك محلي. أصبح الفحص الآن استعلامًا بسيطًا وسريعًا للغاية مقابل قاعدة بياناتك المحلية مع صفر استدعاءات لواجهة برمجة التطبيقات (API calls)، مما يجعله موثوقًا بنسبة 100%.
النتيجة: سيتم الآن منع المستخدم الذي لديه اشتراك نشط (متكرر أو محدود زمنيًا) بشكل صحيح من إعادة شراء نفس المنتج حتى انتهاء صلاحيته.
3. سلامة البيانات على جميع لوحات المعلومات تم إصلاح صفحة فوترة المستخدم ولوحة معلومات الاشتراكات للمسؤول لضمان أنها تعرض دائمًا بيانات دقيقة وفي الوقت الفعلي.
الإصلاح: تجلب كلتا الصفحتين الآن أحدث حالة وتواريخ التجديد/الانتهاء لكل اشتراك مباشرةً من مزود الدفع (Stripe).
النتيجة: ما تراه في لوحة التحكم للمسؤول سيتطابق دائمًا تمامًا مع ما يراه المستخدم، وكلاهما سيعكس الحالة الحقيقية للاشتراك في Stripe. تم حل الأخطاء التي تعرض “N/A” لتفاصيل الخطة أو حالات “نشط” غير صحيحة.
4. معالجة قوية لطلبات الويب (Webhook) والمهام (Job)
لا مزيد من الاشتراكات المكررة: تم إصلاح معالج طلبات الويب للتعامل بشكل صحيح مع تسلسل الأحداث من Stripe، مما يضمن أن معاملة واحدة تنشئ سجل اشتراك واحد بالضبط.
مهمة انتهاء الصلاحية الموثوقة: تم تقوية مهمة الخلفية اليومية التي تنتهي صلاحية الخطط لمرة واحدة. إنها الآن تعيّن مفتاح واجهة برمجة التطبيقات (API key) المطلوب بشكل صحيح وستنهي صلاحية الاشتراك حتى لو تم حذف الخطة الأصلية من Stripe، مما يضمن دقة أذونات مجموعتك دائمًا.
كما هي الآن، لا يمكننا دمج تغييرات كبيرة دفعة واحدة. إذا كنت ترغب في دمج هذه التغييرات في المكون الإضافي discourse-subscriptions، فستحتاج إلى فصل كل تغيير على حدة وإنشاء طلبات سحب منفصلة مع اختبارات. يرجى أيضًا التأكد من عدم وجود تغييرات جوهرية للمستخدمين الحاليين الذين يستخدمون المكون الإضافي للاشتراكات ولديهم العديد من المشتركين بالفعل.