Ciclo di vita dell'abbonamento

Gli acquisti degli 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 per gli abbonamenti con rinnovo automatico

Quando lo stato dell'abbonamento di un utente cambia, il tuo 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 più recente dell'abbonamento in base a 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 è più valido per chiamare l'API Google Play Developer.

Acquisti di nuovi abbonamenti con rinnovo automatico

Quando un utente acquista un abbonamento, al tuo client RTDN viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_PURCHASED. Se ricevi questa notifica o registri un nuovo acquisto in-app tramite PurchasesUpdatedListener o recupera 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 recuperare una risorsa dell'abbonamento con lo stato più recente dell'abbonamento.
  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 controllare lo stato della conferma, 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

Per gli abbonamenti senza rate e con rinnovo automatico, al momento del rinnovo viene inviata una notifica SUBSCRIPTION_RENEWED. Per gli abbonamenti a rate, viene inviata una notifica SUBSCRIPTION_RENEWED ogni volta che viene addebitato l'abbonamento alla data di fatturazione. 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 Developers. La risorsa di abbonamento è simile all'esempio seguente:

{
  "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 po' di tempo prima della scadenza. Il periodo di recupero può essere composto da un periodo di tolleranza seguito da un periodo di sospensione dell'account. Durante un periodo di tolleranza, l'utente dovrebbe 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 di pagamento e ti offre maggiore contesto quando cerchi di ridurre il tasso di abbandono involontario. Ascolta i messaggi SubscriptionNotification di tipo SUBSCRIPTION_IN_GRACE_PERIOD per ricevere una notifica quando l'utente inizia un periodo di tolleranza. Mentre l'utente è in un periodo di tolleranza, la risorsa dell'abbonamento contiene autoRenewEnabled = true. Google Play estende in modo dinamico il valore expiryTime fino alla scadenza del periodo di tolleranza, in quanto il diritto dovrebbe durare fino all'annullamento da parte dell'utente o fino alla scadenza del periodo di tolleranza per la sua durata massima. Il valore del campo subscriptionState durante questo periodo è SUBSCRIPTION_STATE_IN_GRACE_PERIOD. La risorsa di abbonamento è simile all'esempio seguente:

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

Google Play comunica agli utenti che si trovano in un periodo di tolleranza che il loro pagamento è stato rifiutato e li chiede a risolvere i problemi relativi al metodo di pagamento nel Play Store. Quando un utente entra in un periodo di tolleranza, devi anche incoraggiarlo a correggere il metodo di pagamento nel caso in cui l'errore sia stato involontario. Un modo semplice per farlo è utilizzare l'API In-App Messaging. Se chiami questa API quando l'utente apre la tua app, gli viene mostrato un messaggio di Play in uno snackbar temporaneo che comunica all'utente 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 sistema il metodo di pagamento, l'abbonamento si rinnova con la data di rinnovo originale e puoi gestire il rinnovo come descritto nella sezione Rinnovi.

Se l'utente non correggi il metodo di pagamento durante il periodo di tolleranza, l'abbonamento entra in una sospensione dell'account e perde il diritto.

Accesso e recupero del periodo di tolleranza

La Figura 2 mostra la cronologia di un abbonamento che entra in un periodo di tolleranza e viene recuperato quando l'utente corregge il metodo di pagamento. Al termine del periodo di tolleranza, l'utente deve perdere i vantaggi dell'abbonamento e passare alla sospensione dell'account.

Figura 2. Cronologia per un abbonamento che entra in un periodo di tolleranza e recupera prima della scadenza.

È importante ricordare i seguenti punti:

  • Durante un periodo di tolleranza, l'utente deve mantenere l'accesso ai vantaggi dell'abbonamento.
  • Quando un abbonamento viene recuperato durante un periodo di tolleranza, la data di rinnovo non viene reimpostata.
  • Se estendi 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 verranno revocati immediatamente per gli utenti che il periodo di tolleranza precedente per superare il nuovo periodo di tolleranza. Ad esempio, se riduci il periodo di tolleranza da 14 a 7 giorni, i vantaggi dell'abbonamento verranno revocati immediatamente agli utenti che si trovano tra gli 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 senza audio.

Periodo di tolleranza silenziosa

Puoi impostare un periodo di tolleranza di 0 giorni, ma Google Play attenderà almeno 1 giorno per garantire tempo sufficiente per i nuovi tentativi di pagamento. Questo periodo di tolleranza senza notifiche 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 sincronizzati con le modifiche dello stato dell'abbonamento è ascoltare e reagire alle notifiche in tempo reale per lo sviluppatore (RTDN). Per ottenere uno stato più preciso dell'abbonamento, chiama il metodo purchases.subscriptionsv2.get() all'ora RTDN anziché alla data di scadenza.

A seconda dello stato dell'abbonamento dopo il periodo di tolleranza senza audio 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 il rinnovo è andato a buon fine)

Puoi anche chiamare il metodo subscriptionV2.get() in qualsiasi momento dopo il periodo di tolleranza della modalità silenziosa di 24 ore per ricevere lo stato più recente dell'abbonamento.

Sospensione dell'account

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

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

Gli RTDN ti inviano una notifica quando l'utente entra nel periodo di sospensione dell'account, così puoi informarlo il prima possibile sul motivo della sospensione del suo accesso all'abbonamento. Un modo semplice per farlo è utilizzare l'API In-App Messaging. Se chiami questa API quando l'utente apre l'app, gli verrà mostrato 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 proprio metodo di pagamento su Google Play.

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

L'abbonamento non viene restituito dal metodo queryPurchasesAsync() durante la sospensione dell'account, quindi se la tua app si basa su questo metodo per mostrare gli acquisti esistenti, dovresti 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 un abbonamento viene sospeso. Chiama il metodo purchases.subscriptionsv2.get dal tuo server di backend sicuro per recuperare le nuove informazioni sull'abbonamento. Durante la sospensione dell'account, il campo expiryTime della risorsa abbonamento è impostato su un timestamp precedente, mentre 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 proprio metodo di pagamento. Google Play informa gli utenti in stato di sospensione dell'account del rifiuto dei pagamenti e dovresti anche incoraggiarli a correggere il metodo di pagamento.

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

Per gli abbonamenti a rate, i pagamenti rifiutati e recuperi potrebbero verificarsi per qualsiasi tentativo di pagamento individuale.

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, l'app dovrebbe gestire automaticamente l'abbonamento di recupero dalla sospensione dell'account.

Ascolta 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 impostato di nuovo su SUBSCRIPTION_STATE_ACTIVE:

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

Se l'utente non corregge il metodo di pagamento prima della fine del periodo di sospensione dell'account, riceverai invece un RTDN di tipo SUBSCRIPTION_CANCELED. Per istruzioni su come gestire un annullamento, consulta la sezione Annullamenti. Quando esegui una query per un abbonamento che è stato annullato in questo modo, il campo expiryTime restituito è impostato su un timestamp precedente:

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

Subito dopo aver ricevuto la notifica dell'annullamento durante la sospensione dell'account, riceverai anche un RTDN di tipo SUBSCRIPTION_EXPIRED perché l'utente ha esaurito il diritto di pagamento e l'abbonamento è stato abbandonato con l'annullamento. Puoi gestire questa scadenza come faresti normalmente.

L'utente può recuperare l'accesso acquistando 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 questa nuova istanza.

Accesso e recupero dalla sospensione dell'account

La Figura 3 mostra la cronologia di un abbonamento per cui viene applicata la sospensione dell'account e il ripristino viene recuperato quando l'utente corregge il metodo di pagamento.

Figura 3. Cronologia per un abbonamento che prevede una sospensione dell'account e un recupero prima del termine.

Analogamente all'esempio precedente, la Figura 4 mostra la sequenza temporale di un abbonamento che inizia per la prima volta in un periodo di tolleranza prima di attivare la sospensione dell'account e per poi recuperarlo quando è sospeso.

Figura 4. Cronologia per un abbonamento che inizia un periodo di tolleranza, quindi inizia la sospensione dell'account e infine recupera prima che la sospensione dell'account termini.

È importante ricordare i seguenti punti:

  • Prima che un abbonamento venga sospeso, Google Play tenta altri di addebitare l'importo sul metodo di pagamento entro 48 ore. L'utente mantiene i vantaggi dell'abbonamento durante questo periodo. Una volta trascorso questo periodo, l'abbonamento verrà sospeso e l'utente non potrà più accedere ai vantaggi dell'abbonamento.
  • L'abbonamento entra in sospensione dell'account direttamente quando viene ripristinato dallo stato di pausa con una forma di pagamento non riuscita.
  • Quando un abbonamento recupera dopo la sospensione dell'account, la data di rinnovo viene reimpostata.

Scadenze

Alla scadenza di un abbonamento, l'utente non può più accedere all'abbonamento. 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 recuperare la risorsa per l'abbonamento più recente. Dopo aver confermato che subscriptionState è SUBSCRIPTION_STATE_EXPIRED, rimuovi il diritto e registra lo stato di acquisto come non valido nel tuo backend. La risorsa di abbonamento è simile all'esempio seguente:

{
  "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 o far annullare automaticamente l'abbonamento se non lo recupera una volta trascorso il periodo di 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 deve essere revocato.

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

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

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

Per gli abbonamenti a rate, viene inviata una notifica SUBSCRIPTION_CANCELLATION_SCHEDULED in seguito all'annullamento avviato dall'utente quando i pagamenti rimangono per il periodo di impegno. L'annullamento è in attesa e diventerà effettivo alla fine del periodo di impegno attuale. Quando ricevi questa notifica, il campo della risorsa di abbonamento restituita dall'API Google Play Developer è impostato su SUBSCRIPTION_STATE_ACTIVE perché l'abbonamento a rate è ancora attivo fino al termine del periodo di impegno. Tuttavia, è presente un oggetto pendingAnnullation vuoto. Viene inviata una notifica SUBSCRIPTION_CANCELED, seguita da un SUBSCRIPTION_EXPIRED al termine del periodo di impegno.

La risorsa di abbonamento per un abbonamento a rate in attesa di annullamento è simile all'esempio seguente:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

Puoi esaminare il campo canceledStateContext nella risorsa di 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 esaminare il campo userInitiatedCancellation per scoprire perché l'utente ha annullato l'abbonamento. Questo può aiutare a definire le strategie di comunicazione.

Quando un abbonamento viene annullato, ma non è ancora scaduto, viene comunque restituito da queryPurchasesAsync(). Potresti voler mostrare un messaggio nell'app per informare l'utente che il suo abbonamento è stato annullato e indicare la data di scadenza.

Revoche

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

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,
      ...
    }
  ]
}

