Ciclo di vita dell'abbonamento

Gli acquisti di abbonamenti possono attraversare diversi stati durante il loro ciclo di vita, a seconda di molti fattori, tra cui il comportamento di rinnovo automatico, le situazioni di rifiuto dei pagamenti e le azioni di gestione degli sviluppatori.

Gestire il ciclo di vita degli abbonamenti con rinnovo automatico

Quando lo stato di abbonamento di un utente cambia, il server di backend riceve un messaggio SubscriptionNotification

Figura 1. Stati del ciclo di vita ed eventi di transizione per gli acquisti di abbonamenti con rinnovo automatico.

Per aggiornare lo stato nel backend, chiama l'API purchases.subscriptionsv2.get con il token di acquisto incluso nella notifica. Questo endpoint fornisce lo stato dell'abbonamento più recente a cui è stato assegnato un token di acquisto ed è considerato la fonte attendibile per la gestione degli abbonamenti.

Il token di acquisto è valido dalla registrazione dell'abbonamento fino a 60 giorni dopo la scadenza. Dopo questa data, il token di acquisto non sarà più valido per chiamare l'API Google Play Developer.

Nuovi acquisti di abbonamenti con rinnovo automatico

Quando un utente acquista un abbonamento, viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_PURCHASED al tuo client RTDN. Che tu riceva questa notifica o registri un nuovo acquisto in-app tramite PurchasesUpdatedListener o recuperi manualmente gli acquisti nel metodo onResume() della tua app, devi elaborare il nuovo acquisto nel tuo backend sicuro. A tale scopo, proceda nel seguente modo:

  1. Esegui una query sull'endpoint purchases.subscriptionsv2.get per ottenere una risorsa di abbonamento contenente lo stato dell'abbonamento più recente.
  2. Assicurati che il valore del campo subscriptionState sia SUBSCRIPTION_STATE_ACTIVE.
  3. Verifica l'acquisto.
  4. Concedere all'utente l'accesso ai contenuti. L'account utente associato all'acquisto può essere identificato con l'oggetto ExternalAccountIdentifiers della risorsa di abbonamento se gli identificatori sono stati impostati al momento dell'acquisto utilizzando setObfuscatedAccountId e setObfuscatedProfileId.

La Libreria Fatturazione Play include anche un metodo per confermare un abbonamento, acknowledgePurchase(), e un metodo per verificare lo stato di accettazione, isAcknowledged(). Tuttavia, ti consigliamo di gestire l'elaborazione degli acquisti nel tuo backend per una maggiore sicurezza.

La risorsa di abbonamento per i nuovi acquisti è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Rinnovare l'abbonamento

Viene inviata una notifica SUBSCRIPTION_RENEWED al rinnovo di un abbonamento con rinnovo automatico. Assicurati che l'utente abbia ancora diritto all'abbonamento, quindi aggiorna lo stato dell'abbonamento con il nuovo expiryTime fornito nella risorsa abbonamento restituita dall'API Google Play Developer. La risorsa di abbonamento è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

Non è necessario confermare i rinnovi dell'abbonamento.

Periodo di tolleranza

In caso di problemi di pagamento con il rinnovo di un abbonamento, Google invia una notifica all'utente e tenta periodicamente di rinnovare l'abbonamento per un certo periodo di tempo prima della scadenza dell'abbonamento stesso. Questo periodo di recupero può consistere in un periodo di tolleranza seguito da un periodo di sospensione dell'account. Durante un periodo di tolleranza, l'utente deve continuare ad avere accesso al proprio diritto di abbonamento.

Il metodo queryPurchasesAsync() continua a restituire gli acquisti che si trovano nel periodo di tolleranza. Se la tua app si basa esclusivamente su queryPurchasesAsync per verificare se un utente ha diritto a un abbonamento, l'app dovrebbe gestire automaticamente i periodi di tolleranza, perché questi abbonamenti vengono mostrati come attivi tramite la Libreria Fatturazione Play.

