L'utente non può riacquistare un prodotto in abbonamento dopo averlo annullato

Ho riscontrato un problema strano con un abbonato.

Non ha abbonamenti attivi nella sezione Fatturazione;

Su Stripe risulta annullato;

image

eppure non riesce a riabbonarsi… dice che è già stato acquistato;

image

Ho impostato qualcosa in modo errato?

1 Mi Piace

Sembra che il tuo endpoint webhook possa essere configurato in modo errato. Quando il periodo di abbonamento scade, Stripe invia un webhook che il plugin utilizza per rimuovere l’iscrizione al gruppo ed escludere l’utente dalla lista dei clienti esistenti per quel prodotto (il che consente all’utente di acquistare nuovamente).

Dovrai assicurarti che sia configurato secondo le indicazioni del post originale qui: Discourse Subscriptions

Un modo per verificare dal tuo server:

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

Ricordati di sostituire <username> con il nome utente reale dell’utente.

Se subscription restituisce [], c’è un altro problema in corso. Ma se restituisce un valore, ciò conferma probabilmente la mancanza del webhook.

Per eliminare la voce DiscourseSubscriptions::Subscription in modo che l’utente possa acquistare nuovamente il prodotto:

Assicurati che subscription contenga un solo valore eseguendo subscription.count. Se il valore restituito è maggiore di 1, dovrai fare un po’ di indagini in più per assicurarti di eliminare l’istanza di abbonamento corretta. Se elimini quella sbagliata, i dati degli abbonamenti rimarranno in uno stato inconsistente e potrebbero causare comportamenti strani.

Una volta confermato che esiste un solo abbonamento, puoi eseguire:

subscription.destroy_all

Tieni presente che subscription è il valore restituito dall’insieme iniziale di query eseguite nella console Rails.

Spero che questo ti sia d’aiuto!

2 Mi Piace

Grazie @justin

• Sono arrivato all’ultima riga relativa all’abbonamento e l’ho eseguita… ha restituito questo;

NoMethodError: metodo customer_id' non definito per #<DiscourseSubscriptions::Customer::ActiveRecord_Relation:0x000055be473772f0> da /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’

• Ho verificato i webhook di Stripe e sono puntati su https://./s/hooks

• Eventi inviati al webhook;

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

• Il log dei webhook di Stripe presenta una voce dalla data di configurazione che sembra riguardare l’impostazione degli eventi supportati.

• Ho una voce di evento in Stripe relativa alla cancellazione di un abbonamento, ma… la riga dice (in sostanza) “[l’abbonamento è stato cancellato]”, tuttavia quando faccio clic sull’evento, viene indicato che il tipo di evento è customer.subscription.deleted, che noto non è elencato nella mia lista di eventi dei webhook.

Potrebbe essere questo il problema?

1 Mi Piace

Sembra che la riga dovrebbe essere DiscourseSubscriptions::Subscription invece di ::Customer. Prova e vedi cosa ottieni!

1 Mi Piace

