Este documento detalha a integração dos seus produtos únicos (OTPs, na sigla em inglês) com a Biblioteca Play Faturamento. Ele também 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 etapas de migração.
Consultar os detalhes do produto
Se você configurou várias ofertas ou opções de compra para seu produto
único, o objeto ProductDetails
retornado pelo
método queryProductDetailsAsync()
pode ter mais de uma opção de compra
e/ou aluguel disponível por produto único. Para receber a lista de todas as ofertas qualificadas para cada objeto ProductDetails
, use o método getOneTimePurchaseOfferDetailsList()
. Somente ofertas e opções de compra
para as quais o usuário está qualificado serão retornadas como parte dessa lista. O 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
. Defina o token da 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 correto, que pode ser obtido com o método
oneTimePurchaseOfferDetails.getOfferToken()
.
Opções de compra e ofertas
Com uma opção de compra, você define como o direito é concedido a um usuário, o preço dele 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 seu produto.
O Google Play é compatível com as seguintes opções de compra para produtos de aquisição única:
- Comprar 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 seu produto único.
O Google Play é compatível com as seguintes ofertas de compra para produtos de aquisição única:
- Oferta de compra na pré-venda (compatível apenas com a opção de compra)
- Oferta de desconto (compatível com as opções de compra e aluguel)
Comprar opção de compra
Uma opção de compra representa uma compra padrão e direta do produto único. Ele tem um campo opcional "legacyCompatible", que indica 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 são compatíveis com o novo modelo. Para compatibilidade com versões anteriores, pelo menos uma opção de compra precisa ser marcada como compatível com versões legadas.
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 com o PBL, consulte Integrar a opção de compra de aluguel 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. É possível especificar o período de locação e a expiração dele. Este documento descreve as etapas para integrar a opção de compra de aluguel à Biblioteca Play Faturamento (PBL, na sigla em inglês).
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). Ele pressupõe que você conhece as etapas iniciais de integração da PBL, como adicionar a dependência da PBL ao app, inicializar o BillingClient e conectar ao Google Play. Esta seção se concentra nos aspectos de integração da 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
Developer 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:
Extraia os metadados da opção de compra de aluguel usando o método
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()
.O exemplo a seguir mostra como receber os metadados de 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
. Defina o token da oferta correspondente à oferta selecionada pelo usuário ao criar o objetoBillingFlowParams
. Se um usuário se qualificar 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 correto, que pode ser obtido com o métodooneTimePurchaseOfferDetails.getOfferToken()
.
Oferta de compra na pré-venda
Com a pré-venda, é possível configurar produtos únicos para serem comprados antes do lançamento. Quando um usuário faz uma compra na pré-venda, ele concorda em pagar pelo item quando o produto for lançado, a menos que cancele a compra antes da data de lançamento. Na data de lançamento, o comprador recebe a cobrança, e o Google Play envia uma notificação por e-mail informando que o item foi lançado.
Este documento descreve as etapas para integrar a oferta de compra em pré-venda à Biblioteca Play Faturamento (PBL).
Integrar a oferta de compra na pré-venda com o PBL
Esta seção descreve como integrar a oferta de pré-venda à Biblioteca Play Faturamento (PBL, na sigla em inglês). Ele pressupõe que você conhece as etapas iniciais de integração da PBL, como adicionar a dependência da PBL ao app, inicializar o BillingClient e conectar ao Google Play. Esta seção se concentra nos aspectos da integração do PBL que são específicos da oferta de compra na pré-venda.
Iniciar um fluxo de compra para uma oferta de compra na pré-venda
Para iniciar um fluxo de compra de uma oferta de pré-venda, siga estas etapas:
Extraia os metadados da oferta de pré-venda usando o método
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
. O exemplo a seguir mostra como receber os metadados da oferta de pré-venda: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
. Defina o token da oferta correspondente à opção selecionada pelo usuário ao criar o objetoBillingFlowParams
. Se um usuário se qualificar para a oferta de pré-venda, 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 correto, que pode ser obtido com o métodooneTimePurchaseOfferDetails.getOfferToken()
.
Oferta de desconto
Nesta seção, descrevemos como configurar ofertas de desconto para seus produtos únicos.
Há quatro parâmetros diferentes que podem ser configurados em uma oferta de desconto único para um produto:
Preço da oferta com desconto: especifica detalhes sobre o desconto percentual ou o preço absoluto do preço original.
Qualificação por país ou região: 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.
Período limitado (opcional): especifica o período em que a oferta está disponível. Fora desse período, a oferta não pode ser comprada.
Recuperar informações de preços de ofertas com desconto
Para uma oferta com desconto, você pode recuperar a porcentagem ou o desconto absoluto oferecido.
Exemplo 1: recuperar o desconto percentual de uma oferta com desconto
A amostra a seguir mostra como receber o preço total original da oferta com desconto e a porcentagem de desconto. As informações de desconto percentual só são retornadas 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: recuperar o desconto absoluto de uma oferta com desconto
O exemplo a seguir mostra como extrair o preço total original da oferta com desconto e o desconto absoluto em micros. O desconto absoluto em micros só é retornado para ofertas com desconto. É preciso especificar o desconto absoluto ou percentual 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 o período válido de uma oferta
Use o método OneTimePurchaseOfferDetails.getValidTimeWindow()
para receber o período válido de uma oferta. Esse objeto contém o início e o fim do período em milissegundos.
O exemplo a seguir mostra como receber o período válido 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 somente nesse nível. Confira um exemplo:
- Os protetores de tela avançados têm duas ofertas para o produto: opção de compra
e protetor de tela com desconto.
- O protetor de tela da opção de compra não tem uma quantidade limitada configurada.
- O protetor de tela com desconto tem a quantidade máxima permitida no nível da oferta definida como 3.
- O produto de proteção de tela não tem uma quantidade máxima permitida no nível do produto. Portanto, 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 recuperar as ofertas disponíveis, o LimitedQuantityInfo do protetor de tela da opção de compra é nulo, e o valor da quantidade restante do protetor de tela com 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 número máximo de resgates de uma oferta, ela não é
retornada pelo método getOneTimePurchaseOfferDetailsList()
.
Calcular o limite de resgate
O exemplo a seguir mostra como receber as informações de quantidade limitada de uma determinada oferta de desconto. Você pode receber 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ó é compatível no nível da oferta.
O Google Play calcula a quantidade restante subtraindo a quantidade de propriedade do usuário da quantidade máxima permitida que você configurou. Ao contar a quantidade de itens de propriedade do usuário, o Google Play considera compras consumidas ou pendentes. Compras canceladas, reembolsadas ou estornadas não contam para a quantidade de itens de propriedade do usuário. Exemplo:
Os protetores de tela premium 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, vai ocorrer um erro, e o
PurchasesUpdatedListener
vai receber um código de resposta ITEM_UNAVAILABLE.O usuário pede e recebe um reembolso da proteção de tela com desconto comprada originalmente. O usuário tenta comprar um dos protetores de tela com desconto, e a compra é concluída.
Qualificação por país e região
Você pode escolher os países ou regiões em que a oferta ou o desconto da opção de compra
vão estar disponíveis para os usuários. O Google Play vai avaliar a qualificação do usuário com base no país do Play. Quando você configura a disponibilidade regional de uma oferta, ela
só é retornada como parte de getOneTimePurchaseOfferDetailsList()
se o
usuário estiver em um país ou região segmentada. 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 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
Você pode definir tags de oferta para produtos, opções de compra ou ofertas de desconto. As ofertas de desconto herdam as tags da oferta de opção de compra. Da mesma forma, se as tags de oferta forem especificadas no nível do produto, tanto a opção de compra quanto as ofertas de desconto vão herdar as tags de oferta do produto.
Por exemplo, o Super screensavers tem duas ofertas para o produto de proteção de tela: uma opção de compra e uma opção com desconto.
- O protetor de tela Super tem a tag de oferta de produto
SSProductTag
. - A proteção de tela da opção de compra tem a tag de oferta
SSPurchaseOptionTag
. - O protetor de tela com 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
.