La sincronizzazione dello stato dell'abbonamento con il tuo backend ti consente di essere più consapevole dei rifiuti dei pagamenti e di avere più contesto per cercare di ridurre il tasso di abbandono involontario. Ascolta i messaggi di SubscriptionNotification di tipo SUBSCRIPTION_IN_GRACE_PERIOD per ricevere una notifica quando l'utente entra in un periodo di tolleranza. Mentre l'utente si trova in un periodo di tolleranza, la risorsa di abbonamento contiene autoRenewEnabled = true. Google Play estende in modo dinamico il valore expiryTime fino alla scadenza del periodo di tolleranza perché il diritto dovrebbe durare fino all'annullamento dell'utente o fino a quando il periodo di tolleranza è durato per la durata massima. Il valore del campo subscriptionState durante questo periodo è SUBSCRIPTION_STATE_IN_GRACE_PERIOD. La risorsa di abbonamento è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Google Play informa gli utenti che si trovano in un periodo di tolleranza che il loro pagamento è stato rifiutato e li invita a risolvere i problemi relativi al metodo di pagamento nel Play Store. Quando un utente entra in un periodo di tolleranza, dovresti inoltre incoraggiarlo a correggere il suo metodo di pagamento nel caso in cui l'errore non sia intenzionale. Un modo semplice per eseguire questa operazione è utilizzare l'API In-App Messaging. Se chiami questa API all'apertura della tua app, l'utente visualizza un messaggio di Google Play in uno snackbar temporaneo che lo informa che il suo pagamento è stato rifiutato. Questo messaggio include anche un link diretto che consente all'utente di correggere il metodo di pagamento su Google Play.

Non appena l'utente corregge il metodo di pagamento, l'abbonamento viene rinnovato con la data di rinnovo originale e potrai gestire il rinnovo come descritto nella sezione Rinnovi.

Se l'utente non modifica il metodo di pagamento durante il periodo di tolleranza, l'abbonamento viene sospeso dall'account e perde il diritto.

Accesso al periodo di tolleranza e recupero

La figura 2 mostra una sequenza temporale di un abbonamento che entra in un periodo di tolleranza e poi recupera quando l'utente correggi il metodo di pagamento. Al termine del periodo di tolleranza, l'utente dovrebbe perdere i vantaggi dell'abbonamento e attivare la sospensione dell'account.

Figura 2. Cronologia di un abbonamento che entra in un periodo di tolleranza e recupera prima del suo termine.

È importante ricordare quanto segue:

  • Durante il periodo di tolleranza, l'utente deve mantenere l'accesso ai vantaggi dell'abbonamento.
  • Quando un abbonamento viene ripristinato durante un periodo di tolleranza, la data di rinnovo non viene reimpostata.
  • Se prolunghi il periodo di tolleranza, ad esempio da 7 a 14 giorni, gli utenti che si trovano in un periodo di tolleranza ottengono l'accesso esteso ai vantaggi dell'abbonamento.
  • Se riduci il periodo di tolleranza, i vantaggi dell'abbonamento vengono revocati immediatamente per gli utenti che sono ancora abbastanza vicini al precedente periodo di tolleranza per superare quello nuovo. Ad esempio, se riduci il periodo di tolleranza da 14 a 7 giorni, i vantaggi dell'abbonamento vengono revocati immediatamente per gli utenti che si trovano tra i 8 e i 14 giorni del periodo di tolleranza precedente.
  • L'abbonamento rimane in stato attivo e non riceverai un RTDN del periodo di tolleranza fino al termine del periodo di tolleranza silenziosa

Periodo di tolleranza per la modalità silenziosa

Puoi impostare un periodo di tolleranza di 0 giorni, ma Google Play attenderà almeno 1 giorno per garantire tempo sufficiente per nuovi tentativi di pagamento. Questo periodo di tolleranza silenzioso offre una rete di sicurezza per l'elaborazione dei pagamenti. Durante questo periodo di 24 ore, l'abbonamento rimane nello stato ACTIVE.

Il modo migliore per rimanere sincronizzato con le modifiche dello stato degli abbonamenti è ascoltare e reagire alle notifiche in tempo reale per lo sviluppatore (RTDN). Chiama il metodo purchases.subscriptionsv2.get() al momento RTDN anziché alla data di scadenza per ottenere uno stato più preciso dell'abbonamento.

A seconda dello stato dell'abbonamento dopo il periodo di tolleranza silenziosa di 24 ore, dovresti ricevere una delle seguenti notifiche:

  • SUBSCRIPTION_ON_HOLD (se abilitata)
  • SUBSCRIPTION_CANCELED (se annullato)
  • SUBSCRIPTION_EXPIRED (se scaduto)
  • SUBSCRIPTION_RENEWED (se rinnovato correttamente)

