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
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:
- Esegui una query sull'endpoint
purchases.subscriptionsv2.get
per recuperare una risorsa dell'abbonamento con lo stato più recente dell'abbonamento. - Assicurati che il valore del campo
subscriptionState
siaSUBSCRIPTION_STATE_ACTIVE
. - Verifica l'acquisto.
- 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 utilizzandosetObfuscatedAccountId
esetObfuscatedProfileId
.
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.
È 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.
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.
È 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 |
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:
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.
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.
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.