O segundo Visualização do Desenvolvedor do Android 11 já está disponível, teste e compartilhe seu feedback.

Notas da versão da biblioteca do Google Play Faturamento

Este tópico contém notas da versão da Google Play Billing Library.

Google Play Billing Library versão 2.1.0 e extensão Kotlin versão 2.1.0 (10-12-2019)

A versão 2.1.0 da Google Play Billing Library e a nova extensão Kotlin já estão disponíveis. A extensão Kotlin da Play Billing Library fornece alternativas de API idiomáticas para o consumo do Kotlin, com segurança nula e corrotinas melhores. Para exemplos de código, consulte Usar a Google Play Billing Library.

Essa versão contém as mudanças a seguir.

Resumo das mudanças

  • Em BillingFlowParams, suspensão do uso de setOldSku(String oldSku), que foi substituído por setOldSku(String oldSku, String purchaseToken) para desambiguar quando várias contas no dispositivo possuem o mesmo SKU.

Google Play Billing Library versão 2.0.3 (05-08-2019)

A versão 2.0.3 da biblioteca do Google Play Faturamento está disponível.

Correções de bugs

  • Correção de um bug em que o querySkuDetailsAsync() falhava ocasionalmente com o código DEVELOPER_ERROR em vez de retornar um resultado bem-sucedido.

Google Play Billing Library versão 2.0.2 (08-07-2019)

A versão 2.0.2 da Google Play Billing Library está disponível. Essa versão contém atualizações da documentação de referência e não muda a funcionalidade da biblioteca.

Google Play Billing Library versão 2.0.1 (06-06-2019)

A versão 2.0.1 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

Correções de bugs

  • Correção de um bug em que as mensagens de depuração estavam sendo retornadas como null em alguns casos.
  • Correção de um possível problema de vazamento de memória.

Biblioteca do Google Play Faturamento versão 2.0 (07-05-2019)

A versão 2.0 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

As compras precisam ser confirmadas em até três dias

O Google Play é compatível com a compra de produtos dentro ou fora do seu app. Para que o Google Play garanta uma experiência de compras consistente, independentemente de onde o usuário compra seu produto, você precisa confirmar todas as compras recebidas pela Google Play Billing Library assim que possível depois de conceder a titularidade ao usuário. Se você não confirmar uma compra em até três dias, o usuário receberá um reembolso automaticamente, e o Google Play revogará a compra. Para transações pendentes (função nova da versão 2.0), o prazo de três dias começa a ser contado quando a compra é movida para o estado SUCCESS, e não se aplica enquanto a compra está no estado PENDING.

Para assinaturas, você precisa confirmar compras que tiverem um novo token de compra. Isso quer dizer que todas as compras iniciais, mudanças de plano e novas assinaturas precisam ser confirmadas, mas você não precisa confirmar as renovações subsequentes. Para determinar se uma compra precisa ser confirmada ou não, você pode verificar o campo de confirmação na compra.

O objeto Purchase agora inclui um método isAcknowledged(), que indica se uma compra foi confirmada. Além disso, a API Google Play Developer inclui valores booleanos de confirmação para Purchases.products e Purchases.subscriptions. Antes de confirmar uma compra, use esses métodos para determinar se ela já foi confirmada.

É possível confirmar uma compra usando um dos seguintes métodos:

  • Para produtos consumíveis, use consumeAsync(), localizado na API do cliente.
  • Para produtos não consumíveis, use acknowledgePurchase(), localizado na API do cliente.
  • Um novo método acknowledge() também está disponível na API do servidor.

BillingFlowParams.setSku() foi removido

O método BillingFlowParams#setSku() anteriormente obsoleto foi removido nesta versão. Antes de renderizar produtos em um fluxo de compras, agora é necessário chamar BillingClient.querySkuDetailsAsync(), transmitindo o objeto SkuDetails resultante para BillingFlowParams.Builder.setSkuDetails().

Para exemplos de código, consulte Usar a Google Play Billing Library.

O payload do desenvolvedor é compatível

A versão 2.0 da Google Play Billing Library adiciona compatibilidade com o payload do desenvolvedor (strings arbitrárias que podem ser anexadas a compras). É possível anexar um payload do desenvolvedor a uma compra, mas apenas quando a compra é confirmada ou consumida. Ele é diferente do payload do desenvolvedor em AIDL, em que o payload podia ser especificado no lançamento de um fluxo de compra. Como as compras agora podem ser iniciadas fora do seu app, essa mudança garante que você tenha sempre uma oportunidade de adicionar um payload a elas.

Para acessar o payload na nova biblioteca, os objetos Purchase agora incluem um método getDeveloperPayload().

Ofertas consistentes