Puoi anche chiamare il metodo subscriptionV2.get() in qualsiasi momento dopo il periodo di tolleranza senza audio di 24 ore per conoscere lo stato più recente dell'abbonamento.

Sospensione dell'account

In caso di problemi di pagamento con il rinnovo di un abbonamento, al termine del periodo di tolleranza inizia il periodo di sospensione dell'account. Quando un abbonamento entra in sospensione dell'account, devi bloccare l'accesso al diritto di abbonamento.

Durante la sospensione dell'account, devi continuare a gestire eventuali annullamenti, ripristini o riacquisti degli abbonamenti, a seconda delle esigenze, perché l'utente può apportare queste modifiche mentre l'abbonamento è sospeso.

Le RTDN ti inviano una notifica quando l'utente entra nel periodo di sospensione dell'account, in modo che tu possa comunicare il prima possibile il motivo della sospensione del suo accesso all'abbonamento. Un modo semplice per eseguire questa operazione è utilizzare l'API In-App Messaging. Se chiami questa API all'apertura dell'app, l'utente riceverà un messaggio in una snackbar temporanea che lo informa che il suo pagamento è stato rifiutato. Questo messaggio include anche un link diretto che consente all'utente di correggere il metodo di pagamento su Google Play.

Se gli utenti possono accedere ai contenuti dell'abbonamento al di fuori della tua app, potrebbero scoprire di aver perso l'accesso su diverse piattaforme. Potresti voler inviare una notifica push o un'email all'utente per informarlo che il suo abbonamento non è più attivo a causa di un pagamento rifiutato.

L'abbonamento non viene restituito dal metodo queryPurchasesAsync() durante la sospensione dell'account; pertanto, se la tua app si basa su questo metodo per visualizzare gli acquisti esistenti, devi supportare la sospensione dell'account per impostazione predefinita.

Con le notifiche in tempo reale per lo sviluppatore, ricevi un messaggio SubscriptionNotification di tipo SUBSCRIPTION_ON_HOLD quando viene attivata una sospensione dell'account per un abbonamento. Chiama il metodo purchases.subscriptionsv2.get dal tuo server di backend sicuro per recuperare le nuove informazioni sull'abbonamento. Durante il blocco dell'account, il campo expiryTime della risorsa abbonamento è impostato su un timestamp passato e il campo subscriptionState è impostato su SUBSCRIPTION_STATE_ON_HOLD:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Per ripristinare l'accesso, gli utenti devono correggere il metodo di pagamento. Google Play informa gli utenti che hanno sospeso l'account in merito al loro rifiuto del pagamento e dovresti anche invitarli a correggere il loro metodo di pagamento.

Dopo che l'utente ha corretto il metodo di pagamento, l'abbonamento torna allo stato attivo e devi ripristinare l'accesso ai contenuti in abbonamento. In questo caso, il token di acquisto è uguale a prima dell'inizio della sospensione dell'account perché lo stesso acquisto è in fase di recupero e ricevi un RTDN di tipo SUBSCRIPTION_RECOVERED.

Dopo il recupero, la Libreria Fatturazione Play restituisce nuovamente l'abbonamento tramite il metodo queryPurchasesAsync(). Se utilizzi questo metodo per determinare se un utente ha diritto a un abbonamento, la tua app dovrebbe gestire automaticamente l'abbonamento che viene recuperato dalla sospensione dell'account.

Attendi un messaggio SubscriptionNotification di tipo SUBSCRIPTION_RECOVERED per ricevere una notifica quando viene recuperato un abbonamento e l'utente deve recuperare l'accesso. Se esegui una query per un abbonamento dopo aver ricevuto questa notifica, il campo expiryTime viene impostato su un timestamp futuro e il campo subscriptionState viene nuovamente impostato su SUBSCRIPTION_STATE_ACTIVE:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

Se l'utente non correggi il metodo di pagamento prima del termine del periodo di sospensione dell'account, riceverai un RTDN di tipo SUBSCRIPTION_CANCELED. Per istruzioni sulla gestione di un annullamento, consulta la sezione Annullamenti. Quando esegui una query su un abbonamento che è stato annullato in questo modo, il campo expiryTime restituito è impostato su un timestamp passato:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Subito dopo la notifica dell'annullamento durante la sospensione dell'account, riceverai anche una RTDN di tipo SUBSCRIPTION_EXPIRED perché l'utente non ha più il diritto a pagamento e l'abbonamento ha abbandonato l'abbonamento. Puoi gestire questa scadenza come faresti normalmente.

