Este tópico descreve como processar eventos de ciclo de vida da assinatura, como renovações e expirações. Ele também descreve outros recursos de assinatura, como oferecer promoções e permitir que os usuários gerenciem as próprias assinaturas.
Antes de ler este tópico, leia Integrar a Biblioteca Play Faturamento ao seu aplicativo para ver instruções gerais sobre como vender e gerenciar produtos no seu app.
Se você não configurou produtos por assinatura para seu app, consulte Criar e configurar seus produtos.
Como gerenciar o ciclo de vida da assinatura
Uma assinatura pode passar por várias mudanças de estado ao longo do
ciclo de vida, e seu app precisa
responder a cada uma elas. Para verificar o estado do assinante, seu app pode fazer a consulta
usando
BillingClient.queryPurchases()
na
Biblioteca Play Faturamento ou
Purchases.subscriptions:get
na API Google Play Developer.
BillingClient.queryPurchases() |
Purchases.subscriptions:get |
|||||
Estado | Será retornada? | isAutoRenewing | Será retornada? | expiryTimeMillis | paymentState | autoRenewing |
Ativa | Sim | Verdadeiro | Sim | Futuro | 1 (pagamento recebido) | Verdadeiro |
Cancelada | Sim | Falso | Sim | Futuro | 1 (pagamento recebido) | Falso |
Em período de carência | Sim | Verdadeiro | Sim | Futuro | 0 (pagamento pendente) | Verdadeiro |
Em espera | Não | N/A | Sim | Passado | 0 (pagamento pendente) | Verdadeiro |
Pausada | Não | N/A | Sim | Passado | 1 (pagamento recebido) | Verdadeiro |
Expirada | Não | N/A | Sim | Passado | 1 (pagamento recebido) | Falso |
Se o app armazenar o estado da assinatura em um servidor de back-end seguro, ele
detectará mudanças de estado usando
notificações do desenvolvedor em tempo real
para garantir que o estado seja sincronizado. Uma
SubscriptionNotification
é enviada para eventos que afetam o estado da assinatura, como renovações e
cancelamentos. É necessário chamar a API do desenvolvedor depois de receber
notificações do desenvolvedor em tempo real para saber o status completo e atualizar seu
próprio estado de back-end. Essas notificações informam apenas que o estado da assinatura
foi modificado. Elas não fornecem informações completas sobre o status geral
da assinatura.
Seu app precisa processar as mudanças de estado descritas nas seções a seguir.
Novas inscrições
Siga nossas recomendações para
gerenciar novas compras. Quando uma
assinatura é comprada, ela é retornada por
BillingClient.queryPurchases()
,
e uma notificação SUBSCRIPTION_PURCHASED
é enviada. Ao receber essa
notificação, seu app deve consultar a API Google Play Developer para ver o
estado da assinatura
mais recente.
O recurso de assinatura é semelhante ao seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": next_renewal_date,
"autoRenewing": true,
...
"paymentState": 1 # Payment received
}
Renovações
Se uma assinatura for renovada, ela continuará sendo
retornada por
BillingClient.queryPurchases()
.
Uma notificação SUBSCRIPTION_RENEWED
também é enviada quando a assinatura é renovada.
Seu app deve garantir que o usuário ainda tenha a titularidade da assinatura e,
em seguida, atualizar o estado dela com o novo expiryTimeMillis
fornecido
no
recurso de assinatura
retornado da API Google Play Developer. O recurso de assinatura é semelhante
ao seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": updated_expiration_time,
"autoRenewing": true,
...
"paymentState": 1 # Payment received
}
Expirações
Quando uma assinatura expira, ela não é mais retornada em
BillingClient.queryPurchases()
,
e o usuário perde o acesso a ela.
Uma notificação SUBSCRIPTION_EXPIRED
também é enviada quando a assinatura
expira. Ao receber essa notificação, seu app precisa consultar a
API Google Play Developer para ver o
estado da assinatura mais recente.
O recurso de assinatura é semelhante ao seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": expiry_time_in_past,
"autoRenewing": false,
...
"paymentState": 1 # Payment received
}
Cancelamentos
Um usuário poderá cancelar uma assinatura na Play Store por vontade própria ou ter a assinatura cancelada automaticamente se não recuperá-la depois de uma suspensão de conta. Quando um usuário cancela uma assinatura, ele mantém o acesso ao conteúdo até o final do ciclo de faturamento atual. Quando o ciclo de faturamento termina, o acesso é revogado.
Quando uma assinatura é cancelada, mas ainda não expirou, ela é
retornada de
BillingClient.queryPurchases()
.
O cancelamento de uma assinatura aciona uma notificação SUBSCRIPTION_CANCELLED
.
Quando você recebe essa notificação, o
recurso de assinatura
retornado da API Google Play Developer contém autoRenewing = false
,
e o expiryTimeMillis
contém a data em que o usuário perderá o acesso
à assinatura. Se expiryTimeMillis
estiver no passado, o usuário
perderá a titularidade imediatamente. Caso contrário, o usuário reterá a titularidade
até a expiração. O recurso de assinatura é semelhante ao seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": expiry_time,
"autoRenewing": false,
...
"paymentState": 1 # Payment received
"cancelReason": integer # Reason the subscription was cancelled: user, billing issue, etc.
}
Seu app pode analisar o cancelReason
no
recurso de assinatura
retornado da API Google Play Developer para saber por que a assinatura foi
cancelada (por exemplo, se o cliente cancelou ou houve problemas de faturamento). Se a
assinatura tiver sido cancelada pelo usuário, o app poderá analisar o campo
cancelSurveyResult
para saber por que o usuário a cancelou.
Seu app pode exibir uma mensagem informando ao usuário que a assinatura foi cancelada, como "Sua assinatura expirará em tal data". O app também pode criar um link direto para a Google Play Store para permitir que os usuários restaurem a assinatura.
Se você exibir essa mensagem, também precisará oferecer aos usuários a possibilidade de dispensá-la permanentemente.
Observe também que as mensagens de cancelamento podem frustrar os usuários, sobretudo os que cancelaram uma assinatura manualmente, em vez de terem a assinatura cancelada porque o pagamento estava desatualizado. Você pode optar por não informar os usuários que cancelaram manualmente uma assinatura.
Revogações
A assinatura de um usuário pode ser revogada por vários motivos,
incluindo a revogação pelo app usando
Purchases.subscriptions:revoke
ou devido ao estorno da compra. Nessa situação, seu app deve
revogar imediatamente a titularidade do usuário. Uma assinatura revogada
não é mais retornada de
BillingClient.queryPurchases()
.
Uma notificação SUBSCRIPTION_REVOKED
também é enviada quando isso ocorre. Quando
você recebe essa notificação, o
recurso de assinatura
retornado da API Google Play Developer contém autoRenewing = false
,
e o expiryTimeMillis
contém a data em que o usuário perderá
o acesso à assinatura. O recurso de assinatura é semelhante
ao seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": expiry_time_in_past,
"autoRenewing": false,
...
"paymentState": 1 # Payment received
}
Suspensão de conta
A suspensão de conta é um estado de assinatura que começa quando a forma de pagamento de um usuário falha e qualquer período de carência associado termina sem a resolução do pagamento. Quando uma assinatura entra na suspensão de conta, você deve bloquear o acesso ao seu conteúdo ou serviço. O período de suspensão de conta dura até 30 dias.
Durante a suspensão de conta, a assinatura não é retornada por
BillingClient.queryPurchases()
.
Durante a suspensão de conta, você deve gerenciar cancelamentos, restaurações ou recompras das suas assinaturas conforme necessário.
Quando um usuário entrar na suspensão de conta, use as notificações do desenvolvedor em tempo real para informar ao usuário por que o acesso à assinatura foi suspenso. No seu app, forneça uma mensagem com instruções de como corrigir a forma de pagamento e recuperar o acesso à assinatura. Sua mensagem deve incluir um link para as configurações de assinatura do Google Play para que ele possa corrigir a forma de pagamento. Por exemplo, você pode usar uma mensagem semelhante a esta:
"There is a problem with your subscription. Click here to go to the
Google Play subscription settings to fix your payment method."
Se os usuários puderem acessar o conteúdo da assinatura fora do app, envie uma notificação push ou um e-mail a eles para informar que a assinatura não está mais ativa.
Se o cliente tiver corrigido o problema de pagamento, você poderá exibir uma mensagem no aplicativo informando aos usuários quando a assinatura foi restaurada. Por exemplo, você pode usar uma mensagem semelhante a esta:
"Your form of payment was updated, and your subscription has
been recovered."
Com as notificações do desenvolvedor em tempo real,
você recebe uma notificação SUBSCRIPTION_ON_HOLD
quando uma assinatura
entra em suspensão de conta. Chame a
API Google Play Developer
do seu servidor de back-end seguro para recuperar as novas informações
da assinatura. Durante a suspensão da conta, o expiryTimeMillis
do
recurso de assinatura
é definido como um carimbo de data/hora no passado, e paymentState
é definido como 0
:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": timestamp_in_past,
"autoRenewing": true,
...
"paymentState": 0 # Payment pending
}
Depois que o usuário corrige a forma de pagamento, a assinatura retorna a um estado ativo, e você precisa restaurar o acesso ao conteúdo assinado.
Caso seu app dependa apenas de
queryPurchases()
para determinar se um usuário tem a titularidade de uma assinatura, o app
processará automaticamente a recuperação da assinatura da suspensão de conta.
Se o app sincronizar o estado da assinatura com um back-end, ele
detectará a notificação SUBSCRIPTION_RECOVERED
quando uma assinatura for recuperada, e o usuário recuperará o
acesso. Se você consultar uma assinatura depois de receber essa
notificação, o expiryTimeMillis
estará definido como um carimbo de data/hora
no futuro, e paymentState
será 1
:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": timestamp_in_future,
"autoRenewing": true,
...
"paymentState": 1 # Payment received
}
Se o usuário não corrigir a forma de pagamento antes do término do período de suspensão
de conta, você receberá uma notificação do desenvolvedor em tempo
real: SUBSCRIPTION_CANCELLED
. Para instruções sobre o processamento de cancelamentos, consulte
Cancelar assinaturas. Quando você consulta a assinatura
cancelada dessa maneira, o expiryTimeMillis
retornado é definido como
um carimbo de data/hora no passado, e cancelReason
tem o valor de 1
:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": timestamp_in_past,
"autoRenewing": false,
...
"cancelReason": 1 # The system cancelled the subscription
}
Período de carência
Em caso de problemas com o pagamento no final de um ciclo de faturamento, as assinaturas entrarão em um período de carência se ele estiver ativado. Durante esse período, o usuário ainda terá acesso à assinatura enquanto o Google Play tenta renová-la. É possível especificar a duração de um período de carência nas configurações do produto no aplicativo no Google Play Console.
Caso seu app dependa apenas de
queryPurchases()
para verificar se um usuário tem a titularidade de uma assinatura, o app
processará automaticamente o período de carência, enquanto queryPurchases()
continua
retornando compras canceladas antes da data de validade.
Se o app sincronizar o estado da assinatura com um back-end, ele
detectará a notificação do desenvolvedor em tempo real
SUBSCRIPTION_IN_GRACE_PERIOD
quando o usuário entrar em um período de carência. Enquanto
o usuário está em um período de carência, o
recurso de assinatura
contém autoRenewing = true
e paymentState = 0
(ou seja, pendente).
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": timestamp_in_future,
"autoRenewing": true,
...
"paymentState": 0 # Payment pending
}
Quando um usuário entrar em um período de carência, exiba uma mensagem no seu app que informe como corrigir a forma de pagamento. Caso contrário, o usuário perderá o acesso à assinatura quando o período de carência terminar. Essa mensagem pode conter um link direto para a Google Play Store para ajudar o usuário a gerenciar a assinatura.
Assim que o usuário corrige a forma de pagamento, a assinatura é renovada e seu app pode processar a renovação, conforme descrito em Renovações.
Se o usuário não corrigir a forma de pagamento durante o período de carência, a assinatura ativará a suspensão de conta.
Assinaturas pausadas
Você pode evitar o desligamento voluntário de usuários permitindo que eles pausem a assinatura. Quando o recurso de pausa é ativado, os usuários podem optar por pausar a assinatura por um período entre uma semana e três meses, dependendo do período recorrente. Depois de ativada, a opção de pausa aparece na central de assinaturas e no fluxo de cancelamento. As assinaturas anuais não podem ser pausadas, e os limites de pausa de uma semana e três meses estão sujeitos a mudanças a qualquer momento.
Para permitir que os usuários pausem a assinatura, faça o seguinte:
- Faça login no Google Play Console.
- Selecione seu app e acesse Presença na loja > Produtos no aplicativo > Assinaturas.
- Abra a seção Configurações de assinatura.
- Marque Permitir pausa.
Uma pausa de assinatura entra em vigor somente após o término do período de faturamento atual. Enquanto a assinatura estiver em pausa, o usuário não terá acesso a ela. No final do período de pausa, a assinatura será retomada, e o Google tentará fazer a renovação. Se a retomada for bem-sucedida, a assinatura será reativada. Se a retomada falhar devido a um problema de pagamento, o usuário entrará no estado de suspensão da conta, conforme mostrado na Figura 1:

Um usuário também pode optar por retomar manualmente uma assinatura a qualquer momento durante o período de pausa, conforme mostrado na Figura 2. Quando um usuário retoma manualmente, a data de faturamento muda para a data de retomada manual.

Quando a assinatura de um usuário é pausada, ela não é retornada por
queryPurchases()
.
Se a assinatura for retomada, ela será retornada por
queryPurchases()
.
Se o app sincronizar o estado da assinatura com um servidor de back-end seguro, ele detectará as notificações do desenvolvedor em tempo real para manter o estado. Essas notificações também permitem que você informe seus usuários no app de que eles pausaram a assinatura e não têm acesso a ela. Você também deve fornecer uma maneira para o usuário retomar manualmente a assinatura usando um link direto para o Google Play.
Uma notificação do desenvolvedor em tempo real
SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED
é enviada quando o usuário inicia uma pausa na assinatura. Nesse momento,
o usuário mantém o acesso à assinatura, e o
recurso de assinatura
contém autoRenewing = true
, paymentState = 1
(pagamento recebido) e
valores futuros para expiryTimeMillis
e autoResumeTimeMillis
.
Uma notificação do desenvolvedor em tempo real SUBSCRIPTION_PAUSED
é enviada quando a pausa entra em vigor. Nesse momento, o usuário mantém o acesso à
assinatura, e o
recurso de assinatura
contém autoRenewing = true
e paymentState = 0
(pendente),
um valor futuro para autoResumeTimeMillis
e um valor passado para
expiryTimeMillis
.
Uma notificação do desenvolvedor em tempo real SUBSCRIPTION_RENEWED
será enviada se a
assinatura for retomada automaticamente no final do período de pausa
ou se o usuário optar por retomar a assinatura manualmente. Isso deve ser
processado conforme descrito em Renovações.
Uma notificação do desenvolvedor em tempo real SUBSCRIPTION_ON_HOLD
será enviada se
houver uma falha no pagamento ao tentar retomar a assinatura. Isso
precisa ser processado conforme descrito na seção de Suspensão de conta.
Restaurações
Uma assinatura cancelada permanecerá visível no app Play Store até a data de validade. Um usuário pode restaurar uma assinatura cancelada antes que ela expire clicando em Assinar novamente (anteriormente Restaurar) na seção Assinaturas do app Google Play Store.

