لا يمكن للمستخدم إعادة شراء منتج اشتراك بعد إلغائه

واجهتُ مشكلةً غريبة مع مشترك.

لا توجد اشتراكات نشطة في قسم الفواتير؛

يظهر في Stripe على أنها ملغاة؛

image

ومع ذلك، لا يمكنه إعادة الاشتراك… حيث يُظهر الرسالة “تم الشراء مسبقًا”؛

image

هل قمتُ بإعداد شيء ما بشكل غير صحيح؟

يبدو أن نقطة نهاية الويب هوك لديك مُعدّة بشكل غير صحيح. عندما تنتهي فترة الاشتراك، يرسل Stripe ويب هوك تستخدمه الإضافة لإزالة عضوية المجموعة، وإزالة المستخدم من قائمة العملاء الحاليين لذلك المنتج (مما يسمح للمستخدم بالشراء مرة أخرى).

ستحتاج إلى التأكد من أن هذا مُعدّ وفقًا لما ورد في المنشور الأصلي هنا: Discourse Subscriptions

إحدى الطرق لتأكيد ذلك من خادمك:

./launcher enter app
rails c
u = User.find_by_username(<username>)
c = DiscourseSubscriptions::Customer.where(user_id: u.id)
subscription = DiscourseSubscriptions::Subscription.where(customer_id: c.customer_id)

تأكد من استبدال <username> باسم المستخدم الفعلي.

إذا عاد المتغير subscription بقيمة []، فهناك مشكلة أخرى. أما إذا عاد بقيمة، فهذا يؤكد على الأرجح غياب الويب هوك.

لحذف إدخال DiscourseSubscriptions::Subscription حتى يتمكن المستخدم من شراء المنتج مرة أخرى:

تأكد من أن subscription يحتوي على قيمة واحدة فقط بتشغيل الأمر subscription.count. إذا كانت القيمة المُرجعة أكبر من 1، فستحتاج إلى إجراء مزيد من البحث للتأكد من أنك تحذف مثيل الاشتراك الصحيح. إذا حذفت الخطأ، ستكون بيانات اشتراكاتك في حالة غير متسقة وقد تؤدي إلى سلوك غريب.

بمجرد التأكد من وجود اشتراك واحد فقط، يمكنك تشغيل الأمر التالي:

subscription.destroy_all

تذكر أن subscription هو القيمة المُرجعة من مجموعة الاستعلامات الأولية التي قمنا بتشغيلها في وحدة تحكم Rails.

آمل أن يكون ذلك مفيدًا!

شكرًا لك @justin

• وصلت إلى سطر الاشتراك الأخير وقمت بتشغيله.. وعاد هذا؛