L'utente può riottenere l'accesso riacquistando lo stesso piano di abbonamento o qualsiasi altro piano che offri tramite l'app durante il periodo di sospensione dell'account dall'acquisto originale. In questo caso, viene emesso un nuovo token di acquisto e il nuovo valore viene restituito come parte di un evento SUBSCRIPTION_PURCHASED che rappresenta la nuova istanza.

Accesso all'archiviazione a fini legali e recupero dell'account

La figura 3 mostra una cronologia per un abbonamento che entra in sospensione dell'account e poi recupera quando l'utente correggi il metodo di pagamento.

Figura 3. Cronologia di un abbonamento che prevede una sospensione dell'account e viene recuperato prima del termine.

Come nell'esempio precedente, la Figura 4 mostra una sequenza temporale di un abbonamento che entra in un periodo di tolleranza prima dell'attivazione della sospensione dell'account, per poi recuperare quando è in sospeso.

Figura 4. Sequenza temporale di un abbonamento che entra in un periodo di tolleranza, quindi inizia la sospensione dell'account e, infine, recupera prima della fine della sospensione dell'account.

È importante ricordare quanto segue:

  • Prima che un abbonamento entri in sospensione dell'account, Google Play effettua ulteriori tentativi di addebito sul metodo di pagamento per un massimo di 48 ore. L'utente conserva i vantaggi dell'abbonamento durante questo periodo. Una volta trascorso questo periodo, l'abbonamento viene sospeso e l'utente dovrebbe perdere l'accesso ai vantaggi dell'abbonamento.
  • L'abbonamento viene sospeso direttamente quando l'abbonamento viene ripristinato da uno stato di pausa con una forma di pagamento non riuscita.
  • Quando un abbonamento viene ripristinato dopo la sospensione dell'account, la data di rinnovo viene reimpostata.

Scadenze

Alla scadenza di un abbonamento, l'utente non può più accedervi. In questo caso, viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_EXPIRED. Quando ricevi questa notifica, esegui una query all'API Google Play Developer per ottenere la risorsa di abbonamento più recente. Dopo aver confermato che subscriptionState è SUBSCRIPTION_STATE_EXPIRED, rimuovi il diritto e registra lo stato di acquisto come non valido nel backend. La risorsa di abbonamento è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

Annullamenti

Un utente può annullare volontariamente un abbonamento dal Centro abbonamenti di Google Play oppure far annullare automaticamente l'abbonamento se non lo recupera dopo la sospensione dell'account. Gli sviluppatori possono anche attivare un annullamento con purchases.subscriptions.cancel Quando un abbonamento viene annullato, l'utente mantiene l'accesso ai contenuti fino alla fine del ciclo di fatturazione corrente. Al termine del ciclo di fatturazione, l'accesso dovrebbe essere revocato.

L'annullamento di un abbonamento attiva una notifica di SUBSCRIPTION_CANCELED. Quando ricevi questa notifica, per la risorsa dell'abbonamento restituita dall'API Google Play Developer il campo subscriptionState è impostato su SUBSCRIPTION_STATE_CANCELED, mentre il campo expiryTime contiene la data in cui l'utente dovrebbe perdere l'accesso all'abbonamento. Se questa data è nel passato, l'utente dovrebbe perdere immediatamente il diritto. Questo può accadere, ad esempio, se un utente annulla un abbonamento mentre è sospeso l'account a causa di un pagamento rifiutato.

La risorsa abbonamento per un acquisto annullato è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

Puoi esaminare il campo canceledStateContext nella risorsa abbonamento per scoprire perché l'abbonamento è stato annullato (ad esempio, se l'abbonamento è stato annullato dall'utente, dal sistema o da te). Se l'abbonamento è stato annullato dall'utente, puoi controllare il campo userInitiatedCancellation per scoprire perché l'utente ha annullato l'abbonamento. Queste informazioni possono delineare le strategie di comunicazione.

Quando un abbonamento viene annullato, ma non è ancora scaduto, viene comunque restituito da queryPurchasesAsync(). Potresti voler visualizzare un messaggio nell'app che informa l'utente che l'abbonamento è stato annullato e fornisce la data di scadenza.

Revoca