Agora, quando você oferece um SKU com desconto, o Google Play retorna o preço original do SKU para que você possa mostrar aos usuários que eles estão recebendo um desconto.

SkuDetails contém dois novos métodos para recuperar o preço do SKU original:

Transações pendentes

Com a versão 2.0 da Google Play Billing Library, você precisa de compatibilidade com compras quando mais ações forem necessárias antes de conceder a titularidade. Por exemplo, um usuário pode escolher comprar seu produto em uma loja física com dinheiro. Isso significa que a transação é concluída fora do seu app. Em casos como esse, você precisa conceder a titularidade somente após o usuário ter concluído a transação.

Para ativar compras pendentes, chame enablePendingPurchases() como parte da inicialização do app.

Use Purchase.getPurchaseState() para determinar se o estado de compra é PURCHASED ou PENDING. Observe que você precisa conceder titularidade apenas quando o estado for PURCHASED. Para verificar se há atualizações de status Purchase, faça o seguinte:

  1. Ao iniciar o app, chame BillingClient.queryPurchases() para recuperar a lista de produtos não consumidos associados ao usuário.
  2. Chame Purchase.getPurchaseState() em cada objeto Purchase retornado.
  3. Implemente o método onPurchasesUpdated() para responder a mudanças em objetos Purchase.

Além disso, a API Google Play Developer inclui um estado PENDING para Purchases.products. Transações pendentes não são compatíveis com assinaturas.

Esta versão também introduz um novo tipo de notificação de desenvolvedor em tempo real, a OneTimeProductNotification. Esse tipo de notificação contém uma única mensagem, cujo valor é ONE_TIME_PRODUCT_PURCHASED ou ONE_TIME_PRODUCT_CANCELED. Esse tipo de notificação é enviado apenas para compras associadas a formas de pagamento atrasadas, como dinheiro.

Confirme compras pendentes apenas quando o estado de compra for SUCCESS, e não PENDING.

Mudanças na API

A versão 2.0 da Google Play Billing Library contém várias mudanças de API para melhorar a compatibilidade de novos recursos e esclarecer a funcionalidade existente.

consumeAsync

consumeAsync() agora leva um objeto ConsumeParams em vez de um purchaseToken. ConsumeParams contém o purchaseToken, bem como um payload opcional do desenvolvedor.

A versão anterior do consumeAsync() foi removida nesta versão.

queryPurchaseHistoryAsync

Para evitar confusões, queryPurchaseHistoryAsync() agora retorna um objeto PurchaseHistoryRecord em vez de um objeto Purchase. O objeto PurchaseHistoryRecord é o mesmo que um objeto Purchase, exceto pelo fato de refletir apenas os valores retornados por queryPurchaseHistoryAsync() e não conter os campos autoRenewing, orderId e packageName. Observe que nada foi modificado nos dados retornados: queryPurchaseHistoryAsync() retorna os mesmos dados de antes.

Valores de retorno de BillingResult

As APIs que anteriormente retornavam um valor inteiro de BillingResponse agora retornam um objeto BillingResult. BillingResult contém o número inteiro de BillingResponse, bem como uma string de depuração que pode ser usada para diagnosticar erros. A string de depuração usa uma localidade en-US e não pode ser mostrada para usuários finais.

Correções de bugs

Google Play Billing Library versão 1.2.2 (07/03/2019)

A versão 1.2.2 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

Correções de bugs

  • Foi corrigido um problema de linha de execução introduzido na v1.2.1. Chamadas em segundo plano não bloqueiam mais a linha de execução principal.

Outras mudanças

  • Embora o uso da linha de execução principal ainda seja recomendado, agora você pode instanciar a Google Play Billing Library de uma linha de execução em segundo plano.
  • A instanciação foi completamente migrada para a linha de execução em segundo plano para reduzir a chance de causar ANRs.

Google Play Billing Library versão 1.2.1 (04-03-2019)

A versão 1.2.1 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

Principais mudanças

Outras mudanças

  • Construtores públicos para PurchasesResult e SkuDetailsResult foram adicionados para facilitar os testes.
  • Objetos SkuDetails podem usar um novo método, o getOriginalJson().
  • Todas as chamadas de serviço AIDL agora são controladas por linhas de execução em segundo plano.

Correções de bugs

  • Listeners de callback nulos não são mais passados para APIs públicas.

Google Play Billing Library versão 1.2 (18-10-2018)

A versão 1.2 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

Resumo das mudanças

  • A Google Play Billing Library agora está licenciada sob o Contrato de Licença do kit de desenvolvimento de software do Android.
  • Foi adicionada a API launchPriceChangeConfirmationFlow, que solicita que os usuários analisem uma mudança pendente de um preço de assinatura.
  • Foi adicionada compatibilidade com um novo modo de cálculo proporcional, DEFERRED, no momento do upgrade ou downgrade da assinatura de um usuário.
  • Na classe BillingFlowParams, substituindo setSku() por setSkuDetails().
  • Pequenas correções de bugs e otimizações de código.