Sottoscrizioni differite

Esistono vari motivi per cui potresti voler estendere il diritto di un utente. Ad esempio, potresti offrire agli utenti l'accesso senza costi come promozione speciale, ad esempio concedere una settimana senza costi per l'acquisto di un film o fornire l'accesso senza costi ai clienti come gesto di beneficenza. Puoi usare il metodo purchases.subscriptions.defer dell'API Play Developer per avanzare alla data di fatturazione successiva di un abbonamento con rinnovo automatico. Quando esegui questa operazione, viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_DEFERRED. Durante il periodo di differimento, l'utente viene abbonato ai tuoi contenuti con accesso completo, ma non viene addebitato alcun costo. La data di rinnovo dell'abbonamento viene aggiornata in base alla nuova data.

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

La risorsa di abbonamento per una sottoscrizione differita è 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 abiliti la funzionalità di sospensione, 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
Periodi di pausa 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
*Offerta soggetta a modifiche in qualsiasi momento.

La sospensione di un abbonamento ha effetto solo al termine dell'attuale periodo di fatturazione. Mentre l'abbonamento è in pausa, l'utente non ha accesso all'abbonamento e non paga il prezzo di rinnovo. Al termine del periodo di pausa, l'abbonamento riprende e Google tenta di rinnovarlo. Se la ripresa dell'abbonamento va a buon fine, l'abbonamento torna 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 riprende il proprio abbonamento.
Figura 6. Un utente mette in pausa il proprio abbonamento ed inserisce 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 ripristina manualmente la fatturazione, la data di fatturazione diventa quella 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 gli RTDN per sapere quando un utente sospende l'abbonamento. Queste notifiche ti consentono anche di informare gli utenti nella tua app che hanno sospeso l'abbonamento e non vi hanno accesso. Devi inoltre offrire all'utente un modo per ripristinare manualmente l'abbonamento in qualsiasi momento utilizzando un link diretto a Google Play.

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