Un abbonamento può essere revocato per diversi motivi, tra cui la revoca dell'abbonamento da parte del backend utilizzando purchases.subscriptions.revoke o il rimborso dell'acquisto. In questo caso, revoca immediatamente il diritto dell'utente. In questo caso viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_REVOKED. Quando ricevi questa notifica, il campo subscriptionState è impostato su SUBSCRIPTION_STATE_EXPIRED per la risorsa abbonamento restituita dall'API Google Play Developer.

La risorsa di abbonamento per un acquisto revocato è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

Abbonamenti differiti

Esistono vari motivi per cui potresti voler estendere il diritto di un utente. Ad esempio, potresti offrire agli utenti l'accesso senza costi sotto forma di promozione speciale, ad esempio offrendo una settimana senza costi per l'acquisto di un film o offrendo l'accesso senza costi ai clienti come gesto di avviamento. Puoi usare il metodo purchases.subscriptions.defer dell'API Play Developer per anticipare la data di attivazione successiva di un abbonamento con rinnovo automatico. Quando esegui questa operazione, viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_DEFERRED. Durante il periodo di rinvio, l'utente viene abbonato ai tuoi contenuti con accesso completo, ma non riceve alcun addebito. La data di rinnovo dell'abbonamento viene aggiornata alla nuova data.

Per i piani prepagati, puoi utilizzare l'API Defer billing per posticipare la scadenza.

La risorsa di abbonamento per un abbonamento differito è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

Abbonamenti in pausa

Puoi ridurre il tasso di abbandono volontario consentendo agli utenti di mettere in pausa l'abbonamento. Quando attivi la funzionalità di pausa, gli utenti possono scegliere di mettere in pausa l'abbonamento per un periodo di tempo compreso tra una settimana e tre mesi, a seconda del periodo ricorrente.

Ricorrenza degli abbonamenti Ogni settimana Ogni mese 3 mesi 6 mesi Annuale
Durata delle pause disponibili* 1 settimana
2 settimane
3 settimane
4 settimane
1 mese
2 mesi
3 mesi
1 mese
2 mesi
3 mesi
1 mese
2 mesi
3 mesi
N/A
* Funzionalità soggetta a modifiche in qualsiasi momento.

La sospensione di un abbonamento ha effetto solo al termine dell'attuale periodo di fatturazione. Durante la sospensione dell'abbonamento, l'utente non ha accesso all'abbonamento e non paga il prezzo di rinnovo. Al termine del periodo di sospensione, l'abbonamento riprende e Google tenta di rinnovarlo. Se il ripristino va a buon fine, l'abbonamento diventa di nuovo attivo. Se il ripristino non va a buon fine a causa di un problema di pagamento, l'utente entra nello stato di sospensione dell'account come mostrato nelle figure 5 e 6:

Figura 5. Un utente mette in pausa e poi ripristina l'abbonamento.
Figura 6. Un utente mette in pausa l'abbonamento, quindi viene attivata la sospensione dell'account.

Un utente può anche scegliere di ripristinare manualmente un abbonamento in qualsiasi momento durante il periodo di pausa, come mostrato nella Figura 6. Quando un utente riprende manualmente, la data di fatturazione passa alla data di ripristino manuale.

Quando l'abbonamento di un utente viene sospeso, la Libreria Fatturazione Play non restituisce l'abbonamento tramite il metodo queryPurchasesAsync(). Se l'abbonamento viene ripristinato, il metodo queryPurchasesAsync() lo restituisce di nuovo.

Ascolta le RTDN da sapere quando un utente mette in pausa l'abbonamento. Queste notifiche ti consentono inoltre di informare gli utenti nella tua app che hanno sospeso l'abbonamento e non possono accedervi. Dovresti anche fornire all'utente un modo per ripristinare manualmente l'abbonamento in qualsiasi momento utilizzando un link diretto a Google Play.

Un messaggio SubscriptionNotification di tipo SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED viene inviato quando l'utente avvia una pausa dell'abbonamento. A questo punto, l'utente deve mantenere l'accesso al proprio abbonamento fino alla data di rinnovo successiva e la risorsa dell'abbonamento contiene autoRenewEnabled = true. In questo punto, il valore del campo subscriptionState è SUBSCRIPTION_STATE_ACTIVE.

Quando viene applicata la pausa, viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_PAUSED. In questo caso, l'utente dovrebbe perdere l'accesso al proprio abbonamento e la risorsa di abbonamento contiene autoRenewEnabled = true e il campo subscriptionState è impostato su SUBSCRIPTION_STATE_PAUSED. Controlla l'oggetto PausedStateContext per sapere quando è previsto il rinnovo dell'abbonamento.

Viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_RENEWED se l'abbonamento viene ripristinato automaticamente al termine del periodo di pausa o se l'utente ha scelto di ripristinare manualmente l'abbonamento. Questo deve essere gestito come descritto nella sezione Rinnovi.

Viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_ON_HOLD se si è verificato un errore di pagamento durante il tentativo di ripristinare l'abbonamento dopo la sospensione. Questa operazione deve essere gestita come descritto nell'articolo Sospensione dell'account.

Riabbonati

Per i piani base dell'abbonamento con rinnovo automatico, sul Google Play Store potrebbe essere visualizzato un pulsante Riabbonati. Questo pulsante consente agli utenti di riottenere l'accesso a un abbonamento. Potrebbe non essere visualizzato per vari motivi, ad esempio quando un abbonamento è scaduto molto tempo fa.

Figura 7. Sezione Account > Abbonamenti dell'app Google Play Store che mostra un abbonamento annullato con un pulsante Riabbonati.

Anche se il pulsante è sempre etichettato come Riabbonati, la sua funzionalità dipende dallo stato dell'abbonamento.

Mentre un abbonamento è stato annullato ma non è ancora scaduto, l'utente è ancora iscritto e riceve i relativi vantaggi. Se l'utente tocca Riabbonati, l'annullamento viene annullato di fatto e l'abbonamento continua a essere rinnovato. Questa azione è nota come ripristino nella documentazione per gli sviluppatori e nelle API di Google Play.

Dopo la scadenza di un abbonamento con rinnovo automatico, puoi consentire agli utenti di acquistare lo stesso piano base dell'abbonamento. Questa azione è nota come riabbonati nella documentazione per gli sviluppatori e nelle API di Google Play. Puoi configurare questa opzione per ogni piano base in Play Console o utilizzando l'API.

Ripristina prima della scadenza

Se la tua app si basa esclusivamente sul metodo queryPurchasesAsync() per determinare se un utente ha diritto a un abbonamento, l'app dovrebbe gestire automaticamente i ripristini perché il metodo queryPurchasesAsync() continua a restituire gli acquisti annullati prima della relativa data di scadenza. Un abbonamento ripristinato continua a rinnovarsi come se non fosse stato annullato.

Se l'app sincronizza lo stato dell'abbonamento con un backend, devi ascoltare un messaggio SubscriptionNotification di tipo SUBSCRIPTION_RESTARTED. Dopo aver ricevuto questo RTDN, l'app può rispondere alla notifica, registrare che l'abbonamento è ora impostato per il rinnovo e l'interruzione della visualizzazione dei messaggi di ripristino nell'app. La risorsa dell'abbonamento è simile all'esempio seguente:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

Riabbonati dopo la scadenza

Se un piano base con rinnovo automatico viene configurato utilizzando Google Play Console o l'API per consentire il rinnovo dell'abbonamento, gli utenti possono riacquistare un abbonamento scaduto nel Google Play Store.

Si tratta di nuovi acquisti. Google Play emette un nuovo token di acquisto e il tuo backend riceve un RTDN di tipo SUBSCRIPTION_PURCHASED. In questo caso, lo stato di acquisto per questo tipo di acquisto out-of-app non include un linkedPurchaseToken associato all'acquisto originale, perché l'abbonamento originale è scaduto completamente. Si tratta di nuovi acquisti che il tuo backend deve elaborare e confermare come qualsiasi altro acquisto.

Eseguire l'upgrade, eseguire il downgrade e riabbonarsi

Quando un utente esegue l'upgrade, il downgrade o si registra dopo l'annullamento dall'app prima della scadenza dell'abbonamento, l'abbonamento precedente viene invalidato e viene creato un nuovo abbonamento con un nuovo token di acquisto.

Inoltre, la risorsa abbonamento restituita dall'API Google Play Developer contiene un campo linkedPurchaseToken che indica l'acquisto precedente da cui l'utente ha eseguito l'upgrade, il downgrade o ha sottoscritto di nuovo l'abbonamento. Puoi utilizzare il token di acquisto in quel campo per cercare il vecchio abbonamento e identificare l'account utente esistente in modo da poter associare il nuovo acquisto allo stesso account.

