Adicionar recursos específicos de assinatura

As assinaturas são configuradas usando o Play Console do Android. Depois de configurar uma assinatura, é possível adicionar o Google Play Faturamento ao seu app para ativar um fluxo de compra. As assinaturas têm muitas características mencionadas na Visão geral do Google Play Faturamento, como período de faturamento e de carência, avaliação gratuita e assim por diante. Familiarize-se com esses conceitos antes de ler esta seção.

Veja os vídeos sobre assinaturas (em inglês) mais recentes para ter mais informações.

Além disso, antes de ler o restante desta página, ative as notificações do desenvolvedor em tempo real, que permitem reagir de maneira proativa às mudanças de estado, aumentar seu envolvimento e reduzir a rotatividade de usuários. Para ativar essas notificações, consulte Notificações do desenvolvedor em tempo real.

Existem vários casos de uso de assinaturas para você tentar acomodar na sua solução geral do Google Play Faturamento.

Use combinações da biblioteca do Google Play Faturamento, da API Google Play Developer e das Notificações do desenvolvedor em tempo real para lidar com esses casos de uso.

Processar estados relacionados à assinatura com notificações do desenvolvedor em tempo real

As notificações do desenvolvedor em tempo real são notificações push do servidor que permitem monitorar alterações de estado, como SUBSCRIPTION_PURCHASED ou SUBSCRIPTION_RECOVERED, para assinaturas. Elas permitem reagir de maneira proativa às mudanças de estado, aumentar seu envolvimento e reduzir a rotatividade de usuários. Para ativar essas notificações, consulte Notificações do desenvolvedor em tempo real.

Se você ativar as notificações do desenvolvedor em tempo real, seu servidor de back-end seguro receberá notificações alertando apenas sobre alterações de estado de assinatura. É necessário chamar a API do desenvolvedor depois de receber as 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 mudou. Elas não fornecem informações completas sobre o status da assinatura.

Ao verificar a API do desenvolvedor, faça sempre o seguinte:

  • Se expiryTimeMillis estiver no futuro, conceda sempre a titularidade.
  • Se autoRenewing = false, tente fazer com que o usuário renove a assinatura, porque ela terminará na data de vencimento.
  • Se paymentState = 0, use um link direto para enviar o usuário à central de assinaturas para corrigir o problema de pagamento.

No futuro, podemos adicionar outras alterações de estado que afetem a titularidade de um usuário, como a reativação de uma assinatura após o vencimento. Para garantir que sua integração esteja pronta para esses recursos, lembre-se de processar todas as notificações indefinidas chamando a API do desenvolvedor e agindo conforme descrito acima.

O usuário está em um período de carência: SUBSCRIPTION_IN_GRACE_PERIOD

A carência dura por determinado período com base na configuração do produto no aplicativo no Google Play Console. O Google Play tenta renovar a assinatura durante o período de carência. Para alertar o usuário sobre o problema de pagamento, mostre uma mensagem no seu app dizendo aos usuários como corrigir a forma de pagamento. Caso contrário, o usuário perderá o acesso à assinatura. Por exemplo, "Para evitar interrupções na sua conta, acesse as configurações de assinatura do Google Play e corrija seu pagamento". Essa mensagem cria um link para as definições de assinatura do Google Play, permitindo que o usuário corrija a forma de pagamento.

Para determinar quanto tempo o usuário tem no período de carência, chame a API Google Play Developer. O Google Play estende dinamicamente o valor expiryTimeMillis até o período de carência terminar. Durante esse período, verifique se a assinatura do usuário foi cancelada, renovada ou colocada em suspensão. É necessário verificar o status atual da assinatura do usuário após expiryTimeMillis ter sido transmitido para retornar o status mais recente da assinatura.

O conteúdo da resposta JSON varia de acordo com o estado da assinatura, como mostrado nos snippets a seguir. Por exemplo, se você consultar uma assinatura durante o período de carência (a forma de pagamento está errada), o expiryTimeMillis será atualizado dinamicamente para um carimbo de data/hora futuras, e paymentState será definido como 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

Se você consultar uma assinatura depois que ela tiver sido renovada (a forma de pagamento foi atualizada), o expiryTimeMillis será definido como um carimbo de data/hora futuras, e paymentState será 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

