Participe do evento ⁠#Android11: apresentação de lançamento da versão Beta no dia 3 de junho.

Adicionar recursos específicos de assinatura

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

Veja os mais recentes vídeos sobre assinaturas 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. As notificações do desenvolvedor em tempo real permitem reagir de maneira proativa às mudanças de estado, aumentar o seu envolvimento e reduzir a rotatividade de usuários. Para ativá-las, 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 mudanças de estado, como SUBSCRIPTION_PURCHASED ou SUBSCRIPTION_RECOVERED, para assinaturas. Elas permitem reagir de maneira proativa às mudanças de estado, aumentar o 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 mudanças 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, poderemos adicionar outras mudanças de estado que afetem a titularidade de um usuário, por exemplo, 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 aplicativo 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 será vinculada às configurações de assinatura do Google Play para que o usuário possa corrigir 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 espera. É necessário verificar o status atual da assinatura do usuário depois que expiryTimeMillis tiver sido transmitido para ver 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), expiryTimeMillis será atualizado dinamicamente para um carimbo de data/hora futuro, 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), expiryTimeMillis será definido como um carimbo de data/hora futuro, 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 (se você ativar a suspensão de conta no Google Play Console) ou será cancelada (se você não ativar 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 porque o acesso à assinatura foi suspenso. Para fazer isso, envie uma mensagem no seu aplicativo 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 corrigir o pagamento no Google Play." Essa mensagem deve conter 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:

  • Se o usuário atualizar a forma de pagamento e a assinatura for recuperada, seu aplicativo precisará restaurar o acesso ao conteúdo assinado. Para saber mais, 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 acessar a assinatura fora do aplicativo, envie uma notificação push ou um e-mail ao usuário para informar que a assinatura não está mais ativa. Se a assinatura só puder ser acessada quando o usuário abrir o aplicativo, informe-o sobre a interrupção da assinatura na próxima vez que o usuário abrir o aplicativo.

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 aplicativo.

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), 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), expiryTimeMillis será definido como um carimbo de data/hora futuro, e 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, expiryTimeMillis será definido como um carimbo de data/hora passado, e 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 é 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 do registro dos novos dados de assinatura no servidor, é possível exibir uma mensagem no seu aplicativo informando aos usuários que a assinatura deles foi restaurada. Por exemplo, "Sua forma de pagamento atualizada foi registrada e sua assinatura foi restaurada".

Cancelamento de assinatura: SUBSCRIPTION_CANCELLED

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

  • Exiba uma mensagem no seu aplicativo informando ao usuário que a assinatura foi cancelada, como "Sua assinatura expirará em **alguma_data**". Acesse as configurações de assinatura do Google Play para restaurá-la". Essa mensagem deve conter um link para as configurações de assinatura do Google Play para que o usuário possa renová-la.
  • 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 manualmente uma assinatura, ao contrário dos cancelamentos que ocorrem devido a uma forma de pagamento desatualizada. É recomendável não avisar 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)
    }
    

Mudar o preço de uma assinatura

Alerta: não mude o preço de uma assinatura do tipo Assine com o Google.

O Google Play Console permite que você mude os preços das assinaturas que oferece no seu app. Essa funcionalidade será útil se você mudar a quantidade de conteúdo ou a extensão dos benefícios no app associados a uma determinada assinatura.

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

  1. Navegue até o aplicativo que tem a assinatura cujo preço você gostaria de 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 mudar, conforme mostrado na Figura 1:

    Link
    Figura 1. Como 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 atuais que concordarem com a mudança de preço.

    Caixa de diálogo de aviso de mudança no preço da assinatura
    Figura 2. Aviso sobre quando a mudança 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 alteração 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 mudança de preço de assinatura genérica
Figura 3. Caixa de diálogo genérica que notifica o usuário sobre a mudança 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 seu aplicativo é 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 alteração de preço do Google Play, é possível apresentar sua própria mensagem ou caixa de diálogo explicando o motivo da mudança. 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 voltará a ficar ativo e receberá um responseCode do tipo BillingClient.BillingResponse da Google Play Billing Library.

Você pode 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 sua 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 pelo recurso Notificações 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 seu app. Nesse caso, mantenha o usuário com a assinatura do produto antigo, que expira na próxima data de renovação. Se um usuário não aceitar a mudança de preço no momento em que a assinatura antiga expirar, esta será cancelada, e você receberá uma notificação do desenvolvedor em tempo real do tipo SUBSCRIPTION_CANCELED.

Caso seu aplicativo 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, conforme mostrado na Figura 5, usando o seguinte URL:

        https://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 o criou no Play Console. Para determinar programaticamente o SKU de uma assinatura existente, consulte o back-end do seu aplicativo para ver a lista de assinaturas associadas a um usuário específico.

Uma tela
Figura 4. O botão Assinaturas do Google Play nesta imagem é um exemplo de 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 aplicativo, que o enviaram para esta tela.
Uma tela de detalhes de uma assinatura específica que o usuário comprou em um app específico
Figura 6. Tela mostrando detalhes de uma assinatura específica que o usuário comprou no aplicativo, que o enviou para esta 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 de uma assinatura comprando uma assinatura de nível diferente. Seu aplicativo precisa lidar com esse caso usando o mesmo fluxo de compra de produto no aplicativo 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 ver 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.