Confirmação de alteração de preço

Agora você pode mudar o preço de uma assinatura no Google Play Console e solicitar que os usuários analisem e aceitem o novo preço ao entrarem no seu app.

Para usar essa API, crie um objeto PriceChangeFlowParams usando os skuDetails do produto por assinatura. Em seguida, chame launchPriceChangeConfirmationFlow(). Implemente o PriceChangeConfirmationListener para processar o resultado quando o fluxo de confirmação de mudança de preço terminar, conforme mostrado no snippet de código a seguir:

Kotlin

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

    billingClient.launchPriceChangeConfirmationFlow(activity,
            priceChangeFlowParams,
            object : PriceChangeConfirmationListener() {
                override fun onPriceChangeConfirmationResult(responseCode: Int) {
                    // Handle the result.
                }
            })
    

Java

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

    billingClient.launchPriceChangeConfirmationFlow(activity,
            priceChangeFlowParams,
            new PriceChangeConfirmationListener() {
                @Override
                public void onPriceChangeConfirmationResult(int responseCode) {
                    // Handle the result.
                }
            });
    

O fluxo de confirmação de mudança de preço exibe uma caixa de diálogo com as novas informações de preço, pedindo que os usuários aceitem o novo valor. Esse fluxo retorna um código de resposta do tipo BillingClient.BillingResponse.

Novo modo de cálculo proporcional

Ao fazer upgrade ou downgrade da assinatura de um usuário, você pode usar um novo modo de cálculo proporcional, o DEFERRED. Esse modo atualiza a assinatura do usuário na próxima renovação. Para saber mais sobre como definir esse modo de cálculo proporcional, consulte Definir modo de cálculo proporcional.

Novo método para definir detalhes de SKU

Na classe BillingFlowParams, o método setSku() se tornou obsoleto. Essa mudança serve para otimizar o fluxo do Google Play Faturamento.

Ao criar uma nova instância de BillingFlowParams no seu cliente de faturamento em apps, recomendamos que você trabalhe diretamente com o objeto JSON usando setSkuDetails(), conforme mostrado no snippet de código a seguir:

Na classe Builder BillingFlowParams, o método setSku() se tornou obsoleto. Em vez disso, use o método setSkuDetails(), conforme mostrado no snippet de código a seguir. O objeto transmitido para o objeto setSkuDetails() vem do método querySkuDetailsAsync().

Kotlin

    private lateinit var mBillingClient: BillingClient
    private val mSkuDetailsMap = HashMap<String, SkuDetails>()

    private fun querySkuDetails() {
        val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
        mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
        ) { responseCode, skuDetailsList ->
            if (responseCode == 0) {
                for (skuDetails in skuDetailsList) {
                    mSkuDetailsMap[skuDetails.sku] = skuDetails
                }
            }
        }
    }

    private fun startPurchase(skuId: String) {
        val billingFlowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(mSkuDetailsMap[skuId])
        .build()
    }
    

Java

    private BillingClient mBillingClient;
    private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

    private void querySkuDetails() {
        SkuDetailsParams.Builder skuDetailsParamsBuilder
                = SkuDetailsParams.newBuilder();
        mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
                new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(int responseCode,
                            List<SkuDetails> skuDetailsList) {
                        if (responseCode == 0) {
                            for (SkuDetails skuDetails : skuDetailsList) {
                                mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                            }
                        }
                    }
                });
    }

    private void startPurchase(String skuId) {
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(mSkuDetailsMap.get(skuId))
                .build();
    }
    

Google Play Billing Library versão 1.1 (07-05-2018)

A versão 1.1 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

Resumo das mudanças

  • Foi adicionada compatibilidade para especificar um método de cálculo proporcional em BillingFlowParams ao fazer upgrade/downgrade de uma assinatura existente.
  • A sinalização booleana replaceSkusProration em BillingFlowParams não é mais compatível. Em vez dela, use replaceSkusProrationMode.
  • launchBillingFlow() agora aciona um callback para respostas com falha.

Mudanças de comportamento

A versão 1.1 da Google Play Billing Library tem as seguintes mudanças de comportamento.

Os desenvolvedores podem definir o replaceSkusProrationMode na classe BillingFlowParams

Um ProrationMode oferece mais detalhes sobre o tipo de cálculo proporcional no momento do upgrade ou downgrade da assinatura de um usuário.

Kotlin

    BillingFlowParams.newBuilder()
        .setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()

    

Java

    BillingFlowParams.newBuilder()
        .setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build();

    

Atualmente, o Google Play é compatível com os seguintes 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.