Se você consultar a assinatura após o término do período de carência, ela estará suspensa (caso você ative a Suspensão de conta no Google Play Console) ou cancelada (caso você não ative a Suspensão de conta no Google Play Console). Para ver exemplos de respostas JSON para SUBSCRIPTION_ON_HOLD e SUBSCRIPTION_CANCELLED, consulte a seção Suspensão de conta: SUBSCRIPTION_ON_HOLD.

Suspensão de conta: SUBSCRIPTION_ON_HOLD

O período de suspensão da conta dura 30 dias. Durante esse tempo, é preciso verificar se a assinatura do usuário foi cancelada, restaurada ou recomprada. Depois, informe ao usuário por que o acesso à assinatura foi suspenso. Para fazer isso, envie uma mensagem no seu app com instruções sobre como corrigir a forma de pagamento e recuperar o acesso à assinatura. Por exemplo: "Há um problema com sua assinatura. Acesse as configurações de assinatura do Google Play para resolver." Essa mensagem cria um link para as configurações do Google Play para que a forma de pagamento possa ser corrigida. Também é necessário realizar algumas outras ações, como estas:

  • Se o usuário atualizar a forma de pagamento e a assinatura for recuperada, seu app precisará restaurar o acesso ao conteúdo assinado. Para mais informações, consulte Assinatura recuperada: SUBSCRIPTION_RECOVERED. No entanto, se a assinatura não for recuperada durante esse período de suspensão, ela será cancelada e o usuário precisará adquirir uma nova assinatura.
  • Se os usuários esperam que seu app acesse a assinatura fora dele, envie uma notificação push ou um e-mail aos usuários para informar que a assinatura não está mais ativa. Se a assinatura só puder ser acessada quando o usuário abrir o app, informe-o sobre a interrupção da assinatura na próxima vez que o app for aberto.

Para confirmar se uma conta ainda está suspensa, verifique o status atual da assinatura do usuário sempre que ele tentar acessar o conteúdo assinado no seu app.

O conteúdo da resposta JSON varia de acordo com o estado da assinatura, como é mostrado nos snippets a seguir. Por exemplo, se você consultar uma assinatura durante o período de suspensão da conta (a forma de pagamento está errada), o expiryTimeMillis será definido como um carimbo de data/hora passado, e paymentState será definido como 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

Se você consultar uma assinatura depois que ela tiver sido recuperada (a forma de pagamento foi atualizada), o expiryTimeMillis será definido como um carimbo de data/hora futuras, e o paymentState será 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

Se você consultar a assinatura depois que ela tiver sido suspensa por 30 dias e cancelada, o expiryTimeMillis será definido como um carimbo de data/hora passado, e o cancelReason será 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": false,
  ...
  "cancelReason": 1  # The system canceled the subscription
}

Assinatura recuperada: SUBSCRIPTION_RECOVERED

Após a recuperação de uma assinatura, geralmente o token de compra será idêntico ao que era antes da suspensão da conta do usuário. É possível, no entanto, que o usuário recupere o acesso ao conteúdo assinado recomprando a assinatura durante o período de suspensão. Nesse caso, um novo valor de token de compra é enviado para representar a nova instância da assinatura.

Depois de registrar os novos dados de assinatura no servidor, é possível exibir uma mensagem no seu app informando aos usuários que a assinatura foi restaurada. Por exemplo, "A forma de pagamento atualizada foi registrada, e sua assinatura foi restaurada".

Cancelamento de assinatura: SUBSCRIPTION_CANCELLED

Um usuário poderá cancelar uma assinatura da Play Store por vontade própria ou ter a assinatura cancelada automaticamente se não a recuperar depois que ela tiver sido suspensa. Quando o servidor de back-end seguro receber uma notificação do desenvolvedor em tempo real SUBSCRIPTION_CANCELLED:

  • exiba uma mensagem no app informando ao usuário que a assinatura foi cancelada, por exemplo, "Sua assinatura expirará em **alguma_data". Acesse as configurações de assinatura do Google Play para restaurá-la". Essa mensagem cria um link para as configurações do Google Play para que o usuário possa renovar a assinatura;
  • você precisa oferecer a possibilidade de dispensar permanentemente essa mensagem.

Quando você receber o novo token de compra, siga as etapas em Verificar um token de compra.