Caso seu app dependa apenas de
queryPurchases()
para determinar se um usuário tem a titularidade de uma assinatura, o app
processará automaticamente o período de carência, enquanto queryPurchases()
continua
retornando compras canceladas antes da data de validade. Uma assinatura
restaurada continua sendo renovada como se não tivesse sido cancelada.
Se o app sincronizar o estado da assinatura com um back-end, ele
detectará a notificação do desenvolvedor em tempo real SUBSCRIPTION_RESTARTED
.
Depois que ela for recebida, o app poderá responder à notificação, registrar que
a assinatura está configurada para ser renovada e parar de exibir mensagens
de restauração no app. O recurso de assinatura é semelhante ao seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": expiry_time_in_future,
"autoRenewing": true,
...
"paymentState": 1 # Payment received
}
Upgrades, downgrades e novas assinaturas
Quando um usuário fizer upgrade, downgrade ou reativações de assinatura, a assinatura antiga será invalidada, e uma nova assinatura será criada com um novo token de compra.
Além disso, o
recurso de assinatura
retornado da API Google Play Developer conterá um
linkedPurchaseToken
, que indica a compra antiga a partir da qual o usuário fez
upgrade, downgrade ou a reativação da assinatura. Você pode usar o linkedPurchaseToken
para procurar a assinatura antiga e identificar a conta de usuário existente para que
seja possível associar a nova compra à mesma conta. Também recomendamos
que você use a API Google Play Developer para
confirmar a compra
e reduzir a dificuldade para o usuário. O recurso de assinatura é semelhante ao
seguinte:
{
"kind": "androidpublisher#subscriptionPurchase",
...
"expiryTimeMillis": next_renewal_date,
"autoRenewing": true,
"linkedPurchaseToken": old_purchase_token
...
"paymentState": 1 # Payment received
}
Usar links diretos para permitir que os usuários gerenciem uma assinatura
Como desenvolvedor, você precisa facilitar o gerenciamento da assinatura dos seus clientes. Seu app deve incluir um link em uma tela de configurações ou preferências que permita aos usuários gerenciar as assinaturas. Veja um exemplo desse link na Figura 4.

No gerenciador de cliques desse link, adicione uma lógica para determinar se o usuário tem
assinaturas não vencidas do seu app, em que expiryTimeMillis
esteja no
futuro ou autoRenewing
esteja definido como true
.
O SKU de cada assinatura corresponde ao ID do produto que você atribuiu a ele quando foi criado no Play Console. Para determinar programaticamente o SKU de uma assinatura existente, consulte o back-end do app e veja a lista de assinaturas associadas a um usuário específico.
Se o usuário tiver uma assinatura não vencida, direcione-o para um URL semelhante ao seguinte, substituindo "your-sub-product-id" e "your-app-package" pelo ID da assinatura e pelas informações do pacote do aplicativo:
https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
Se um usuário não tiver assinaturas não vencidas no seu app, use o seguinte URL para direcioná-lo à página que mostra todas as outras assinaturas, conforme mostrado nas figuras 5 e 6:
https://play.google.com/store/account/subscriptions


Você pode encontrar um código de exemplo para a lógica do link de assinatura no aplicativo de exemplo Classy Taxi (link em inglês).
Permitir que os usuários façam upgrade e downgrade ou modifiquem a assinatura
Você pode oferecer aos usuários diferentes níveis de assinatura, como um nível básico e um nível premium. A Figura 7 mostra uma tela que oferece dois níveis de assinatura:

