Este documento detalha a integração dos seus produtos únicos (OTPs, na sigla em inglês) com a Biblioteca Play Faturamento. Ele explica como integrar várias opções de compra e ofertas relacionadas aos seus produtos únicos.
É possível configurar várias opções de compra e ofertas para seus produtos únicos. Por exemplo, você pode configurar uma opção de compra e uma oferta de pré-venda para o mesmo produto único.
Pré-requisitos
Para configurar várias ofertas de produtos únicos, use a
API queryProductDetailsAsync()
. A API querySkuDetailsAsync()
descontinuada não é compatível. Para informações sobre como usar
queryProductDetailsAsync()
e a versão de launchBillingFlow()
que usa ProductDetailsParams
como entrada, consulte as etapas de migração.
Consultar os detalhes do produto
Se você tiver configurado várias ofertas ou opções de compra para o produto
único, o objeto ProductDetails
retornado pelo
método queryProductDetailsAsync()
poderá ter mais de uma opção de compra
e/ou aluguel disponível por produto único. Para conferir a lista de todas as
ofertas qualificadas para cada objeto ProductDetails
, use o
método getOneTimePurchaseOfferDetailsList()
. Somente as ofertas e opções de compra
para as quais o usuário está qualificado serão retornadas como parte desta lista. Seu código
no método onProductDetailsResponse()
precisa processar as ofertas
retornadas.
Iniciar o fluxo de faturamento
Para iniciar um pedido de aprovação de compra no seu app, chame o método launchBillingFlow()
na linha de execução principal do app. Esse método usa uma referência a um objeto
BillingFlowParams
que contém o objeto ProductDetails
relevante recebido ao chamar queryProductDetailsAsync()
. Para criar um objeto
BillingFlowParams
, use a classe
BillingFlowParams.Builder
. É necessário definir o token de oferta correspondente à oferta
selecionada pelo usuário ao criar o objeto BillingFlowParams
.
O exemplo a seguir mostra como iniciar o fluxo de compra de um produto único com várias ofertas:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
O offerToken
pode ser encontrado como parte do OneTimePurchaseOfferDetails
. Ao
mostrar a oferta ao usuário, configure os parâmetros do fluxo de faturamento
com o token de oferta correto, que pode ser obtido no
método oneTimePurchaseOfferDetails.getOfferToken()
.
Opções de compra e ofertas
Com uma opção de compra, você pode definir como o direito é concedido a um usuário, o preço e em qual região o produto está disponível. Um único produto pode ter várias opções de compra, que podem representar onde e como você vende o produto.
O Google Play oferece as seguintes opções de compra para produtos de aquisição única:
- Opção de compra
- Opção de compra de aluguel
As ofertas se referem a um esquema de preços que você pode criar para seus produtos únicos. Por exemplo, você pode criar uma oferta de desconto para o produto único.
O Google Play oferece suporte às seguintes ofertas de compra para produtos de aquisição única:
- Oferta de compra na pré-venda (com suporte apenas para a opção de compra)
- Oferta de desconto (compatível com as opções de compra e aluguel)
Opção de compra
Uma opção de compra representa uma compra padrão e direta do produto único. Ele tem um campo legacyCompatible opcional, indicando se essa opção de compra vai estar disponível em fluxos mais antigos da Biblioteca Play Faturamento (versão 7 ou anterior) que não oferecem suporte ao novo modelo. Para compatibilidade com versões anteriores, pelo menos uma opção de compra precisa ser marcada como compatível com versões anteriores.
As etapas para integrar as opções de compra e locação com o PBL são as mesmas. Para entender como integrar a opção de compra de compra com o PBL, consulte Integrar a opção de compra de compra com o PBL.
Opção de compra de aluguel
A opção de compra de aluguel permite que os usuários acessem os produtos únicos por um período especificado. Você pode especificar o período de locação e a data de expiração. Este documento descreve as etapas para integrar a opção de compra de aluguel à Biblioteca Play Faturamento (PBL).
Integrar a opção de compra de aluguel com o PBL
Esta seção descreve como integrar a opção de compra de aluguel à Biblioteca Play Faturamento (PBL, na sigla em inglês). As etapas iniciais de integração do PBL são conhecidas, como adicionar a dependência do PBL ao app, inicializar o BillingClient e conectar ao Google Play. Esta seção se concentra nos aspectos de integração do PBL específicos da opção de compra de aluguel.
Para configurar produtos disponíveis para aluguel, use o novo
serviço monetization.onetimeproducts
da API Play Developer ou a interface
do Play Console. Para usar o serviço, chame a API REST diretamente ou
use a biblioteca de cliente Java.
Iniciar um fluxo de compra para a opção de locação
Para iniciar um fluxo de compra de uma oferta de aluguel, siga estas etapas:
Use o método
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()
para buscar os metadados da opção de compra de aluguel.O exemplo a seguir mostra como receber os metadados da compra de aluguel:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a rent purchase option. if (oneTimePurchaseOfferDetails.getRentalDetails() != null) { // process the returned RentalDetails OneTimePurchaseOfferDetails.RentalDetails rentalDetails = oneTimePurchaseOfferDetails.getRentalDetails(); // Get rental period in ISO 8601 format. String rentalPeriod = rentalDetails.getRentalPeriod(); // Get rental expiration period in ISO 8601 format, if present. if (rentalDetails.getRentalExpirationPeriod() != null) { String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod(); } // Get offer token String offerToken = oneTimePurchaseOfferDetails.getOfferToken(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
Inicie o fluxo de faturamento.
Para iniciar um pedido de aprovação de compra no seu app, chame o método
launchBillingFlow()
na linha de execução principal do app. Esse método usa uma referência a um objetoBillingFlowParams
que contém o objetoProductDetails
relevante recebido ao chamarqueryProductDetailsAsync()
. Para criar um objetoBillingFlowParams
, use a classeBillingFlowParams.Builder
. É necessário definir o token de oferta correspondente à oferta selecionada pelo usuário ao criar o objetoBillingFlowParams
. Se um usuário estiver qualificado para a opção de compra de aluguel, ele vai receber uma oferta com RentalDetails e offerId emqueryProductDetailsAsync()
.O exemplo a seguir mostra como iniciar o fluxo de faturamento:
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
O
offerToken
pode ser encontrado como parte doOneTimePurchaseOfferDetails
. Ao mostrar a oferta ao usuário, configure os parâmetros do fluxo de faturamento com o token de oferta correto, que pode ser obtido no métodooneTimePurchaseOfferDetails.getOfferToken()
.
Oferta de compra na pré-venda
Com a pré-venda, você pode configurar produtos únicos para serem comprados antes do lançamento do item. Quando um usuário faz a pré-venda do seu produto, ele concorda em pagar pelo item quando o produto for lançado, a menos que cancele a pré-venda antes da data de lançamento. Na data de lançamento, o comprador é cobrado, e o Google Play notifica por e-mail que o item foi lançado.
Este documento descreve as etapas para integrar a oferta de compra em pré-venda à Biblioteca Play Faturamento (PBL, na sigla em inglês).
Integrar a oferta de compra na pré-venda com o PBL
Esta seção descreve como integrar a oferta de pré-encomenda à Biblioteca Play Faturamento (PBL). As etapas iniciais de integração do PBL são conhecidas, como adicionar a dependência do PBL ao app, inicializar o BillingClient e conectar ao Google Play. Esta seção se concentra nos aspectos de integração do PBL específicos da oferta de compra na pré-venda.
Iniciar um fluxo de compra para uma oferta de pré-venda
Para iniciar um fluxo de compra de uma oferta de pré-venda, siga estas etapas:
Use o método
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
para buscar os metadados da oferta de pré-encomenda. O exemplo a seguir mostra como receber os metadados da oferta de pré-encomenda:Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a preorder offer. if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) { // process the returned PreorderDetails OneTimePurchaseOfferDetails.PreorderDetails preorderDetails = oneTimePurchaseOfferDetails.getPreorderDetails(); // Get preorder release time in millis. long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis(); // Get preorder presale end time in millis. long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis(); // Get offer ID String offerId = oneTimePurchaseOfferDetails.getOfferId(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
Inicie o fluxo de faturamento.
Para iniciar um pedido de aprovação de compra no seu app, chame o método
launchBillingFlow()
na linha de execução principal do app. Esse método usa uma referência a um objetoBillingFlowParams
que contém o objetoProductDetails
relevante recebido ao chamar queryProductDetailsAsync(). Para criar um objetoBillingFlowParams
, use oBillingFlowParams.Builder class
. É necessário definir o token de oferta correspondente à opção selecionada pelo usuário ao criar o objetoBillingFlowParams
. Se um usuário atender aos requisitos para a oferta de pré-encomenda, ele vai receber uma oferta com PreorderDetails e offerId no métodoqueryProductDetailsAsync()
.O exemplo a seguir mostra como iniciar o fluxo de faturamento:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
O
offerToken
pode ser encontrado como parte doOneTimePurchaseOfferDetails
. Ao mostrar a oferta ao usuário, configure os parâmetros do fluxo de faturamento com o token de oferta correto, que pode ser obtido no métodooneTimePurchaseOfferDetails.getOfferToken()
.
Oferta de desconto
Esta seção descreve como configurar ofertas de desconto para seus produtos únicos.
Há quatro parâmetros diferentes que podem ser configurados em uma oferta de desconto de produto única:
Preço da oferta com desconto: especifica detalhes sobre a porcentagem de desconto ou o preço absoluto em relação ao preço original.
Qualificação de países ou regiões: especifica a disponibilidade de ofertas de produtos únicos em um país ou região.
Limite de compra (opcional): permite determinar quantas vezes um usuário pode resgatar a mesma oferta. Se um usuário exceder o limite de compra, ele não poderá aproveitar a oferta.
Tempo limitado (opcional): especifica o período em que a oferta está disponível. Fora desse período, a oferta não está qualificada para compra.
Extrair informações de preço da oferta com desconto
Para uma oferta com desconto, você pode extrair a porcentagem de desconto ou o desconto absoluto oferecido.
Exemplo 1: extrair o desconto percentual da oferta com desconto
O exemplo a seguir mostra como receber o preço total original da oferta com desconto e a porcentagem de desconto. As informações de porcentagem de desconto são retornadas apenas para ofertas com desconto.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult){ // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { long discountedOfferPriceMicros = oneTimePurchaseOfferDetails.getPriceAmountMicros(); // process the returned fullPriceMicros and percentageDiscount. if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) { long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros(); } if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) { long percentageDiscount = oneTimePurchaseOfferDetails .getDiscountDisplayInfo() .getPercentageDiscount(); } // … } } } });
Exemplo 2: extrair o desconto absoluto da oferta com desconto
O exemplo a seguir mostra como conferir o preço total original da oferta com desconto e o desconto absoluto em micros. O desconto absoluto nas informações de micros é retornado apenas para ofertas com desconto. O desconto absoluto ou percentual precisa ser especificado para uma oferta de desconto.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { long discountedOfferPriceMicros = oneTimePurchaseOfferDetails.getPriceAmountMicros(); // process the returned fullPriceMicros and absolute DiscountAmountMicros. if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) { long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros(); } if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) { long discountAmountMicros = oneTimePurchaseOfferDetails .getDiscountDisplayInfo() .getDiscountAmount() .getDiscountAmountMicros(); } // … } } } });
Receber a janela de tempo válida de uma oferta
Você pode usar o método OneTimePurchaseOfferDetails.getValidTimeWindow()
para conferir a
janela de tempo válida de uma oferta. Esse objeto contém o início e o fim da janela de tempo em milissegundos.
O exemplo a seguir mostra como receber a janela de tempo válida de uma oferta:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) { // process the returned startTimeMillis and endTimeMillis. ValidTimeWindow validTimeWindow = oneTimePurchaseOfferDetails.getValidTimeWindow(); long startTimeMillis = validTimeWindow.getStartTimeMillis(); long endTimeMillis = validTimeWindow.getEndTimeMillis(); // … } } } } });
Quantidade limitada no nível da oferta de desconto
É possível especificar o limite máximo de quantidade no nível da oferta de desconto, que é aplicado apenas no nível da oferta. Confira um exemplo:
- O Super screensaver tem duas ofertas para o produto: tela de bloqueio de compra
e tela de bloqueio com desconto.
- O protetor de tela da opção de compra não tem uma quantidade limitada configurada.
- O protetor de tela de desconto tem a quantidade máxima permitida no nível da oferta definida como 3.
- O produto de protetor de tela não tem quantidade máxima permitida no nível do produto. Assim, os usuários podem comprar quantidades ilimitadas desse produto.
- O usuário tem um protetor de tela com desconto e planeja comprar outro com o mesmo desconto.
- Ao extrair as ofertas disponíveis, o LimitedQuantityInfo para o protetor de tela da opção de compra é nulo, e o valor da quantidade restante para o protetor de tela de desconto é 2.
O exemplo a seguir mostra como receber a quantidade limitada no nível da oferta de desconto:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) { // process the returned maximumQuantity and remainingQuantity. LimitedQuantityInfo limitedQuantityInfo = oneTimePurchaseOfferDetails.getLimitedQuantityInfo(); int maximumQuantity = limitedQuantityInfo.getMaximumQuantity(); int remainingQuantity = limitedQuantityInfo.getRemainingQuantity(); // … } } } } });
Quando os usuários usam o resgate de quantidade máxima de uma oferta, ela não é
retornada pelo método getOneTimePurchaseOfferDetailsList()
.
Calcular o limite de resgate
O exemplo a seguir mostra como receber informações de quantidade limitada em uma oferta de desconto específica. Você pode conferir a quantidade máxima permitida e a quantidade restante para o usuário atual. O recurso de quantidade limitada é aplicável às ofertas de produtos únicos consumíveis e não consumíveis. Esse recurso só é aceito no nível da oferta.
O Google Play calcula a quantidade restante subtraindo a quantidade do usuário da quantidade máxima permitida que você configurou. Ao contar a quantidade de propriedade do usuário, o Google Play considera compras consumidas ou pendentes. As compras canceladas, reembolsadas ou estornadas não são contabilizadas na quantidade de propriedade do usuário. Exemplo:
Os superprotetores de tela configuram uma oferta de desconto com a quantidade máxima permitida de um, para que os usuários possam comprar até um protetor de tela com desconto.
O usuário compra um dos protetores de tela com desconto. Se o usuário tentar comprar o segundo protetor de tela com desconto, ele vai gerar um erro e o
PurchasesUpdatedListener
vai receber um código de resposta ITEM_UNAVAILABLE.O usuário pede um reembolso do protetor de tela com desconto originalmente comprado e recebe o reembolso. O usuário tenta comprar um dos protetores de tela com desconto, e a compra é bem-sucedida.
Qualificação por país e região
Você pode escolher os países ou regiões em que a oferta de opção de compra ou de desconto
vai estar disponível para os usuários. O Google Play vai avaliar a qualificação do usuário
com base no país do Google Play. Quando você configura a disponibilidade regional para uma oferta, ela
só será retornada como parte de getOneTimePurchaseOfferDetailsList()
se o
usuário estiver em um país ou região de destino. Caso contrário, ela não fará parte da lista
de ofertas retornadas quando você chamar queryProductDetailsAsync()
.
Tags de oferta
O exemplo a seguir mostra como recuperar as tags de oferta associadas a uma oferta.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // process the returned offer tags. ImmutableList<String> offerTags = oneTimePurchaseOfferDetails.getOfferTagsList(); // … } } } });
Herança de tags de oferta
É possível definir tags de oferta para produtos, opções de compra ou ofertas de desconto. As ofertas de desconto herdam as tags da opção de compra. Da mesma forma, se as tags de oferta forem especificadas no nível do produto, a oferta de opção de compra e as ofertas de desconto herdarão as tags de oferta do produto.
Por exemplo, o Super screensavers tem duas ofertas para o produto protetor de tela: protetor de tela de opção de compra e protetor de tela de desconto.
- O protetor de tela super tem a tag de oferta de produto
SSProductTag
. - O protetor de tela da opção de compra tem a tag de oferta
SSPurchaseOptionTag
. - O protetor de tela de desconto tem a tag de oferta
SSDiscountOfferTag
.
Neste exemplo, o método oneTimePurchaseOfferDetails.getOfferTagsList()
para
a oferta de opção de compra retorna SSProductTag
e SSPurchaseOptionTag
. Para
a oferta de desconto, o método retorna SSProductTag
, SSPurchaseOptionTag
e SSDiscountOfferTag
.