Benutzer kann ein Abonnementprodukt nach der Kündigung nicht erneut erwerben

Ich habe hier ein seltsames Problem mit einem Abonnenten aufgetreten.

Sie haben im Bereich „Abrechnung“ keine aktiven Abonnements;

In Stripe wird es als storniert angezeigt;

image

doch sie können sich nicht erneut abonnieren lassen – es heißt, sie hätten es bereits gekauft;

image

Habe ich etwas falsch eingerichtet?

Das sieht so aus, als wäre dein Webhook-Endpunkt nicht korrekt konfiguriert. Wenn die Abonnementperiode endet, sendet Stripe einen Webhook, den das Plugin verwendet, um die Gruppenmitgliedschaft zu entfernen und den Benutzer als bestehenden Kunden für dieses Produkt zu löschen (was es dem Benutzer ermöglicht, erneut zu kaufen).

Du musst sicherstellen, dass dies gemäß dem Originalbeitrag (OP) hier konfiguriert ist: Discourse Subscriptions

Eine Möglichkeit, dies von deinem Server aus zu überprüfen:

./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)

Ersetze <username> durch den tatsächlichen Benutzernamen.

Wenn subscription [] zurückgibt, liegt ein anderes Problem vor. Wenn jedoch ein Wert zurückgegeben wird, bestätigt dies wahrscheinlich den fehlenden Webhook.

Um den Eintrag DiscourseSubscriptions::Subscription zu löschen, damit der Benutzer das Produkt erneut kaufen kann:

Stelle sicher, dass subscription nur einen Wert hat, indem du subscription.count ausführst. Wenn der zurückgegebene Wert größer als 1 ist, musst du etwas mehr recherchieren, um sicherzustellen, dass du die richtige Abonnementinstanz löschst. Wenn du den falschen löschst, befinden sich deine Abonnementdaten in einem inkonsistenten Zustand, was wahrscheinlich zu seltsamem Verhalten führt.

Sobald du bestätigt hast, dass es nur ein Abonnement gibt, kannst du Folgendes ausführen:

subscription.destroy_all

Denke daran, dass subscription der Wert ist, der aus dem ursprünglichen Satz von Abfragen zurückgegeben wurde, die wir in der Rails-Konsole ausgeführt haben.

Hoffentlich hilft das!

Danke @justin

• Habe die letzte Zeile (subscription) ausgeführt und dies erhalten:

NoMethodError: undefined method customer_id' for #<DiscourseSubscriptions::Customer::ActiveRecord_Relation:0x000055be473772f0> from /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’

• Habe die Stripe-Webhooks geprüft und sie zeigen auf https://./s/hooks

• An das Webhook gesendete Ereignisse:

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

• Das Stripe-Webhook-Log enthält einen Eintrag vom Einrichtungstag, der offenbar die unterstützten Ereignisse definiert.

• Ich habe in Stripe einen Ereigniseintrag, der eine Stornierung eines Abonnements darstellt. Der Eintrag lautet jedoch (im Wesentlichen) „[Abonnement wurde storniert]“. Wenn ich jedoch auf das Ereignis klicke, steht dort, dass der Ereignistyp customer.subscription.deleted ist – was ich bemerke, nicht in meiner Liste der Webhook-Ereignisse aufgeführt ist.

Könnte das oben Genannte das Problem sein?

Es sieht so aus, als müsste die Zeile DiscourseSubscriptions::Subscription statt ::Customer lauten. Probier das mal aus und schau, was dabei herauskommt!

[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: undefined method customer_id' for #<DiscourseSubscriptions::Subscription::ActiveRecord_Relation:0x000055ec51164ca0> from /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’

Entschuldigung, ich habe missverstanden, wo dies passiert ist.

Versuchen Sie stattdessen Folgendes:

./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])

Ah..

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

Glauben Sie, dass das Fehlen von Abonnement-Daten mit dem fehlenden customer.subscription.deleted-Ereignis zusammenhängt?

Gibt es etwas, das ich zu diesem Zeitpunkt noch untersuchen sollte?

Ich interessiere mich besonders dafür, herauszufinden, warum die Abonnementseite „gekauft

Gibt es hier noch etwas anderes, was man versuchen kann?

Stellen Sie sicher, dass der Kauf in Stripe vollständig storniert ist und nicht erst am Ende des Zeitraums storniert werden soll. Sie können auch im Bereich Admin → Plugins → Discourse Subscriptions → Subscriptions nach dem Benutzernamen dieses Nutzers suchen. Wenn dort ein Abo aufgeführt ist, können Sie es sofort stornieren.