NoMethodError: الطريقة customer_id غير معرفة لـ #DiscourseSubscriptions::Customer::ActiveRecord_Relation:0x000055be473772f0
من /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/relation/delegation.rb:110:in `method_missing’

• تفحصت ويبهوكات Stripe وهي تشير إلى https://./s/hooks

• الأحداث المرسلة إلى الويبهوك:

  • subscription_schedule.updated
  • subscription_schedule.expiring
  • subscription_schedule.created
  • subscription_schedule.canceled

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

• لدي إدخال حدث في Stripe يتعلق بإلغاء اشتراك، ولكن.. يظهر إدخال السطر (بشكل فعال) “[تم إلغاء الاشتراك]”، ومع ذلك عند النقر على الحدث، يُظهر نوع الحدث customer.subscription.deleted .. والذي لاحظت أنه غير مدرج في قائمة أحداث الويبهوك الخاصة بي.

هل يمكن أن يكون ذلك هو المشكلة؟

يبدو أن السطر يجب أن يكون DiscourseSubscriptions::Subscription بدلاً من ::Customer. جرّب ذلك وراجع النتيجة!

[2] pry(main)> c = DiscourseSubscriptions::Subscription.where(user_id: u.id)
=> #DiscourseSubscriptions::Subscription::ActiveRecord_Relation:0x8020
[3] pry(main)> subscription = DiscourseSubscriptions::Subscription.where(customer_id: c.customer_id)
NoMethodError: لا توجد طريقة customer_id' لـ #<DiscourseSubscriptions::Subscription::ActiveRecord_Relation:0x000055ec51164ca0> من /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.3.2/lib/active_record/relation/delegation.rb:110: في method_missing’

عذراً، لقد أساءت فهم المكان الذي يحدث فيه هذا.

جرب هذا بدلاً من ذلك:

./launcher enter app
rails c
u = User.find_by_username(<username>)
c = DiscourseSubscriptions::Customer.find_by(user_id: u.id)
subscription = DiscourseSubscriptions::Subscription.where(customer_id: c[:customer_id])

آه..

[3] pry(main)> subscription = DiscourseSubscriptions::Subscription.where(customer_id: c[:customer_id])
=>

هل تعتقد أن عدم وجود بيانات الاشتراك قد يكون مرتبطًا بغياب حدث customer.subscription.deleted؟

هل هناك أي شيء يجب أن أستكشفه بعد ذلك في هذه المرحلة؟

أنا مهتم بشكل خاص بفهم سبب ظهور كلمة “تم الشراء” في صفحة الاشتراك بينما لا تظهر أي اشتراكات نشطة في قسم الاشتراكات النشطة. هل يوجد مكان آخر في قاعدة البيانات حيث تُخزن معلومات الاشتراك، وقد تكون فارغة أو محذوفة في قسم الاشتراكات النشطة، لكن في نفس الوقت تبقى قيمة “تم الشراء” (boolean) مضبوطة على true في مكان ما؟ أم شيء من هذا القبيل؟

هل هناك أي شيء آخر يمكن تجربته هنا؟

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

بدون فحص إضافي لنسخة Discourse الخاصة بك، لا أعتقد أنني أستطيع تقديم المزيد من المساعدة.

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

image

إذا ذهبت إلى الفواتير بصفتك المستخدم المعني، فلن تجد شيئًا؛

لذا فإن سؤالي هو - ما الذي في قاعدة البيانات يُفعّل علامة الصح الخضراء هذه، وهل يمكن مسحها؟

إذا كانت هذه القائمة تتضمن معرف المنتج في Stripe كما هو موضح هنا:

فإن الواجهة الأمامية ستعرضها على أنها تم شراؤها. قد تحتاج إلى البحث في وحدة التحكم باستخدام هذه الاستعلامات لمعرفة مكان وجودها. أنا شبه متأكد من أن هناك سجلاً لا يزال موجودًا هناك.

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

ما انتهى بي الأمر بفعله هو تصدير ملف CSV من Stripe لجميع الحسابات الملغاة. ركزت على مستخدم Discourse نفسه الذي تمت الإشارة إليه أعلاه في هذا الموضوع والذي كان مشتركًا ، وألغى ، ولكنه لم يتمكن بعد ذلك من إعادة الاشتراك لأن صفحة الاشتراك ظهرت على أنها “تم شراؤها” على الرغم من أن صفحة الاشتراكات النشطة الخاصة به لم تظهر أي اشتراكات. في بيانات CSV ، أظهر سجله على أنه “ملغى” مع البيانات التالية ؛

  • id (sub_JNWejdDo4qhLG5)
  • customer_id (cus_JmiMoqZNTzUNxt)
  • user_id (معرف مستخدم Discourse 4981)

ثم قمت بالاتصال بحاوية التطبيق ، ودخلت إلى وحدة تحكم Ruby ، وبدأت في البحث. أولاً ، بحثت عن معرف العميل الخاص به في DiscourseSubscriptions::Customer ووجدته.

[3] pry(main)> DiscourseSubscriptions::Customer.where(customer_id: 'cus_JNWeiIWTs6YOwQ')
=> [#<DiscourseSubscriptions::Customer:0x000055db2d48eb40
  id: 16,
  customer_id: "cus_JNWeiIWTs6YOwQ",
  product_id: "prod_JJbwYnKz0T5Z9h",
  user_id: 3256,
  created_at: Tue, 27 Apr 2021 07:45:07.455275000 UTC +00:00,
  updated_at: Tue, 27 Apr 2021 07:45:07.455275000 UTC +00:00>]

بعد ذلك ، بحثت في DiscourseSubscriptions::Subscription لمعرفة ما إذا كان لهذا المستخدم أي اشتراكات ، واتضح نعم ، كان لديهم بالفعل ؛

[1] pry(main)> DiscourseSubscriptions::Subscription.where(external_id: 'sub_JNWejdDo4qhLG5')
=> [#<DiscourseSubscriptions::Subscription:0x000055854e1e1620
  id: 16,
  customer_id: 16,
  external_id: "sub_JNWejdDo4qhLG5",
  created_at: Tue, 27 Apr 2021 07:45:07.459681000 UTC +00:00,
  updated_at: Tue, 27 Apr 2021 07:45:07.459681000 UTC +00:00>]

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

  • أولاً ؛ كيف يمكنني بأمان إزالة بيانات سجل الاشتراك لمستخدم معين؟ اشرحها لي وكأنني في الخامسة .. أنا عند موجه وحدة تحكم Ruby .. كيف يمكنني التأكد من إزالة بيانات اشتراك المستخدم المستهدف فقط وعدم مسح بيانات اشتراك الجميع؟

  • ثانيًا ، كيف يمكنني استكشاف آلية webhook لإلغاء الاشتراك؟

كل مساعدتكم محل تقدير كبير!

تحديث:
حسنًا ، لقد تقدمت قليلاً .. تمكنت من فرز كيفية استخدام .delete_by لإزالة بيانات الاشتراك للمستخدم المستهدف فقط ؛

[1] pry(main)> DiscourseSubscriptions::Subscription.delete_by(external_id: 'sub_JNWejdDo4qhLG5')
[2] pry(main)> DiscourseSubscriptions::Subscription.where(external_id: 'sub_JNWejdDo4qhLG5')
=> []

ومع ذلك ، لا يزال سجل العميل يحتوي على product_id مرتبط ؛

[3] pry(main)> DiscourseSubscriptions::Customer.where(customer_id: 'cus_JNWeiIWTs6YOwQ')
=> [#<DiscourseSubscriptions::Customer:0x0000560ec18e4948
  id: 16,
  customer_id: "cus_JNWeiIWTs6YOwQ",
  product_id: "prod_JJbwYnKz0T5Z9h",
  user_id: 3256,
  created_at: Tue, 27 Apr 2021 07:45:07.455275000 UTC +00:00,
  updated_at: Tue, 27 Apr 2021 07:45:07.455275000 UTC +00:00>]

هذا يعني أنهم لا يزالون يرون علامة التحقق الخضراء ولا يمكنهم إعادة الاشتراك .. لذلك قمت بتطبيق “destroy_all” على كائن العميل .. ونجح الأمر! ولكن فقط لهذا المستخدم بالطبع ..

[4] pry(main)> DiscourseSubscriptions::Customer.where(customer_id: 'cus_JNWeiIWTs6YOwQ').destroy_all
=> [#<DiscourseSubscriptions::Customer:0x0000560ec19770e0
  id: 16,
  customer_id: "cus_JNWeiIWTs6YOwQ",
  product_id: "prod_JJbwYnKz0T5Z9h",
  user_id: 3256,
  created_at: Tue, 27 Apr 2021 07:45:07.455275000 UTC +00:00,
  updated_at: Tue, 27 Apr 2021 07:45:07.455275000 UTC +00:00>]

لذا الآن الأمر يتعلق فقط بتشخيص سبب عدم عمل webhook الخاص بـ Stripe للاشتراكات الملغاة.