É importante que os usuários possam acessar uma tela semelhante à Figura 4 para fazer upgrade ou downgrade de uma assinatura. Ao fazer upgrade ou downgrade de uma assinatura, você pode definir o modo de cálculo proporcional ou como a mudança afeta os assinantes. A tabela a seguir lista os modos de cálculo proporcional disponíveis:
Modo de cálculo proporcional | Descrição |
---|---|
IMMEDIATE_WITH_TIME_PRORATION |
A assinatura recebe upgrade ou downgrade imediatamente. Qualquer tempo restante é ajustado com base na diferença de preço e creditado à nova assinatura, adiando a próxima data de faturamento. Esse é o comportamento padrão. |
IMMEDIATE_AND_CHARGE_PRORATED_PRICE |
A assinatura recebe upgrade imediatamente, e o ciclo de faturamento permanece o mesmo. A diferença de preço referente ao período restante é cobrada do usuário. |
IMMEDIATE_WITHOUT_PRORATION |
A assinatura é recebe upgrade ou downgrade imediatamente, e o novo preço é cobrado quando a assinatura é renovada. O ciclo de faturamento permanece o mesmo. |
DEFERRED |
A assinatura só recebe upgrade ou downgrade quando ela é renovada. |
Exemplos de cálculo proporcional
Para entender como cada modo de cálculo proporcional funciona, considere o seguinte cenário:
Paulo tem uma assinatura de conteúdo on-line do app Country Gardener. Atualmente, trata-se da assinatura mensal da versão de Nível 1 do conteúdo, que tem apenas texto. Essa assinatura custa R$ 2/mês e é renovada no primeiro dia do mês.
Em 15 de abril, Paulo optou por fazer upgrade para a versão anual do Nível 2, que inclui atualizações de vídeo e custa R$ 36/ano.
Ao fazer upgrade da assinatura, o desenvolvedor seleciona um modo de cálculo proporcional. A lista a seguir descreve como cada modo de cálculo proporcional afeta a assinatura de Paulo.
IMMEDIATE_WITH_TIME_PRORATION
- A assinatura do Nível 1 de Paulo termina imediatamente. Como o pagamento vale por um mês inteiro (de 1º a 30 de abril), mas Paulo usou apenas metade desse período, metade da assinatura de um mês (R$ 1) é aplicada à nova assinatura. No entanto, como a nova assinatura custa R$ 36 por ano, o saldo de crédito de R$ 1 paga por apenas 10 dias (16 a 25 de abril). Então, no dia 26 de abril, serão cobrados R$ 36 por uma nova assinatura e outros R$ 36 em 26 de abril de cada ano seguinte.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE
- Esse modo pode ser usado porque o preço da assinatura do Nível 2 por unidade de tempo (R$ 36/ano = R$ 3/mês) é maior que o preço da assinatura do Nível 1 por unidade de tempo (R$ 2/mês). A assinatura do Nível 1 de Paulo é encerrada imediatamente. Como ele pagou por um mês inteiro, mas usou apenas metade disso, metade da assinatura de um mês (R$ 1) é aplicada à nova assinatura. No entanto, como essa nova assinatura custa R$ 36/ano, os 15 dias restantes custam R$ 1,50. Assim, ele recebe a cobrança da diferença de R$ 0,50 pela nova assinatura e, em 1º de maio, dos outros R$ 35,50. Depois disso, será cobrada uma taxa de R$ 36 por ano.
IMMEDIATE_WITHOUT_PRORATION
- A assinatura do Nível 1 de Paulo recebe imediatamente upgrade para o Nível 2, sem nenhum custo extra. Em 1º de maio, são cobrados R$ 36 pelo novo nível de assinatura, e outros R$ 36 no dia 1º de maio de cada ano.
DEFERRED
- A assinatura do Nível 1 de Paulo continua até a expiração, em 30 de abril. No dia 1º de maio, a assinatura do Nível 2 entra em vigor, e Paulo recebe uma cobrança de R$ 36 pelo novo nível de assinatura.
Ao escolher um modo de cálculo proporcional, leia nossas recomendações de cálculo proporcional.
Seu app pode oferecer um upgrade ou downgrade aos usuários usando as mesmas etapas utilizadas para iniciar um fluxo de compra. No entanto, ao fazer upgrade ou downgrade, você precisa fornecer detalhes sobre a assinatura atual, a assinatura futura (upgrade ou downgrade) e o modo de cálculo proporcional a ser usado, conforme mostrado no exemplo a seguir:
Kotlin
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync() val flowParams = BillingFlowParams.newBuilder() .setOldSku(previousSku, purchaseTokenOfOriginalSubscription) .setReplaceSkusProrationMode(desiredProrationMode) .setSkuDetails(upgradeOrDowngradeSkuDetails) .build(); val responseCode = billingClient.launchBillingFlow(activity, flowParams)
Java
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync() BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setOldSku(previousSku, purchaseTokenOfOriginalSubscription) .setReplaceSkusProrationMode(desiredProrationMode) .setSkuDetails(upgradeOrDowngradeSkuDetails) .build(); int responseCode = billingClient.launchBillingFlow(billingFlowParams);
Para os modos de cálculo proporcional de substituição imediata, o app recebe a nova
compra no
PurchasesUpdatedListener
.
A compra também está disponível em
BillingClient.queryPurchases()
.
Ao receber o token de compra, siga o mesmo
processo de verificação
usado para um novo token. Confirme essas
compras com
BillingClient.acknowledgePurchase()
da Biblioteca Play Faturamento ou
Purchases.subscriptions:acknowledge
da API Google Play Developer.
A API Google Play Developer retorna um linkedPurchaseToken
no
recurso de assinatura.
Invalide o token fornecido no linkedPurchaseToken
para
garantir que o token antigo não seja usado para acessar seus serviços. Consulte
Upgrades, downgrades e novas assinaturas
para ver informações sobre como processar compras de upgrade e downgrade.
No modo de substituição adiada, seu app recebe uma chamada para o
PurchasesUpdatedListener
com uma lista vazia de compras e um status do sucesso do upgrade ou
downgrade. Até que a substituição entre em vigor,
BillingClient.queryPurchases()
continua retornando a compra do plano de assinatura original. Quando o novo
plano entra em vigor, queryPurchases()
retorna os dados de compra
da nova assinatura, e uma notificação SUBSCRIPTION_RENEWED
é enviada ao
servidor de back-end seguro. Para substituições adiadas, é
altamente recomendável detectar essa notificação e confirmar
a compra usando
Purchases.subscriptions:acknowledge
.
O linkedPurchaseToken
no recurso de assinatura pode ser usado para
determinar qual usuário no back-end da assinatura, se aplicável, será
atualizado com a nova titularidade. Seu app não deve depender de que o usuário
abra o app e confirme via
BillingClient.acknowledgePurchase()
,
já que o usuário pode não abrir o app em até três dias após a mudança do plano
entrar em vigor.
Como fazer upgrade com ofertas de teste gratuito ou preço inicial
As configurações de qualificação para teste gratuito se aplicam quando um usuário faz upgrade ou downgrade. É possível ajustar as configurações de qualificação para teste gratuito no Google Play Console.
Observe o seguinte:
- Se os usuários puderem receber apenas um teste gratuito em todas as assinaturas disponíveis no seu app, o novo plano que o usuário está adotando não terá teste gratuito nem preço inicial.
- Se você oferecer um teste gratuito para cada produto por assinatura, o novo plano que o usuário está adotando poderá ter um teste gratuito ou preço inicial.
A tabela a seguir descreve o comportamento de cada modo de cálculo proporcional se os planos novos e antigos tiverem um teste gratuito e o usuário estiver fazendo upgrade durante esse teste:
Um teste gratuito por app | Um teste gratuito para cada produto por assinatura | |
IMMEDIATE_WITH_TIME_PRORATION | O usuário perde o teste gratuito imediatamente. O período de teste gratuito restante é convertido em um período gratuito equivalente do novo nível com base na diferença de preço. | O usuário perde o teste gratuito anterior, mas inicia imediatamente um novo teste. Além disso, o período de teste gratuito restante do nível antigo é convertido em um período gratuito equivalente do novo nível e adicionado ao novo teste gratuito. |
IMMEDIATE_AND_CHARGE_PRORATED_PRICE |
O usuário perde o teste gratuito imediatamente. A diferença de preço referente ao período restante é cobrada do usuário. A próxima data de faturamento permanece inalterada. Observação: essa opção está disponível apenas para um upgrade de assinatura, em que o preço por unidade de tempo aumenta. |
|
IMMEDIATE_WITHOUT_PRORATION | O usuário recebe um upgrade imediato para o novo nível. O usuário mantém o acesso ao teste gratuito para o novo nível até o final do período de faturamento anterior. | |
DEFERRED | O usuário mantém o acesso ao teste gratuito da assinatura antiga até a próxima data de faturamento. |
Para entender como as transições de teste gratuito funcionam no caso padrão de um teste gratuito por app, considere o seguinte cenário:
Maria tem uma assinatura de conteúdo on-line do app Country Gardener. Atualmente, trata-se da assinatura mensal da versão de Nível 1 do conteúdo, que tem apenas texto. Essa assinatura custa R$ 10/mês, e ela assinou no dia 1º de abril. Ela está aproveitando um teste gratuito de 30 dias como assinante pela primeira vez, o que significa que o primeiro pagamento vencerá em 1º de maio.
Em 15 de abril, Maria decide fazer upgrade para a assinatura de Nível 2, que inclui atualizações de vídeo e custa R$ 20/mês. Essa segunda assinatura também tem um teste de 30 dias.
A lista a seguir descreve a transição do teste gratuito para cada modo de cálculo proporcional:
IMMEDIATE_WITH_TIME_PRORATION
: Maria recebe um upgrade imediato para o Nível 2. Como Maria fez upgrade na metade do período de assinatura, metade da assinatura mensal (15 dias, no valor de R$10/mês) é aplicada à nova assinatura. No entanto, como essa nova assinatura custa R$ 20/mês, o saldo de 15 dias paga apenas por 7,5 dias. Maria não está qualificada para outro teste gratuito do Nível 2. Portanto, a partir de 22 de abril, ela receberá uma cobrança mensal de R$ 20.IMMEDIATE_AND_CHARGE_PRORATED_PRICE
: este modo pode ser usado porque o preço da assinatura de Nível 2 por unidade de tempo (R$ 20/mês) é maior que o preço da assinatura de Nível 1 por unidade de tempo (R$ 10/mês). A assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2, e ela perde o teste gratuito. Como a próxima data de faturamento de Maria era 1º de maio, ela recebeu uma cobrança de R$ 10 para cobrir a segunda metade de abril. A partir de 1º de maio, ela receberá uma cobrança de R$ 20 todo mês.IMMEDIATE_WITHOUT_PRORATION
: a assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2. Maria continua com o teste gratuito até 30 de abril e agora tem acesso ao conteúdo do Nível 2. A partir de 1º de maio, ela recebe uma cobrança de R$ 20 ao mês.DEFERRED
: a assinatura do Nível 1 de Maria continua até o próximo pagamento, em 1º de maio. Em 1º de maio, a assinatura do Nível 2 entra em vigor, e a cobrança de R$ 20 é feita no primeiro dia de cada mês.
A lista a seguir descreve o comportamento de transição se o desenvolvedor permitir um teste gratuito por assinatura:
IMMEDIATE_WITH_TIME_PRORATION
: Maria recebe um upgrade imediato para o Nível 2. Como Maria fez upgrade na metade do período de assinatura, metade da assinatura mensal (15 dias, no valor de R$ 10/mês) é aplicada à nova assinatura. No entanto, como essa nova assinatura custa R$ 20/mês, o saldo de 15 dias paga apenas por 7,5 dias. Maria está qualificada para outro teste gratuito do Nível 2. Portanto, ela não é cobrada por mais 37,5 dias. A partir de 22 de maio, ela recebe uma cobrança de R$ 20 ao mês.IMMEDIATE_AND_CHARGE_PRORATED_PRICE
: este modo pode ser usado porque o preço da assinatura de Nível 2 por unidade de tempo (R$ 20/mês) é maior que o preço da assinatura de Nível 1 por unidade de tempo (R$ 10/mês). A assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2, e ela perde o teste gratuito. Como a próxima data de faturamento de Maria era 1º de maio, ela recebeu uma cobrança de R$ 10 para cobrir a segunda metade de abril. A partir de 1º de maio, ela receberá uma cobrança de R$ 20 todo mês.IMMEDIATE_WITHOUT_PRORATION
: a assinatura do Nível 1 de Maria recebe um upgrade imediato para o Nível 2. Maria mantém o teste gratuito até 30 de abril e agora tem acesso a *DEFERRED
: a assinatura do Nível 1 de Maria continua até o próximo pagamento, em 1º de maio. Em 1º de maio, a assinatura do Nível 2 entra em vigor, e a cobrança de R$ 20 é feita no primeiro dia de cada mês.
Recomendações de cálculo proporcional
A tabela a seguir mostra diferentes cenários de cálculo proporcional e o que recomendamos para cada um deles:
Cenário | Modo de cálculo proporcional recomendado | Resultado |
---|---|---|
Upgrade para um nível mais caro | IMMEDIATE_AND_CHARGE_PRORATED_PRICE |
O usuário recebe acesso imediatamente, mantendo o mesmo período de faturamento. |
Downgrade para um nível mais barato | DEFERRED |
O usuário já pagou pelo nível mais caro, então manterá o acesso até a próxima data de faturamento. |
Mudança de período recorrente no mesmo nível (por exemplo, mensal para anual) | DEFERRED |
O usuário pagará o novo preço recorrente na próxima data de faturamento. |
Upgrade durante o teste gratuito, mantendo o teste | IMMEDIATE_WITHOUT_PRORATION |
O usuário mantém o acesso ao teste gratuito, mas faz upgrade para um nível superior pelo restante do teste. |
Upgrade durante o teste gratuito, encerrando o acesso a ele | IMMEDIATE_AND_CHARGE_PRORATED_PRICE |
O usuário recebe acesso ao novo nível imediatamente, mas não tem mais o teste gratuito. |
Recuperação após o desligamento de usuários
Depois que um usuário cancelar a assinatura, você poderá tentar recuperá-lo no seu app ou na Play Store. A tabela a seguir descreve vários cenários de assinatura, com ações associadas de recuperação e requisitos de app.
Antes da expiração da assinatura | Após a expiração da assinatura | |||
No app | Na Play Store | No app | Na Play Store | |
Recurso de recuperação | Assinatura no app | Restauração | Assinatura no app | Nova assinatura |
O usuário percorre o fluxo de finalização da compra | Sim | Não | Sim | Sim |
A assinatura do usuário permanece associada ao mesmo SKU | O usuário pode se inscrever para um SKU igual ou diferente | Sim | O usuário pode se inscrever para um SKU igual ou diferente | Sim |
Cria um novo token de compra | Sim | Não | Sim | Sim |
Ativado por padrão | Não | Sim, a compatibilidade é necessária para todos os desenvolvedores | Não |
Aplicativos sem a Biblioteca Play Faturamento versão 2.0 ou mais recente: não Aplicativos com a Biblioteca Play Faturamento versão 2.0 ou mais recente: sim. Os desenvolvedores podem desativar no console. |
Quando o usuário é cobrado |
Se usar o mesmo SKU: no fim do período de faturamento atual. Se usar um SKU diferente: depende do modo de cálculo proporcional. |
Fim do período de faturamento atual | Imediatamente | Imediatamente |
Implementação necessária | Fornecer uma IU de nova assinatura no seu app |
Detectar mudanças no estado da assinatura Link direto para a Play Store |
Fornecer uma IU de nova assinatura no seu app | Processar compras fora do aplicativo |
Antes da expiração da assinatura: no app
Para assinaturas que foram canceladas, mas ainda não expiraram, é possível permitir que os assinantes restaurem as assinaturas no seu app aplicando o mesmo fluxo de compra de produto no aplicativo usado para novos assinantes. Verifique se a IU reflete que o usuário tem uma assinatura existente. Por exemplo, é possível exibir a data de validade atual do usuário e o preço recorrente com um botão Reativar.
Na maioria das vezes, convém oferecer ao usuário o mesmo preço e o mesmo SKU que ele já assinava, conforme mostrado a seguir:
- Inicie uma nova compra de assinatura com o mesmo SKU.
- A nova assinatura substitui a antiga e será renovada na mesma data de validade. A assinatura antiga será marcada imediatamente como expirada.
- Por exemplo, Ana tem uma assinatura do app Example Music, e a assinatura expira no dia 1º de agosto. Em 10 de julho, ela refaz a assinatura de um mês pelo mesmo preço mensal. A nova assinatura é proporcional ao crédito restante, fica ativa imediatamente e ainda é renovada em 1º de agosto.
Se quiser oferecer um preço diferente (por exemplo, um novo teste gratuito ou um desconto de recuperação), forneça um SKU diferente ao usuário:
- Inicie um upgrade ou downgrade com um SKU diferente usando
o modo de cálculo proporcional
IMMEDIATE_WITHOUT_PRORATION
. - A nova assinatura substitui a antiga e será renovada na mesma data de validade. O preço do novo SKU é cobrado do usuário, incluindo preços iniciais, na data de validade original.
- Por exemplo, Ana tem uma assinatura do app Example Music, e a assinatura expira no dia 1º de agosto. Em 10 de julho, ela refaz a assinatura anual com um preço inicial. A nova assinatura será ativada imediatamente, e o preço inicial do usuário será cobrado em 1º de agosto.
- Se você decidir incluir um teste gratuito ou preço inicial no SKU de recuperação, torne o usuário qualificado para isso desmarcando a caixa Permitir um teste gratuito por app no Google Play Console, que restringe o usuário a um teste gratuito por app.
Quando você receber o token,
processe a compra como faria
com uma nova assinatura. Além disso, a API Google Play Developer
retorna um linkedPurchaseToken
no recurso de assinatura. Invalide o token fornecido no linkedPurchaseToken
para
garantir que o token antigo não seja usado para acessar seus serviços.
Antes da expiração da assinatura na Play Store
Enquanto a assinatura estiver cancelada, mas ainda estiver ativa, os usuários poderão restaurá-la na central de assinaturas do Google Play clicando em Assinar de novo (anteriormente Restaurar). Isso mantém o mesmo token de compra e assinatura.