Quando la pausa entra in vigore, 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. Puoi vedere quando è previsto il rinnovo previsto dell'abbonamento controllando l'oggetto PausedStateContext.

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

Se si è verificato un errore di pagamento durante il tentativo di ripristinare l'abbonamento dopo la pausa, viene inviato un messaggio SubscriptionNotification di tipo SUBSCRIPTION_ON_HOLD. Questa operazione va gestita come descritto nella sezione Sospensione dell'account.

Riabbonati

Per i piani base degli abbonamenti con rinnovo automatico, sul Google Play Store potrebbe essere visualizzato un pulsante Riabbonati. Questo pulsante consente agli utenti di recuperare 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 viene annullato, ma non è ancora scaduto, l'utente è ancora sottoscritto e riceve i relativi vantaggi. Se l'utente tocca Riabbonati, l'annullamento viene annullato e l'abbonamento continua a rinnovarsi. 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 tramite 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 acquisti annullati prima delle date di scadenza. Un abbonamento ripristinato continua a rinnovarsi come se non fosse stato annullato.

Se la tua app sincronizza lo stato dell'abbonamento con un backend, devi ascoltare un messaggio SubscriptionNotification di tipo SUBSCRIPTION_RESTARTED. Dopo aver ricevuto questo RTDN, la tua app può rispondere alla notifica, registrare che l'abbonamento è ora impostato per il rinnovo e interrompere la 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 viene configurato un piano base con rinnovo automatico utilizzando Google Play Console o l'API per consentire la funzionalità Riabbonati, 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. Lo stato di acquisto per questo tipo di acquisto esterno all'app non include un linkedPurchaseToken associato all'acquisto originale in questo caso, perché l'abbonamento originale è scaduto completamente. Si tratta di nuovi acquisti che il backend deve elaborare e confermare come qualsiasi altro acquisto.