Observação: as mensagens de cancelamento podem frustrar os usuários, especialmente os que cancelaram uma assinatura manualmente, ao contrário dos cancelamentos que ocorrem devido a uma forma de pagamento desatualizada. Você pode optar por não informar os usuários que cancelaram manualmente uma assinatura.

O usuário pausou a assinatura: SUBSCRIPTION_PAUSED

Ao consultar uma assinatura que está atualmente pausada, se expiryTimeMillis for uma data passada e autoResumeTimeMillis for uma data futura, suspenda o acesso do usuário ao conteúdo e considere a titularidade do usuário como pausada:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": $subscription_entitlement_end_time (in the past)
  "autoRenewing": true,
  "paymentState": 1  # Payment received
  ...
  "autoResumeTimeMillis": $subscription_auto_resume_time (in the future)
}

Alterar o preço de uma assinatura

Aviso: não altere o preço de uma assinatura do tipo Assine com o Google.

O Google Play Console permite que você altere os preços das assinaturas oferecidas no seu app. Essa funcionalidade é útil se você alterar a quantidade de conteúdo ou a extensão dos benefícios no aplicativo associados a uma determinada assinatura.

Para atualizar o preço de uma assinatura, conclua as etapas a seguir no Google Play Console:

  1. Navegue até o app que contém a assinatura cujo preço você quer alterar.
  2. Selecione Presença na loja > Produtos no aplicativo e abra a guia Assinaturas.
  3. Selecione o link Editar ao lado do preço que você quer alterar, conforme mostrado na Figura 1:

    Link "Editar" ao lado do preço da assinatura
    Figura 1. Editar o campo de preço de assinatura
  4. Digite o novo preço que você quer que a assinatura tenha.

    Quando você alterar o preço, uma caixa de diálogo de aviso será exibida conforme mostrado na Figura 2. Essa caixa de diálogo explica que a mudança de preço entrará em vigor imediatamente para novos assinantes e em 30 dias para assinantes existentes que concordarem com ela.

    Caixa de diálogo de aviso de alteração de preço da assinatura
    Figura 2. Aviso sobre quando a alteração do preço da assinatura entrará em vigor

Comunicar a mudança de preço ao usuário

Você tem pelo menos sete dias para entrar em contato com os assinantes atuais sobre a mudança de preço antes que o Google Play comece a notificá-los. Quando o Google Play notifica os usuários, ele faz isso exibindo uma caixa de diálogo semelhante à mostrada na Figura 3. 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.

Caixa de diálogo de alteração de preço de assinatura genérica
Figura 3. Caixa de diálogo genérica que notifica o usuário sobre a alteração do preço da assinatura

No seu app, é possível exibir essa caixa de diálogo das seguintes maneiras:

Lançar o fluxo de confirmação de mudança de preço

Para exibir a caixa de diálogo quando o app for iniciado, adicione a seguinte lógica à classe de cliente de faturamento:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                if (responseCode == BillingResponse.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponse.USER_CANCELED) {
                    // User hasn't confirmed the price change.
                }
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                if (responseCode == BillingResponse.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponse.USER_CANCELED) {
                    // User hasn't confirmed the price change.
                }
            }
        });

Antes de exibir a caixa de diálogo de mudança de preço do Google Play, é possível apresentar sua própria mensagem ou caixa de diálogo explicando o motivo da alteração. Se você criar e mostrar esse tipo de mensagem personalizada, é mais provável que seus usuários optem por renovar a assinatura com o novo preço.

Depois que o usuário responder à caixa de diálogo personalizada, seu app ficará ativo novamente e receberá um responseCode do tipo BillingClient.BillingResponse da biblioteca do Google Play Faturamento.

É possível processar a resposta do usuário na sua implementação do PriceChangeConfirmationListener. Por exemplo, você pode exibir uma mensagem de agradecimento personalizada caso o usuário concorde com a mudança de preço.

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, a biblioteca também enviará uma notificação ao servidor de faturamento. É possível receber notificações sobre a resposta do usuário à caixa de diálogo com o recurso de notificação do desenvolvedor em tempo real do Google. Se um usuário aceitar a mudança de preço, você receberá uma notificação do tipo SUBSCRIPTION_PRICE_CHANGE_CONFIRMED.

Processar a recusa da mudança de preço