replaceSkusProration não é mais compatível com a classe BillingFlowParams

Os desenvolvedores podiam definir uma sinalização booleana para cobrar uma quantia de cálculo proporcional por uma solicitação de upgrade de assinatura. Já que temos compatibilidade com ProrationMode, que contém instruções de cálculo proporcional mais detalhadas, essa sinalização booleana não é mais compatível.

launchBillingFlow() agora aciona um callback para respostas com falha

A Google Play Billing Library aciona o callbackPurhcasesUpdatedListener e retorna um BillingResponse de forma assíncrona. O valor de retorno síncrono de BillingResponse também é mantido.

Correções de bugs

  • Sai corretamente no início de métodos assíncronos quando o serviço é desconectado.
  • Os objetos de parâmetro Builder não se transformam mais em objetos compilados.
  • Problema 68087141: o launchBillingFlow() agora aciona um callback para respostas com falha.

Biblioteca do Google Play Faturamento versão 1.0 (19-09-2017, Anúncio em inglês)

A versão 1.0 da Google Play Billing Library está disponível. Essa versão contém as mudanças a seguir.

Mudanças importantes

  • Uma permissão de faturamento foi incorporada no manifesto da biblioteca. Não é mais necessário adicionar a permissão com.android.vending.BILLING no manifesto do Android.
  • Novo compilador adicionado à classe BillingClient.Builder.
  • Foi introduzido um padrão de compilador para que a classe SkuDetailsParams seja usada em métodos de consulta de SKUs.
  • Vários métodos de API foram atualizados para fins de consistência, com os mesmos nomes e ordens de argumentos de retorno.

Mudanças de comportamento

A versão 1.0 da Google Play Billing Library tem as seguintes mudanças de comportamento.

Classe BillingClient.Builder

BillingClient.Builder agora é inicializado por meio do padrão newBuilder:

Kotlin

    billingClient = BillingClient.newBuilder(context).setListener(this).build()
    

Java

    billingClient = BillingClient.newBuilder(context).setListener(this).build();
    

O método launchBillingFlow agora é chamado com uma classe BillingFlowParams

Para iniciar o fluxo de faturamento para uma compra ou assinatura, o método launchBillingFlow() recebe uma instância BillingFlowParams inicializada com parâmetros específicos para a solicitação:

Kotlin

    BillingFlowParams.newBuilder().setSku(skuId)
            .setType(billingType)
            .setOldSku(oldSku)
            .build()

    // Then, use the BillingFlowParams to start the purchase flow
    val responseCode = billingClient.launchBillingFlow(builder.build())
    

Java

    BillingFlowParams.newBuilder().setSku(skuId)
                                  .setType(billingType)
                                  .setOldSku(oldSku)
                                  .build();

    // Then, use the BillingFlowParams to start the purchase flow
    int responseCode = billingClient.launchBillingFlow(builder.build());
    

Nova maneira de consultar produtos disponíveis

Os argumentos para os métodos queryPurchaseHistoryAsync() e querySkuDetailsAsync() foram agrupados em um padrão Builder:

Kotlin

    val params = SkuDetailsParams.newBuilder()
    params.setSkusList(skuList)
            .setType(itemType)
    billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
        ...
    })
    

Java

    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
    params.setSkusList(skuList)
            .setType(itemType);
    billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})
    

Por conveniência e para fins de consistência em toda a nossa API, o resultado agora é retornado por meio de um código e uma lista de objetos SkuDetails em vez das classes de wrapper anteriores:

Kotlin

    fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)
    

Java

    public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)
    

Ordem de parâmetros modificada no método onConsumeResponse()

A ordem dos argumentos para onConsumeResponse da interface ConsumeResponseListener mudou para ser consistente em toda a nossa API:

Kotlin

    fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)
    

Java

    public void onConsumeResponse(@BillingResponse int responseCode, String outToken)
    

Objeto PurchaseResult desagrupado

PurchaseResult foi desagrupado para ser consistente em toda a nossa API:

Kotlin

    fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)
    

Java

    void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)
    

Correções de bugs

Developer Preview versão 1 (12-06-2017, Anúncio em inglês)

O Developer Preview foi lançado com o objetivo de simplificar o processo de desenvolvimento relacionado ao faturamento, permitindo que desenvolvedores concentrassem os esforços em implementar lógicas específicas para o app para Android, como a arquitetura do aplicativo e a estrutura de navegação.

A biblioteca inclui várias classes e recursos convenientes para você usar ao integrar seus apps para Android com a API Google Play Billing. A biblioteca também oferece uma camada de abstração sobre o serviço Linguagem de definição de interface do Android (AIDL), facilitando o trabalho dos desenvolvedores que precisam definir a interface entre o app e a API Google Play Billing.