Para mais informações sobre como restaurar assinaturas, consulte Restaurações.
Após a expiração da assinatura: no app
É possível permitir que usuários com assinaturas expiradas refaçam a assinatura no app aplicando o mesmo fluxo de compra de produto no aplicativo usado para novos assinantes. Observe o seguinte:
- Para dar um desconto aos usuários, ofereça um ID do produto com preços especiais para sua assinatura, também chamado de SKU de recuperação. Você pode disponibilizar a oferta no seu app ou notificar o usuário sobre a oferta fora do app, como por e-mail.
- Para iniciar uma assinatura de recuperação, abra o fluxo de compra no seu app Android usando a Biblioteca Play Faturamento. Esse processo é igual ao de uma nova assinatura, mas você pode determinar o SKU disponível para o usuário.
- Se você decidir incluir um teste gratuito ou preço inicial no SKU de recuperação, torne o usuário qualificado para isso desmarcando a caixa Permitir um teste gratuito por app no Google Play Console, que restringe o usuário a um teste gratuito por app.
- Se o usuário fizer uma nova assinatura do mesmo SKU, ele não estará mais qualificado para testes gratuitos nem preço inicial. Garanta que a IU reflita isso.
Quando você receber o token,
processe a compra como faria
com uma nova assinatura. Você não receberá um linkedPurchaseToken
no recurso de assinatura.
Após a expiração da assinatura: na Play Store
Se ativado, os usuários poderão assinar novamente o mesmo SKU por até um ano após a validade. Basta clicar em Assinar de novo na central de assinaturas do Google Play. Isso gera um novo token de compra e assinatura.