É possível que o usuário não concorde com a mudança de preço no PriceChangeConfirmationListener do app. Nesse caso, mantenha a assinatura do produto antigo, que expirará na próxima data de renovação. Se um usuário não aceitar 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 do desenvolvedor em tempo real do tipo SUBSCRIPTION_CANCELED.

Caso seu app ofereça assinaturas, inclua um link em uma tela de configurações ou preferências que permita aos usuários gerenciar as assinaturas. Um exemplo desse link é mostrado 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 está no futuro ou autoRenewing está definido como true):

  • Se um usuário não tiver essas assinaturas no seu app, direcione-o para a página que mostra todas as outras assinaturas dele, como mostrado na Figura 5, usando o seguinte URL:

    http://play.google.com/store/account/subscriptions
    
  • Se, por outro lado, um usuário tiver uma assinatura não vencida, será possível conduzi-lo diretamente à assinatura, como mostrado na Figura 6, usando o seguinte URL:

    https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
    

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 para ver a lista de assinaturas associadas a um usuário específico. Para ver um exemplo da lógica necessária do lado do servidor, consulte o método queryCurrentSubscriptions() dentro do app de exemplo ClassyTaxi (links em inglês).

Uma tela "Configurações" que inclui um botão chamado "Assinaturas do Google Play"
Figura 4. O botão Assinaturas do Google Play nesta imagem fornece um exemplo de um link para "gerenciar assinaturas".
Uma tela de detalhes da assinatura que mostra as assinaturas de um usuário em todos os aplicativos
Figura 5. Tela mostrando todas as assinaturas de um usuário compradas fora do app que o encaminhou para essa tela.
Uma tela de detalhes da assinatura que mostra uma assinatura específica que o usuário comprou em um aplicativo específico
Figura 6. Tela mostrando detalhes de uma assinatura específica que o usuário comprou pelo app que o encaminhou para essa tela.

Permitir upgrade ou downgrade de 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:

Figura 7. Níveis de assinatura

É necessário que os usuários possam acessar uma tela semelhante para fazer upgrade ou downgrade, comprando uma assinatura de nível diferente. O app precisa processar esse caso usando o mesmo fluxo de compra do produto no aplicativo que foi usado para comprar a assinatura original em Ativar a compra de um produto no aplicativo. No entanto, ao fazer upgrade ou downgrade, você transmite os IDs do produto para a assinatura atual e a assinatura futura (de upgrade ou downgrade) para o objeto BillingFlowParams usando o método setOldSku(). Exemplo:

Kotlin

val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(newSkuDetails)
        .setOldSku(currentId)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(newSkuDetails)
        .setOldSku(currentId)
        .build();
int responseCode = billingClient.launchBillingFlow(flowParams);

Ao receber o token de compra, siga o mesmo processo de verificação usado para um novo token de compra. Para mais informações, consulte Verificar uma compra. A API Google Play Developer retornará um linkedPurchaseToken no recurso de assinatura. Invalide o token fornecido no linkedPurchaseToken para garantir que o token antigo não seja usado para ter acesso aos seus serviços.

Quando um usuário faz upgrade ou downgrade, um estado SUBSCRIPTION_PURCHASED é enviado para o servidor de back-end seguro. Para processar o SUBSCRIPTION_PURCHASED, consulte Processar SUBSCRIPTION_PURCHASED.

Definir modo de cálculo proporcional

Ao fazer upgrade ou downgrade de uma assinatura, é possível definir replaceSkusProrationMode na classe BillingFlowParams para mostrar detalhes sobre o cálculo proporcional que será aplicado quando a assinatura for alterada.

Kotlin

val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()
int responseCode = billingClient.launchBillingFlow(activity, flowParams);

A tabela a seguir lista todos os modos de cálculo proporcional.

IMMEDIATE_WITH_TIME_PRORATION A substituição entrará em vigor imediatamente, e o novo prazo de expiração será calculado de modo proporcional e creditado ou cobrado do usuário. Esse é o comportamento padrão atual.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE A substituição entrará em vigor imediatamente, e o ciclo de faturamento permanecerá o mesmo. O preço para o período restante será cobrado.

Observação: esta opção só está disponível para upgrade de assinatura.

IMMEDIATE_WITHOUT_PRORATION A substituição entrará em vigor imediatamente, e o novo preço será cobrado no próximo período de recorrência. O ciclo de faturamento permanecerá o mesmo.
DEFERRED A substituição entra em vigor no próximo período de recorrência.