Quando um usuário faz upgrade ou downgrade, um estado SUBSCRIPTION_PURCHASED é enviado para o servidor de back-end seguro. Para gerenciar 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 mudar.

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 entra em vigor imediatamente, e o ciclo de faturamento permanece 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 permanece 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 terminada. 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á por sua assinatura de 15 a 25 de abril. Em 26 de abril, serão cobrados R$ 3 por sua 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 terminada. 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 por sua 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 sã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 seu 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 mudanças a qualquer momento. Observe também que as assinaturas anuais não podem ser pausadas.

Importante: para ativar a pausa, também é necessário 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. Abra 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 de suspensão.

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 muda 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 do 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, ambos os campos expiryTimeMillis e autoResumeTimeMillis conterão datas no futuro.
    • Se o usuário estiver atualmente em pausa, autoResumeTimeMillis conterá uma data futura, e expiryTimeMillis conterá uma data no passado.
    • 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 as Notificações do desenvolvedor em tempo real (RTDN, na sigla em inglês). Para garantir que você receba as informações mais recentes 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 entre em vigor.
    • SUBSCRIPTION_PAUSED: a assinatura está pausada no momento.
    • SUBSCRIPTION_RENEWED: a assinatura foi retomada.
    • SUBSCRIPTION_ON_HOLD: uma tentativa de retomar a assinatura não foi bem-sucedida, e a assinatura está atualmente em suspensão de conta.
  • No dispositivo Android, use a biblioteca do Google Play Faturamento para chamar queryPurchases() sempre que o app 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 pausadas.

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 da assinatura cancelada, usando o mesmo ID do produto.

A nova assinatura substituirá a assinatura ativa e terá a mesma data de validade da assinatura substituída. Por exemplo, Ana tem uma assinatura do aplicativo 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. A nova assinatura será calculada de modo proporcional ao crédito restante da assinatura anterior. Ela será ativada imediatamente 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 aplicativo poderá ter um botão "Assinar de novo". Para saber mais, 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 ver 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 de aquisição única ou avaliações da assinatura a um número limitado de usuários. Para implementar códigos promocionais para avaliações de assinatura, 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 gerenciar 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 de uma assinatura 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 no app Play Store. Com a API Google Play Developer, você também pode 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 saber mais, 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 um usuário ainda tiver direito ao conteúdo. A remoção do conteúdo adquirido por um usuário resultará em penalidades. Para ver mais informações, consulte a seção "Cancelamentos" em Criar uma assinatura.

Restaurar uma assinatura

Observação: o recurso de restauração é ativado por padrão para todos os desenvolvedores que ativaram assinaturas. É altamente recomendável que você teste a funcionalidade de restauração para garantir o gerenciamento correto das restaurações. Para ajudar nos testes, o Google ativou o recurso de restauração para todas as contas de teste de licença. Para saber mais sobre como testar assinaturas, consulte Testar recursos específicos de assinaturas.

Você pode desativar esse recurso no Google Play Console acessando Presença na loja > Produtos no app > Configurações de assinatura e desmarcando Permitir que usuários restaurem assinaturas no Google Play.

Uma assinatura cancelada permanece visível no aplicativo 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 Assinaturas do app Play Store, conforme mostrado na Figura 10:

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

Existem duas maneiras de detectar quando uma assinatura é restaurada:

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

Para permitir que os usuários restaurem assinaturas canceladas:

  1. Faça login no Google Play Console.
  2. Selecione seu aplicativo 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 continua a ser assinante do conteúdo e tem acesso total a ele, mas não é 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 temporário gratuito como parte de um pacote ou de uma oferta especial, por exemplo, dar acesso gratuito ao conteúdo da Web aos usuários que assinam uma revista impressa;
  • conceda acesso gratuito a clientes como gesto de boa-fé.

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

Por exemplo, Daniela tem uma assinatura mensal de conteúdo on-line para o aplicativo Fishing Quarterly. Normalmente, ela paga R$ 1,25 no primeiro dia de cada mês. Em março, ela participou de uma pesquisa on-line para o editor do aplicativo. A editora a recompensou com seis semanas gratuitas, adiando o próximo pagamento até 15 de maio (seis semanas após a data de faturamento previamente agendada para 1º de abril). Daniela não é cobrada em abril ou 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. Sua próxima data de renovação será 15 de junho.

Notifique o usuário (usando um e-mail ou dentro do aplicativo) 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. Você pode disponibilizar a oferta no seu app ou notificar o usuário sobre a oferta em um e-mail. Para começar uma assinatura de recuperação, inicie o fluxo de compra no seu aplicativo para Android usando a Google Play Billing Library. Esse é o mesmo processo de uma nova assinatura, mas você pode determinar qual SKU está disponível para o usuário.

Notícias e recursos mais recentes

A seguir

Depois de adicionar recursos específicos da assinatura, acesse as Práticas recomendadas.