Ohne weitere Untersuchung Ihrer Discourse-Instanz bin ich mir nicht sicher, wie viel weiter ich helfen kann.

Ja, es ist im Plugin-Bereich unter Abonnements nicht aktiv, und auch bei Stripe nicht. Das Einzige, das darauf hindeutet, dass noch etwas aktiv ist, ist, wenn der Benutzer zur Abonnementseite geht: Dort sieht er ein kleines grünes Häkchen mit „Gekauft“ und den Link „Zur Rechnungsstellung“.

image

Wenn ich als der betreffende Benutzer zur Rechnungsstellung gehe, passiert nichts;

Meine Frage lautet also: Was löst in der Datenbank dieses grüne Häkchen aus, und kann es entfernt werden?

Wenn diese Liste die Stripe-Produkt-ID enthält, wie hier:

dann wird sie auf der Benutzeroberfläche als gekauft angezeigt. Möglicherweise musst du mit diesen Abfragen in der Konsole etwas suchen, um herauszufinden, wo sie gespeichert ist. Ich bin mir fast sicher, dass dort noch ein Eintrag herumliegt.

Ok, ich weiß, dass ich diesen Thread wieder aufgreife, aber 1.) das Problem wird weiterhin nicht gelöst, und 2.) ich hatte Zeit, mich wieder damit zu beschäftigen… es stellt sich heraus, dass ich ein Idiot war, der keine Anweisungen befolgen konnte. So habe ich herausgefunden, dass ich ein Dummkopf bin, und warum ich jetzt bereit bin, das zu lösen (mit etwas Hilfe).

Was ich schließlich getan habe, war, eine CSV-Datei von Stripe mit allen gekündigten Konten zu exportieren. Ich konzentrierte mich auf denselben Discourse-Benutzer, der oben in diesem Thread erwähnt wurde, der Abonnent war, gekündigt hatte, aber dann nicht wieder abonnieren konnte, weil die Abonnementseite als “gekauft” angezeigt wurde, obwohl seine Seite mit aktiven Abonnements keine Abonnements anzeigte. In den CSV-Daten wurde sein Datensatz als “gekündigt” mit den folgenden Daten angezeigt:

  • id (sub_JNWejdDo4qhLG5)
  • customer_id (cus_JmiMoqZNTzUNxt)
  • user_id (Discourse-Benutzer-ID 4981)

Dann habe ich mich mit dem App-Container verbunden, bin in die Ruby-Konsole gegangen und habe angefangen, herumzustochern. Zuerst habe ich nach seiner Kunden-ID in DiscourseSubscriptions::Customer gesucht und sie gefunden.

[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>]

Als Nächstes habe ich DiscourseSubscriptions::Subscription durchsucht, um zu sehen, ob dieser Benutzer Abonnements hatte, und es stellt sich heraus, ja, das hatte er;

[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>]

Es scheint also, dass ich diesen Abonnementdatensatz einfach entfernen kann und alles reparieren kann… für diesen Benutzer. Tatsache ist, dass jeder gekündigte Benutzer, den ich in meinem CSV-Export überprüft habe, immer noch verbleibende Abonnements im System hatte. Offensichtlich gibt es eine Trennung irgendwo zwischen dem Stripe-Webhook und dem Abonnement-Plugin… ich weiß nur nicht wo/wie.

  • Erstens: Wie entferne ich sicher den Abonnementdatensatz für einen bestimmten Benutzer? Erklären Sie es mir, als wäre ich 5 Jahre alt. Ich bin an der Ruby-Konsolenaufforderung… wie stelle ich sicher, dass nur die Abonnementdaten des Zielbenutzers entfernt werden und ich nicht die Abonnementdaten aller lösche?

  • Zweitens: Wie behebe ich den Mechanismus des Webhooks für die Abonnementkündigung?

Ihre Hilfe wird sehr geschätzt!

UPDATE:

Ok, ich bin ein wenig weiter gekommen… ich habe herausgefunden, wie ich .delete_by verwenden kann, um nur Abonnementdaten für den Zielbenutzer zu entfernen.

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

Der Kunden-Datensatz hat jedoch immer noch eine zugeordnete 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>]

Das bedeutet, dass sie immer noch das grüne Häkchen sehen und sich nicht erneut anmelden können… also habe ich “destroy_all” auf das Customer-Objekt angewendet… und es hat funktioniert! Aber natürlich nur für diesen Benutzer…

[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>]

Jetzt geht es nur noch darum, zu diagnostizieren, warum der Stripe-Webhook für gekündigte Abonnements nicht funktioniert.