Para entender como cada modo funciona, imagine o seguinte cenário:

Paulo tem uma assinatura de conteúdo on-line do app Country Gardener. Atualmente, ele tem uma assinatura mensal da versão de Nível 1 do conteúdo, que tem conteúdo apenas de 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 assinatura de Nível 2, que inclui atualizações de vídeo e custa R$ 3/mês.

Ao fazer upgrade da assinatura, o desenvolvedor seleciona um modo de cálculo proporcional. A lista a seguir identifica como cada modo de cálculo proporcional afeta a assinatura de Paulo.

  • IMMEDIATE_WITH_TIME_PRORATION: usando este modo, a assinatura do Nível 1 de Paulo é imediatamente finalizada. 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 essa nova assinatura custa R$ 3/mês, o saldo de crédito de R$ 1 só paga por 10 dias. Assim, o crédito de Paulo pagará a assinatura de 15 a 25 de abril. Em 26 de abril, serão cobrados R$ 3 pela nova assinatura e outros R$ 3 no dia 26 de cada mês seguinte.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE: usando este modo, a assinatura do Nível 1 de Paulo é imediatamente finalizada. 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 essa nova assinatura custa R$ 3/mês, os 15 dias restantes custam R$ 1,50. Então, será cobrada a diferença de R$ 0,50 pela nova assinatura e outros R$ 3 no primeiro dia de cada mês seguinte.
  • IMMEDIATE_WITHOUT_PRORATION: usando este modo, a assinatura do Nível 1 de Paulo recebe imediatamente upgrade para o Nível 2, sem nenhum custo extra, e no dia 1º de maio serão cobrados R$ 3 pelo novo nível de assinatura e outros R$ 3 no primeiro dia de cada mês.
  • DEFERRED: usando este modo, a assinatura do Nível 1 de Paulo continua até que expire, 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$ 3 pelo novo nível de assinatura.

Pausar uma assinatura

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 ativar a opção de pausa, ela será exibida na central de assinaturas e no fluxo de cancelamento. Observe que os limites de pausa de uma semana e de três meses estão sujeitos a alterações a qualquer momento. Observe também que as assinaturas anuais não podem ser pausadas.

Importante: para ativar a pausa, você também precisa ativar a suspensão da conta.

Para permitir que os usuários pausem a assinatura, faça o seguinte:

  1. Faça login no Google Play Console.
  2. Selecione seu app e acesse Presença na loja > Produtos no aplicativo > Assinaturas.
  3. Expanda a seção Configurações de assinatura.
  4. Marque Ativar pausa.

Uma pausa de assinatura entra em vigor somente após o término do período de faturamento atual. Enquanto estiver em pausa, o usuário não terá acesso à assinatura. 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 8:

Diagrama de transição do estado pausado para o estado de suspensão de conta.
Figura 8. Um usuário faz uma pausa na assinatura, e a conta entra no estado suspenso.

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 9. Quando um usuário retoma manualmente, a data de faturamento é alterada para a data de retomada manual.

Diagrama de transição do estado pausado para o estado retomado.
Figura 9. Um usuário faz uma pausa e, em seguida, retoma a assinatura.

Quando uma assinatura for pausada, recomendamos que você informe ao usuário pelo app que ele não terá acesso à assinatura porque ela está pausada. Você também precisa fornecer uma maneira de o usuário retomar manualmente a assinatura usando um link direto para o Google Play.