A nova assinatura é considerada uma compra fora do app. Por isso, siga as práticas recomendadas para processar compras feitas fora do app.
Gestão de clientes
Com as notificações do desenvolvedor em tempo real, é possível detectar imediatamente quando um usuário decide cancelar. Quando um usuário faz um cancelamento antes da expiração da assinatura, você pode enviar notificações push ou mensagens no aplicativo para pedir que ele assine novamente. Para ver mais informações, consulte Recuperação após o desligamento de usuários.
Testes gratuitos e preços iniciais
Seu app pode oferecer testes gratuitos e preços iniciais para incentivar os clientes a testá-lo.
Teste gratuito
Você pode permitir que os usuários testem uma assinatura antes que façam um pagamento. Os testes gratuitos têm um período especificado e são convertidos em assinaturas completas automaticamente quando esse período termina. Essas assinaturas convertidas usam o mesmo período e preço que as assinaturas comuns. Você pode configurar um teste gratuito para qualquer tipo de assinatura.
Para iniciar um teste gratuito, os usuários precisam concluir o processo padrão de compra de assinaturas no Google Play. Se um usuário estiver qualificado para um teste gratuito, ele não será cobrado durante o teste e será notificado por e-mail de que a assinatura inclui um período de teste gratuito. O Google Play registrará uma transação de R$ 0,00, e a assinatura ficará marcada como comprada durante o período de teste ou até o cancelamento.
O Google Play verifica se o usuário tem uma forma de pagamento válida antes de iniciar o teste gratuito. Alguns usuários podem ver essa verificação como uma retenção ou cobrança na forma de pagamento deles. A retenção ou cobrança é temporária e será revertida ou reembolsada posteriormente.
Após o término do período de teste, a forma de pagamento do usuário recebe uma cobrança referente ao valor total da assinatura.
Se um usuário cancelar uma assinatura a qualquer momento durante o período de teste gratuito, ela permanecerá ativa até o final desse período e não será cobrada quando ele terminar.
Por padrão, os usuários podem receber apenas um teste gratuito em todas as assinaturas disponíveis no seu app. Se você quiser oferecer um teste gratuito para cada produto por assinatura, modifique a configuração correspondente no Google Play Console.
Para adicionar um teste gratuito a uma assinatura, consulte as instruções de teste gratuito na Central de Ajuda do Google Play.
Eventos do ciclo de vida de uma assinatura com teste gratuito funcionam da mesma maneira que em uma assinatura sem o teste. A única diferença é que o período de renovação pode ser diferente do intervalo de renovação regular da assinatura.
Ao mostrar aos usuários produtos disponíveis para venda,
você pode usar o método
SkuDetails.getFreeTrialPeriod()
para indicar que um teste gratuito está disponível para um produto.
Se uma assinatura tiver sido comprada com um teste gratuito, a
assinatura
retornada da API Google Play Developer terá paymentState = 2
(teste gratuito). Se
a assinatura for renovada, o paymentState
mudará para 1
(pagamento recebido).
Preço inicial
Assim como com os testes gratuitos, seu app pode oferecer preços iniciais para incentivar os usuários a testá-lo. Para saber mais sobre os preços iniciais e como ativá-los, consulte Criar uma assinatura.
Eventos do ciclo de vida de uma assinatura que tenha preços iniciais funcionam da mesma maneira que em uma assinatura sem preços iniciais. A única diferença é que o período de renovação pode ser diferente do intervalo de renovação regular da assinatura.
Ao mostrar aos usuários produtos disponíveis para venda,
você pode usar
SkuDetails.getIntroductoryPrice()
e métodos relacionados para indicar ao usuário que o preço inicial
está disponível para a assinatura.
Promover sua assinatura
É possível criar códigos promocionais para dar a usuários selecionados um teste gratuito estendido de um SKU de assinatura existente. Para saber mais, consulte Códigos promocionais.
Cancelar, reembolsar ou revogar
Você pode usar a API Google Play Developer para cancelar, reembolsar ou revogar uma assinatura. Essa funcionalidade também está disponível no Google Play Console.
- Cancelar: os usuários podem cancelar uma assinatura no Google Play. Você também pode fornecer uma opção para os usuários cancelarem no seu app ou site. Seu app deve processar esses cancelamentos conforme descrito em Revogações.
- Reembolsar: quando você faz um reembolso, o usuário pode continuar usando a assinatura. Os reembolsos poderão ser usados se, por exemplo, tiver ocorrido um erro técnico que impediu o usuário de acessar seu produto, mas o erro tiver sido resolvido. Para reembolsar mais do que o pagamento mais recente ou emitir um reembolso parcial, use o Google Play Console.
- Revogar: quando você revoga a assinatura, o usuário perde imediatamente o acesso a ela. Isso poderá ser usado se, por exemplo, tiver ocorrido um erro técnico que impediu o usuário de acessar seu produto e ele não quiser continuar a usá-lo. Seu app deve processar esses cancelamentos conforme descrito em Revogações.
A tabela a seguir ilustra as diferenças entre cancelamento, reembolso e revogação.
Interrompe a renovação | Reembolsa dinheiro | Revoga o acesso | |
Cancelar | Sim | Não | Não |
Reembolsar | Não | Sim | Não |
Revogar | Sim | Sim | Sim |
Adiar o faturamento de um assinante
É possível adiar a próxima data de faturamento de um assinante usando Purchases.subscriptions:defer da API Google Play Developer. Durante o período de adiamento, o usuário será assinante do conteúdo com acesso total, mas não será cobrado. A data de renovação da assinatura é atualizada para a nova data.
O faturamento adiado permite o seguinte:
- Dar aos usuários acesso gratuito como oferta especial, por exemplo, oferecer uma semana gratuita para a compra de um filme.
- Dar acesso gratuito aos clientes para desenvolver um bom relacionamento.
O faturamento pode ser adiado de um dia a um ano por chamada de API. Para adiar ainda mais o faturamento, chame a API novamente antes da nova data de faturamento.
Por exemplo, Daniela tem uma assinatura mensal de conteúdo on-line do aplicativo Fishing Quarterly. Normalmente, ela recebe uma cobrança de R$ 1,25 no primeiro dia de cada mês. Em março, ela participou de uma pesquisa on-line para o editor do app. O editor a recompensou com seis semanas gratuitas, adiando o próximo pagamento até 15 de maio, o que corresponde a seis semanas após a data de faturamento anteriormente agendada para 1º de abril. Daniela não é cobrada em abril nem no início de maio e ainda tem acesso ao conteúdo. Em 15 de maio, ela é cobrada pela taxa de assinatura normal de R$ 1,25 para o mês. Agora, a próxima data de renovação é 15 de junho.
Ao adiar, você pode notificar o usuário por e-mail ou no aplicativo para informá-lo de que a data de faturamento foi modificada.
Mudar preços da assinatura
Aviso: não mude o preço de uma assinatura do tipo Assine com o Google.
O Google Play permite que você venda seus produtos digitais em todo o mundo para vários usuários em diferentes localidades, com diferentes moedas e considerações de preços. Às vezes, devido a custos regionais ou variações cambiais, você pode decidir que precisa mudar o preço da sua assinatura. Caso queira manter o preço atual para os assinantes existentes, crie um novo SKU com o preço atualizado e ofereça-o aos novos assinantes.
Se você não puder continuar oferecendo aos assinantes o preço oferecido quando eles fizeram a assinatura e estiver disposto a cancelar todas as assinaturas dos usuários que decidirem não aceitar o novo preço, você poderá aplicar uma mudança obrigatória de preço. Se o usuário não concordar com o novo preço, a assinatura dele será cancelada. Para maximizar as taxas de aceitação e incentivar os usuários a fazer algo, o app deve exibir mensagens para eles sobre a futura mudança de preço. Para mais informações sobre o assunto, consulte Comunicar a mudança de preço ao usuário.
Para mudar o preço de uma assinatura, faça o seguinte:
- Faça login no Google Play Console.
- Encontre o app com a assinatura cujo preço você quer mudar.
- Selecione Presença na loja > Produtos no aplicativo e abra a guia Assinaturas.
Selecione o link Editar ao lado do preço que você quer mudar, conforme mostrado na Figura 10:
Figura 10. Como editar o campo de preço da assinatura. Digite o novo preço da assinatura.
Quando você mudar o preço, uma caixa de diálogo de confirmação será exibida, conforme mostrado na Figura 11.
Figura 11. Um aviso é exibido quando você edita o preço da assinatura. Essa caixa de diálogo explica como a mudança de preço afeta os assinantes novos e existentes. Observe o seguinte:
- Não é possível reverter a mudança de preço depois de confirmá-la.
- O Google Play começa a notificar seus usuários sobre o novo preço sete dias após a confirmação.
- Após o aumento do preço da assinatura, os usuários precisam aprovar essa mudança em até 30 dias. Caso contrário, a assinatura será cancelada automaticamente.
- As reduções do preço da assinatura são aplicadas automaticamente aos assinantes atuais na próxima data de renovação. Qualquer pessoa que fizer a assinatura depois de uma redução de preço receberá o preço reduzido automaticamente.
Clique em Aplicar para avançar.
Será exibida uma caixa de diálogo de confirmação que descreve novamente quando os novos preços de assinatura entrarão em vigor.
Figura 12. Caixa de diálogo de confirmação que mostra quando a mudança do preço da assinatura entrará em vigor.
Comunicar a mudança de preço ao usuário
Notifique seus assinantes atuais sempre que fizer uma mudança de preço, especialmente se for um aumento.
Ao aumentar o preço de uma assinatura, você tem pelo menos sete dias para notificar os assinantes sobre isso antes que o Google Play comece a avisá-los. Para notificar os usuários, o Google Play exibe uma caixa de diálogo semelhante à mostrada na Figura 13. Essa caixa de diálogo mostra o preço antigo, o novo preço e a data em que o novo preço entra em vigor.

