Novidades

Google Play Faturamento versão 2.0.0

A versão 2.0 da Biblioteca Google Play Faturamento está disponível.
⇒ As compras precisam ser confirmadas em 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, independente de onde o usuário compra o produto, você precisa confirmar todas as compras recebidas pela Biblioteca Google Play Faturamento 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 PURCHASED, 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 descontinuado 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().
⇒ O payload do desenvolvedor é compatível
A versão 2.0.0 da Biblioteca Google Play Faturamento adiciona suporte ao 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. É 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 dele 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:
getOriginalPriceAmountMicros() retorna o preço original não formatado do SKU antes do desconto
getOriginalPrice() retorna o preço original com formatação extra de unidade monetária
⇒ Transações pendentes
Com a versão 2.0.0 da Biblioteca Google Play Faturamento, você precisa oferecer suporte a 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 de Purchase, faça o seguinte:
↪ ao iniciar o app, chame BillingClient.queryPurchases() para recuperar a lista de produtos não consumidos associados ao usuário
↪ chame Purchase.getPurchaseState() em cada objeto Purchase retornado
↪ 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 PURCHASED, e não PENDING.
⇒ Mudanças no 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.
⇒ Mudanças no 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.
⇒ Mudanças nos 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ção de bugs

⇒ SkuDetails.getIntroductoryPriceAmountMicros()
Agora retorna um long em vez de uma String.

randergel

Oi, eu sou o randergel! Sou graduado em Análise e Desenvolvimento de Sistemas pela Unigran e pós-graduado em Engenharia de Software, Engenharia da Computação e Docência no Ensino Superior pela Anhanguera. Atualmente, estou desenvolvendo aplicações web e mobile na Google, Microsoft e Samsung.