Prima di offrire opzioni di upgrade, downgrade o riabbonati a un utente nella tua app, devi confermare l'abbonamento esistente. Qualsiasi modifica al piano o nuova sottoscrizione viene bloccata se l'abbonamento esistente è ancora in attesa di accettazione.

Se l'utente acquista correttamente l'upgrade, il downgrade o riabbonati, si tratta di un nuovo acquisto che devi confermare. A questo scopo, ti consigliamo di utilizzare l'API Google Play Developer. La risorsa di abbonamento è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Modifiche ai prezzi

Consulta la guida alle best practice per la modifica del prezzo per scoprire di più su come modificare i prezzi degli abbonamenti con rinnovo automatico e inviare notifiche agli utenti quando opportuno.

Quando le variazioni di prezzo vengono applicate agli abbonati esistenti con attivazione, riceverai un RTDN se l'utente interviene per confermare o rifiutare il nuovo prezzo.

Gestire la conferma dell'utente di una variazione di prezzo di attivazione

Quando un utente accetta l'aumento di prezzo del tuo abbonamento, ricevi un messaggio SubscriptionNotification di tipo SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Con una riduzione del prezzo per la disattivazione o quando l'aumento del prezzo dell'abbonamento verrà rinnovato, riceverai un messaggio SubscriptionNotification di tipo SUBSCRIPTION_RENEWED. Tratta questa notifica come qualsiasi altro rinnovo.

Gestire i casi in cui l'aumento del prezzo dell'attivazione non è accettato

Se un utente non ha accettato l'aumento di prezzo per l'attivazione prima di dover rinnovare il rinnovo al prezzo più alto, l'iscrizione viene annullata automaticamente e ricevi un messaggio SubscriptionNotification con il tipo SUBSCRIPTION_CANCELED. Gestisci questo evento come descritto nella sezione Annullamenti.

Gli utenti possono anche annullare i propri abbonamenti richiedendo un aumento del prezzo a disattivazione seguendo lo stesso meccanismo.

Gestire il ciclo di vita dei piani prepagati

Come per gli abbonamenti con rinnovo automatico, devi confermare i piani prepagati dopo ogni nuovo acquisto. Nel caso dei piani prepagati, è necessario elaborare completamente sia l'acquisto iniziale che le eventuali ricariche, in quanto l'utente deve seguire ogni volta il flusso di acquisto.

Dato il potenziale per brevi durate del piano prepagato, è importante confermare l'acquisto il prima possibile. I piani prepagati con una durata di una settimana o più devono essere confermati entro 3 giorni. I piani prepagati con una durata inferiore a una settimana devono essere confermati entro metà della durata del piano. Ad esempio, gli sviluppatori hanno 1,5 giorni di tempo per confermare l'acquisto di un piano prepagato di tre giorni.

Figura 8. Stati del ciclo di vita ed eventi di transizione per gli acquisti di abbonamenti.

Un messaggio SubscriptionNotification di tipo SUBSCRIPTION_PURCHASED viene inviato al tuo client RTDN ogni volta che viene acquistato un abbonamento a un piano prepagato, incluse ogni ricarica. Chiama il metodo purchases.subscriptionsv2.get per verificare lo stato dell'abbonamento con piano prepagato più recente.

Per gli acquisti di ricarica viene emesso un nuovo token di acquisto e tu ricevi il token di acquisto precedente nel campo linkedPurchaseToken nell'ambito del nuovo stato di acquisto dell'abbonamento. Il token di acquisto è valido dalla registrazione dell'abbonamento fino a 60 giorni dopo la scadenza. Dopo questa data, il token di acquisto non è più valido per chiamare l'API Google Play Developer.

La risorsa di abbonamento per un piano prepagato è simile al seguente esempio:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

Puoi vedere quando termina il diritto nel campo expiryTime. Gli acquisti di ricarica aumentano il tempo del diritto accumulandolo. Ciò significa che se l'utente effettua la ricarica prima del termine del diritto originale, la nuova data/ora viene aggiunta alla data di scadenza precedente.

Potresti voler visualizzare un messaggio nell'app per informare l'utente che i suoi abbonamenti prepagati possono essere estesi con una ricarica. Per sapere quando un utente può effettuare la ricarica, controlla il campo allowExtendAfterTime nella risorsa di abbonamento.

I piani prepagati non si rinnovano automaticamente, quindi non possono essere annullati. Se un utente vuole annullare un piano prepagato, può consentirgli di raggiungere la data di scadenza.