Você pode detectar quando uma assinatura for pausada e retomada por qualquer um dos seguintes métodos:

  • Usando a API Google Play Developer, procure os campos expiryTimeMillis e autoResumeTimeMillis na resposta Purchases.subscriptions:

    • Se o usuário tiver uma pausa pendente, tanto expiryTimeMillis quanto autoResumeTimeMillis conterão datas futuras.
    • Se o usuário estiver atualmente em pausa, autoResumeTimeMillis conterá uma data futura e expiryTimeMillis conterá uma data passada.
    • Se o usuário tiver retomado a assinatura, a resposta conterá dados de assinatura ativos.
    • Se o usuário tiver a conta suspensa, a resposta conterá dados de suspensão da conta.
  • Use notificações do desenvolvedor em tempo real (RTDN, na sigla em inglês). Para garantir que você receba as mais recentes informações sobre a pausa da assinatura, chame a API Google Play Developer em resposta a todos os tipos de notificação RTDN, incluindo os tipos que não são reconhecidos. Os tipos de notificação relevantes para pausa de assinatura são os seguintes:

    • SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED: um usuário optou por pausar ou retomar a assinatura antes que a pausa tenha entrado em vigor.
    • SUBSCRIPTION_PAUSED: a assinatura está atualmente em pausa.
    • SUBSCRIPTION_RENEWED: a assinatura foi retomada.
    • SUBSCRIPTION_ON_HOLD: uma tentativa de retomar a assinatura não foi bem-sucedida, e ela está atualmente em suspensão de conta.
  • No dispositivo Android, use a biblioteca do Google Play Faturamento para chamar queryPurchases() sempre que o aplicativo for iniciado. Use o PurchasesUpdatedListener para receber atualizações enquanto o app estiver em execução. A lista de objetos Purchase em onPurchasesUpdated() não contém assinaturas em pausa.

Permitir refazer a assinatura

Os usuários podem refazer uma assinatura cancelada, mesmo que ela ainda não tenha expirado. É possível permitir que eles refaçam a assinatura dentro do seu app aplicando o mesmo fluxo de compra de produto no aplicativo à assinatura cancelada (com o mesmo código de produto). Para mais informações, consulte Ativar a compra de um produto no aplicativo.

A nova assinatura substituirá a antiga e será renovada na mesma data de validade. Por exemplo, Ana tem uma assinatura do app Example Music. A assinatura está prevista para expirar em 1º de agosto. Em 10 de julho, ela refaz a assinatura de um mês pelo mesmo preço mensal. A nova assinatura será calculada de modo proporcional com o crédito restante, imediatamente ativada e renovada em 1º de agosto.

É necessário exibir uma IU apropriada para a reativação da assinatura:

  • Se um usuário não tiver uma assinatura ativa, o app mostrará um botão "Comprar".
  • Se o usuário tiver uma assinatura cancelada (SUBSCRIPTION_CANCELLED), o app poderá ter um botão "Assinar de novo". Para saber mais informações, consulte Processar SUBSCRIPTION_CANCELLED.

Ao receber o token de compra, siga o mesmo processo de verificação usado para um novo token de compra. Para mais informações, consulte Verificar uma compra. A API Google Play Developer retornará 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.

Oferecer um código promocional para uma assinatura

Promoções ou códigos promocionais permitem que você ofereça gratuitamente produtos ou avaliações de assinatura de aquisição única a um número limitado de usuários. Para implementar códigos promocionais para avaliações de inscrição, consulte Implementar uma promoção.

Reembolsar o custo de uma assinatura

O Google Play não fornece uma janela de reembolso para assinaturas. Em vez disso, é necessário que os usuários solicitem um reembolso diretamente para você. Eles podem solicitar um reembolso usando a página "Meus pedidos" na Play Store ou entrando em contato diretamente com você.

Se você receber solicitações de reembolso, poderá usar a API Google Play Developer ou o Merchant Center para:

  1. cancelar a assinatura (Purchases.subscriptions: cancel);
  2. verificar se a assinatura já está cancelada (retorna um código de resposta HTTP de 200) (Purchases.subscriptions:cancel);
  3. reembolsar o pagamento do usuário sem cancelar a assinatura (Purchases.subscriptions:refund).

Se você quiser reembolsar mais do que o pagamento mais recente, poderá processar outros reembolsos por meio do Merchant Center.

Se a assinatura for cancelada, um estado SUBSCRIPTION_CANCELLED será enviado ao servidor de back-end seguro. Para processar o SUBSCRIPTION_CANCELLED, consulte Processar SUBSCRIPTION_CANCELLED.

Revogar uma assinatura

Com a API Google Play Developer, é possível revogar a assinatura usando Purchases.subscriptions:revoke. A revogação remove instantaneamente o acesso à assinatura e geralmente acontece quando você ou o Google suspeita de fraude.

Cancelar uma assinatura

Um usuário também pode cancelar uma assinatura pelo app Play Store. Com a API Google Play Developer, também é possível cancelar uma assinatura usando Purchases.subscriptions:cancel.