Upgrade, downgrade e riabbonati

Quando un utente esegue l'upgrade, il downgrade o si registra dopo l'annullamento dalla tua 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 il vecchio acquisto da cui l'utente ha eseguito l'upgrade, il downgrade o riabbonato. Puoi utilizzare il token di acquisto in questo campo per cercare l'abbonamento precedente e identificare l'account utente esistente in modo da associare il nuovo acquisto allo stesso account.

Prima di offrire a un utente opzioni di upgrade, downgrade o riabbonamento a un utente della tua app, devi confermare l'abbonamento esistente. Eventuali modifiche al piano o riabbonati vengono bloccati se l'abbonamento esistente è ancora in attesa di accettazione.

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

{
  "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 variazione di prezzo per scoprire di più su come modificare i prezzi dell'abbonamento con rinnovo automatico e avvisare gli utenti quando opportuno.

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

Gestire la conferma da parte dell'utente di una variazione di prezzo per l'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 al momento del rinnovo del prezzo dell'abbonamento, ricevi un messaggio SubscriptionNotification di tipo SUBSCRIPTION_RENEWED. Considera questa notifica come qualsiasi altro rinnovo.

Gestire i casi in cui non viene accettato un aumento esplicito di prezzo

Se un utente non ha accettato l'aumento di prezzo attivato prima di dover rinnovare al prezzo più alto, l'iscrizione viene annullata automaticamente e riceverai un messaggio SubscriptionNotification di tipo SUBSCRIPTION_CANCELED. Gestisci questo evento come descritto in Annullamenti.

Gli utenti possono anche annullare i propri abbonamenti con un aumento tacito di prezzo seguendo lo stesso meccanismo.

Gestire il ciclo di vita per i piani prepagati

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

Data la potenziale durata dei piani prepagati brevi, è importante accettare l'acquisto il prima possibile. I piani prepagati con una durata di una settimana o superiore 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, inclusa ogni ricarica. Chiama il metodo purchases.subscriptionsv2.get per verificare lo stato dell'abbonamento del piano prepagato più recente.

Per gli acquisti di ricarica viene emesso un nuovo token di acquisto, che riceverai nel campo linkedPurchaseToken come parte 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 l'acquisto di 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 ricarica prima della fine del diritto originale, il nuovo orario viene aggiunto alla data di scadenza precedente.

Potresti voler mostrare un messaggio nell'app per informare l'utente che i suoi abbonamenti prepagati possono essere estesi con una ricarica. Per sapere quando un utente potrà effettuare una ricarica, controlla il campo allowExtendAfterTime nella risorsa dell'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.