No seu app, é possível exibir essa caixa de diálogo das seguintes maneiras:
- Iniciar um fluxo de confirmação de mudança de preço quando os usuários abrirem seu app.
- Encaminhar os usuários à central de assinaturas para avaliar a mudança de preço usando um link direto.
Seu app pode determinar se o usuário tem uma mudança de preço pendente observando
o campo priceChange
no
recurso de assinatura.
Quando presente, esse campo indica que a assinatura tem uma mudança de preço, e
o campo priceChange.state
indica se a mudança de preço foi
aceita ou ainda está pendente.
Iniciar um fluxo de confirmação de mudança de preço
Para exibir a caixa de diálogo de mudança de preço do Google Play quando o app for iniciado, use
BillingClient.launchPriceChangeConfirmationFlow()
.
Antes de exibir essa caixa, você também pode apresentar sua própria mensagem ou caixa de diálogo que explique o motivo da mudança. Se você criar e mostrar esse tipo de mensagem personalizada, será mais provável que seus usuários renovem a assinatura com o novo preço.
Veja um exemplo de como iniciar o fluxo de confirmação de mudança de preço:
Kotlin
val priceChangeFlowParams = PriceChangeFlowParams.newBuilder() .setSkuDetails(changedPriceSubscriptionSkuDetails) .build() billingClient.launchPriceChangeConfirmationFlow(activity, priceChangeFlowParams, object : PriceChangeConfirmationListener() { override fun onPriceChangeConfirmationResult(responseCode: Int) { if (responseCode == BillingResponseCode.OK) { // User has confirmed the price change. } else if (responseCode == BillingResponseCode.USER_CANCELED) { // User hasn't confirmed the price change and should retain // access until the end of the current billing cycle. } } })
Java
PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder() .setSkuDetails(changedPriceSubscriptionSkuDetails) .build(); billingClient.launchPriceChangeConfirmationFlow(activity, priceChangeFlowParams, new PriceChangeConfirmationListener() { @Override public void onPriceChangeConfirmationResult(int responseCode) { if (responseCode == BillingResponseCode.OK) { // User has confirmed the price change. } else if (responseCode == BillingResponseCode.USER_CANCELED) { // User hasn't confirmed the price change and should retain // access until the end of the current billing cycle. } } });
Processar a confirmação do usuário sobre a mudança de preço
Se o usuário aceitar o novo preço da assinatura, ela será renovada
e poderá ser processada como qualquer outra renovação. Além disso,
você receberá uma notificação do desenvolvedor em tempo real
SUBSCRIPTION_PRICE_CHANGE_CONFIRMED
.
Processar uma recusa da mudança de preço
Se um usuário não tiver aceitado a mudança de preço até o momento em que a assinatura
antiga expirar, a assinatura será cancelada, e você receberá uma
notificação SUBSCRIPTION_CANCELED
. Esse evento pode ser processado conforme
descrito em Cancelamentos.
Mudança acidental de preço
Se você mudou acidentalmente o preço de uma assinatura, reverta a mudança imediatamente. Desde que o preço seja revertido em até sete dias, os assinantes atuais não serão notificados sobre a mudança acidental de preço. Os novos assinantes poderão receber o preço acidental durante o período entre a primeira mudança de preço e a reversão.
Como fazer duas mudanças de preço seguidas
Faça apenas uma mudança de preço por vez. Não recomendamos mudanças para fins de teste.
Se você mudar o preço de uma assinatura duas vezes em um período de sete dias, o usuário só precisará concordar com a mudança mais recente.
Se houver mais de sete dias entre as mudanças de preço, elas não se anularão. Em vez disso, o usuário precisará concordar com a primeira mudança e ter um ciclo de renovação pelo primeiro preço. Depois que o ciclo de renovação terminar, você poderá começar a cobrar o segundo preço. Depois disso, as renovações serão cobradas mensalmente com o segundo preço.