[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: metodo customer_id non definito per #DiscourseSubscriptions::Subscription::ActiveRecord_Relation:0x000055ec51164ca0
da /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’

1 Mi Piace

Scusa, ho frainteso dove stava accadendo questo.

Prova invece questo:

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

Ah..

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

1 Mi Piace

Pensi che la mancanza di dati di abbonamento abbia a che fare con l’assenza dell’evento customer.subscription.deleted?

C’è qualcosa che dovrei esaminare ulteriormente a questo punto?

Sono particolarmente interessato a capire perché la pagina dell’abbonamento mostra “acquistato”, mentre la sezione degli abbonamenti attivi non ne mostra nessuno attivi… esiste un altro posto nel database dove sono memorizzate le informazioni sugli abbonamenti che potrebbero essere cancellate o vuote nella sezione degli abbonamenti attivi, ma in qualche modo un booleano “acquistato” è ancora impostato su true da qualche parte… o qualcosa del genere?

1 Mi Piace

C’è qualcos’altro da provare qui?

1 Mi Piace

Assicurati che in Stripe l’acquisto sia completamente annullato e non in attesa di essere annullato alla fine del periodo. Puoi anche controllare nella sezione Amministrazione → Plugin → Abbonamenti Discourse → Abbonamenti e cercare il nome utente di questo utente. Se è presente un abbonamento, puoi annullarlo immediatamente.

Senza analizzare più approfonditamente la tua istanza di Discourse, non sono sicuro di quanto altro possa aiutarti.

1 Mi Piace

Sì, non è attivo nelle sottoscrizioni nell’area dei plugin, e nemmeno su Stripe. L’unica cosa che indica che qualcosa è ancora attivo è se l’utente va alla pagina delle sottoscrizioni: vede un piccolo segno di spunta verde “Acquistato” e “Vai alla fatturazione”.

image

Se accedo alla fatturazione come l’utente in questione, non c’è nulla;

Quindi la mia domanda è: cosa nel database attiva quel segno di spunta verde e può essere rimosso?

Se questa lista include l’ID prodotto Stripe come mostrato qui:

Allora l’interfaccia frontale lo mostrerà come acquistato. Potresti dover esplorare la console con queste query per scoprire dove si trova. Quasi sicuramente c’è ancora un record lì.

1 Mi Piace

Ok, so che sto riportando in vita questa discussione, ma 1) questo continua a non essere risolto e 2) ho trovato del tempo per approfondire di nuovo… si scopre che ero un idiota che non sapeva seguire le istruzioni. Ecco come ho scoperto di essere un imbecille e perché ora sono pronto a risolvere questo problema (con un po’ di aiuto).

Quello che ho finito per fare è stato esportare un CSV da Stripe di tutti gli account cancellati. Mi sono concentrato sullo stesso utente di Discourse a cui si fa riferimento sopra in questa discussione, che era un abbonato, si era cancellato, ma poi non poteva riabbonarsi perché la pagina di abbonamento mostrava “acquistato” anche se la sua pagina degli abbonamenti attivi non mostrava abbonamenti. Nei dati CSV, il suo record mostrava “cancellato” con i seguenti dati;

  • id (sub_JNWejdDo4qhLG5)
  • customer_id (cus_JmiMoqZNTzUNxt)
  • user_id (id utente Discourse 4981)

Poi mi sono collegato al container dell’app, sono entrato nella console Ruby e ho iniziato a curiosare. Per prima cosa ho cercato il suo ID cliente in DiscourseSubscriptions::Customer e l’ho trovato.

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

Successivamente ho cercato in DiscourseSubscriptions::Subscription per vedere se questo utente avesse abbonamenti e si scopre che sì, li aveva;

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

Quindi, sembra che possa semplicemente rimuovere questo record di abbonamento e risolvere tutto… per questo utente. Il fatto è che ogni utente cancellato che ho controllato nel mio export CSV aveva ancora abbonamenti rimanenti nel sistema. Ovviamente c’è una disconnessione in qualche modo / da qualche parte tra il webhook di Stripe e il plugin di abbonamento… solo che non so dove / come.

  • Primo; come rimuovo in sicurezza i dati del record di abbonamento per un particolare utente? Spiegamelo come se avessi 5 anni. Sono al prompt della console Ruby, come faccio a garantire che vengano rimossi solo i dati di abbonamento dell’utente di destinazione e che non cancelli i dati di abbonamento di tutti?

  • Secondo, come posso risolvere il meccanismo del webhook di cancellazione dell’abbonamento?

Tutto il vostro aiuto è molto apprezzato!

AGGIORNAMENTO:

Ok, sono andato un po’ più avanti… sono riuscito a capire come usare .delete_by per rimuovere solo i dati di abbonamento per l’utente di destinazione;

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

Tuttavia, il record del cliente ha ancora un product_id associato;

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

Ciò significa che vedono ancora il segno di spunta verde e non possono riabbonarsi… quindi ho applicato il “destroy_all” all’oggetto Customer… e ha funzionato! Ma solo per quell’utente, ovviamente…

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

Quindi ora si tratta solo di diagnosticare perché il webhook di Stripe per gli abbonamenti cancellati non funziona.