Observação: essa API costuma ser usada quando os usuários solicitam um reembolso na página "Meus pedidos". Para ter mais informações, consulte Reembolsar o custo de uma assinatura.

Os usuários mantêm o acesso ao conteúdo até o final do ciclo de faturamento atual. Quando o ciclo de faturamento termina, o acesso é revogado.

Importante: não remova uma assinatura do Google Play enquanto algum usuário ainda tiver direito ao conteúdo. A remoção do conteúdo adquirido por um usuário resultará em penalidades. Para mais informações, consulte a seção "Cancelamentos" em Criar uma assinatura.

Restaurar uma assinatura

Observação: para garantir uma experiência do usuário consistente em todos os apps, a partir de 15 de abril de 2019, o Google ativará o recurso de restauração por padrão para todos os desenvolvedores com assinaturas ativadas. É altamente recomendável testar a funcionalidade de restauração antes dessa data para garantir que todas as solicitações sejam processadas corretamente. Para facilitar essa transição, o Google permitiu a restauração de todas as contas de teste de licença. Para saber mais sobre como testar assinaturas, consulte Testar recursos específicos de assinaturas.

Se você precisar fazer alterações no código e não for possível concluí-las antes de 15 de abril de 2019, desative o recurso no Google Play Console acessando Presença na loja > Produtos no aplicativo > Configurações de assinatura e desmarcando Permitir que os usuários restaurem assinaturas no Google Play. É possível desmarcar essa opção depois que a alteração entrar em vigor, no dia 15 de abril de 2019.

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 RESTAURAR na seção Conta > Assinaturas do app Play Store.

Figura 10. Seção Conta > Assinaturas no app Play Store

Existem duas maneiras de detectar quando uma assinatura é restaurada:

  1. Seu app receberá a notificação SUBSCRIPTION_RESTARTED. Veja mais detalhes em Notificações do desenvolvedor em tempo real.
  2. É possível chamar o método getPurchases() toda vez que o app for aberto. Depois que uma assinatura for restaurada, o purchaseToken será idêntico ao que era antes do cancelamento da assinatura.

Para permitir que os usuários restaurem assinaturas canceladas:

  1. Faça login no Google Play Console.
  2. Selecione seu app e navegue até Presença na loja > Produtos no aplicativo.
  3. Selecione a guia Assinaturas e expanda a seção Configurações de assinatura.
  4. Marque a caixa de seleção Permitir que os usuários restaurem assinaturas no Google Play, conforme mostrado na Figura 11, e clique em Salvar.
    Figura 11. A caixa de seleção Ativar a restauração de assinatura no Google Play Console

Adiar o faturamento

Com a API Google Play Developer, você pode adiantar a próxima data de faturamento para um assinante usando Purchases.subscriptions:defer. O usuário continuará a ser assinante do conteúdo e terá acesso total a ele, mas não será cobrado durante o período de adiamento. A data de renovação da assinatura será atualizada para refletir a nova data. O faturamento adiado permite que você:

  • conceda aos usuários acesso gratuito como parte de um pacote ou de uma oferta especial, por exemplo, dar acesso gratuito ao conteúdo da Web a usuários que assinam uma revista impressa;
  • conceda acesso gratuito a clientes como gesto de boa-fé.

O faturamento pode ser adiado por um período que varia de um dia a um ano por chamada de API. É possível chamar a API antes da nova data de faturamento para estender o adiamento.

Por exemplo, Daniela tem uma assinatura mensal de conteúdo on-line para o app 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 (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. A próxima data de renovação será 15 de junho.

Notifique o usuário (por e-mail ou dentro do app) para informar que a data de faturamento foi adiada (alterada).

Reconquistar um cliente

Se um cliente fiel deixou seu serviço após um longo período, ofereça um ID de produto que represente um preço especial para a assinatura, também chamado de SKU de recuperação de assinaturas. É possível fornecer a oferta no seu app ou notificar o usuário por e-mail. Para iniciar uma assinatura de recuperação, inicie o fluxo de compra no seu app Android usando a biblioteca do Google Play Faturamento. Esse é o mesmo processo de uma nova assinatura, mas você pode determinar qual SKU estará disponível para o usuário.

Notícias e recursos mais recentes

A seguir

Depois de adicionar recursos específicos da assinatura, vá até Práticas recomendadas.