1. Introdução
Neste codelab, você vai se concentrar na criação de um produto único, na integração do app com a Biblioteca Play Faturamento (PBL) e na análise dos motivos para a queda nas compras.
Público
Este codelab é destinado a desenvolvedores de apps Android que usam a Biblioteca Play Faturamento (PBL, na sigla em inglês) ou querem usá-la para monetizar produtos únicos.
O que você vai aprender…
- Como criar produtos únicos no Google Play Console.
- Como integrar seu app com a PBL.
- Como processar compras de produtos únicos consumíveis e não consumíveis na PBL.
- Como analisar desistências de compra.
O que é necessário…
- Acesso ao Google Play Console com uma conta de desenvolvedor. Se você não tiver uma conta de desenvolvedor, crie uma.
- Um app de exemplo para este codelab, que pode ser baixado do GitHub.
- Android Studio.
2. Criar o app de amostra
O app de exemplo foi projetado para ser um app Android totalmente funcional com o código-fonte completo que mostra os seguintes aspectos:
- Integrar o app com o PBL
- Buscar produtos únicos
- Iniciar fluxos de compra para produtos únicos
- Cenários de compra que levam às seguintes respostas de faturamento:
BILLING_UNAVAILABLE
USER_CANCELLED
OK
ITEM_ALREADY_OWNED
O vídeo de demonstração a seguir mostra como o app de exemplo vai aparecer e se comportar depois de implantado e executado.
Pré-requisitos
Antes de criar e implantar o app de exemplo, faça o seguinte:
- Crie uma conta de desenvolvedor do Google Play Console. Se você já tiver uma conta de desenvolvedor, pule esta etapa.
- Crie um app no Play Console. Ao criar um app, você pode especificar qualquer nome para o app de exemplo.
- Instale o Android Studio.
Criar
O objetivo desta etapa de build é gerar um arquivo de Android App Bundle assinado do app de exemplo.
Para gerar o pacote de apps Android, siga estas etapas:
- Faça o download do app de exemplo no GitHub.
- Crie o app de exemplo. Antes de criar, mude o nome do pacote do app de exemplo e crie. Se você tiver pacotes de outros apps no Play Console, verifique se o nome do pacote fornecido para o app de exemplo é exclusivo.
Observação: a criação do app de exemplo gera apenas um arquivo APK que pode ser usado para testes locais. No entanto, executar o app não busca produtos e preços porque eles não foram configurados no Play Console, o que você fará mais adiante neste codelab. - Gere um Android App Bundle assinado.
A próxima etapa é fazer upload do pacote de apps Android para o Google Play Console.
3. Criar um produto único no Play Console
Para criar produtos únicos no Google Play Console, você precisa ter um app no console. Crie um app no Play Console e faça upload do pacote de app assinado criado anteriormente.
Criar um app
Para criar um app:
- Faça login no Google Play Console usando sua conta de desenvolvedor.
- Clique em Criar app. A página Criar app será aberta.
- Insira um nome de app, selecione o idioma padrão e outros detalhes relacionados ao app.
- Clique em Criar app. Isso cria um app no Google Play Console.
Agora você pode fazer upload do pacote de app assinado do app de exemplo.
Fazer upload do pacote de apps assinado
- Faça upload do pacote de app assinado para a faixa de teste interno do Google Play Console. Só depois do upload é possível configurar os recursos relacionados à monetização no Play Console.
- Clique em Testar e lançar > Teste > Versão interna > Criar versão.
- Insira um nome de versão e faça upload do arquivo do pacote de apps assinado.
- Clique em Próxima e em Salvar e publicar.
Agora você pode criar seus produtos únicos.
Criar um produto de aquisição única
Para criar um produto único:
- No Google Play Console, no menu de navegação à esquerda, acesse Monetizar com o Google Play > Produtos > Produtos únicos.
- Clique em Criar um produto único.
- Insira os seguintes detalhes do produto:
- ID do produto:insira um ID exclusivo. Insira
one_time_product_01
. - (Opcional) Tags:adicione tags relevantes.
- Nome:insira um nome para o produto. Por exemplo,
Product name
. - Descrição:insira uma descrição do produto. Por exemplo,
Product description
. - (Opcional) Adicione uma imagem de ícone:faça upload de um ícone que represente seu produto.
- ID do produto:insira um ID exclusivo. Insira
- Clique em Próxima.
- Adicione uma opção de compra e configure a disponibilidade regional dela. Um produto único precisa de pelo menos uma opção de compra, que define como o direito de acesso é concedido, o preço e a disponibilidade regional. Para este codelab, vamos adicionar a opção padrão Comprar para o produto.Na seção Opção de compra, insira os seguintes detalhes:
- ID da opção de compra:insira um ID de opção de compra. Por exemplo,
buy
. - Tipo de compra:selecione Comprar.
- (Opcional) Tags:adicione tags específicas para essa opção de compra.
- (Opcional) Clique em Opções avançadas para configurar as opções avançadas. Para os fins deste codelab, ignore a configuração das opções avançadas.
- ID da opção de compra:insira um ID de opção de compra. Por exemplo,
- Na seção Disponibilidade e preços, clique em Definir preços > Editar preços em massa.
- Selecione a opção País / região. Isso seleciona todas as regiões.
- Clique em Continuar. Uma caixa de diálogo será aberta para inserir um preço. Digite 10 USD e clique em Aplicar.
- Clique em Salvar e depois em Ativar. Isso cria e ativa a opção de compra.
Para os fins deste codelab, crie mais três produtos únicos com os seguintes IDs:
- consumable_product_01
- consumable_product_02
- consumable_product_03
O app de exemplo está configurado para usar esses IDs de produto. Você pode fornecer IDs de produtos diferentes. Nesse caso, é necessário modificar o app de exemplo para usar o ID de produto fornecido.
Abra o app de exemplo no Google Play Console e acesse Monetizar com o Google Play > Produtos > Produtos únicos. Em seguida, clique em Criar um produto único e repita as etapas de 3 a 9.
Vídeo sobre a criação de produtos únicos
O vídeo de exemplo a seguir mostra as etapas de criação única de produtos descritas anteriormente.
4. Integrar com o PBL
Agora, vamos ver como integrar seu app à Biblioteca Play Faturamento (PBL). Esta seção descreve as etapas de alto nível para integração e fornece um snippet de código para cada uma delas. Use esses snippets como orientação para implementar sua integração real.
Para integrar seu app ao PBL, siga estas etapas:
- Adicione a dependência da Biblioteca Google Play Faturamento ao app de exemplo.
dependencies { val billing_version = "8.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }
- Inicialize o BillingClient. O BillingClient é o SDK do cliente que reside no seu app e se comunica com a Biblioteca Google Play Faturamento. O snippet de código a seguir mostra como inicializar o cliente de faturamento.
protected BillingClient createBillingClient() { return BillingClient.newBuilder(activity) .setListener(purchasesUpdatedListener) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) .enableAutoServiceReconnection() .build(); }
- Conecte-se ao Google Play.O snippet de código a seguir mostra como fazer isso.
public void startBillingConnection(ImmutableList<Product> productList) { Log.i(TAG, "Product list sent: " + productList); Log.i(TAG, "Starting connection"); billingClient.startConnection( new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Query product details to get the product details list. queryProductDetails(productList); } else { // BillingClient.enableAutoServiceReconnection() will retry the connection on // transient errors automatically. // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE, // DEVELOPER_ERROR). Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage()); Log.e(TAG, "Billing response code: " + billingResult.getResponseCode()); } } @Override public void onBillingServiceDisconnected() { Log.e(TAG, "Billing Service connection lost."); } }); }
- Extraia os detalhes do produto único.Depois de integrar o app ao PBL, você precisa extrair os detalhes do produto único para o app. O snippet de código a seguir mostra como fazer isso.
Ao buscarprivate void queryProductDetails(ImmutableList<Product> productList) { Log.i(TAG, "Querying products for: " + productList); QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().setProductList(productList).build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) { // check billingResult Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode()); // process returned productDetailsList Log.i( TAG, "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList()); setupProductDetailsMap(productDetailsResponse.getProductDetailsList()); billingServiceClientListener.onProductDetailsFetched(productDetailsMap); } }); }
ProductDetails
, você recebe uma resposta semelhante a esta:{ "productId": "consumable_product_01", "type": "inapp", "title": "Shadow Coat (Yolo's Realm | Play Samples)", "name": "Shadow Coat", "description": "A sleek, obsidian coat for stealth and ambushes", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 1990000, "priceCurrencyCode": "USD", "formattedPrice": "$1.99", "offerIdToken": "<--offerIdToken-->", "purchaseOptionId": "buy", "offerTags": [] } ] }, { "productId": "consumable_product_02", "type": "inapp", "title": "Emperor Den (Yolo's Realm | Play Samples)", "name": "Emperor Den", "description": "A fair lair glowing with molten rock and embers", "skuDetailsToken": "<---skuDetailsToken--->", "oneTimePurchaseOfferDetails": {}, "oneTimePurchaseOfferDetailsList": [ { "priceAmountMicros": 2990000, "priceCurrencyCode": "USD", "formattedPrice": "$2.99", "offerIdToken": "<--offerIdToken-->", "purchaseOptionId": "buy", "offerTags": [] } ] }
- Inicie o fluxo de faturamento.
public void launchBillingFlow(String productId) { ProductDetails productDetails = productDetailsMap.get(productId); if (productDetails == null) { Log.e( TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId); billingServiceClientListener.onBillingResponse( BillingResponseCode.ITEM_UNAVAILABLE, BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build()); return; } ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder().setProductDetails(productDetails).build()); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); billingClient.launchBillingFlow(activity, billingFlowParams); }
- Detectar e processar compras. Nesta etapa, você precisa:
- Verificar a compra
- Conceder direito ao usuário
- Notificar o usuário
- Notificar o Google sobre o processo de compra
private void handlePurchase(Purchase purchase) { // Step 1: Send the purchase to your secure backend to verify the purchase following // https://developer.android.com/google/play/billing/security#verify // Step 2: Update your entitlement storage with the purchase. If purchase is // in PENDING state then ensure the entitlement is marked as pending and the // user does not receive benefits yet. It is recommended that this step is // done on your secure backend and can combine in the API call to your // backend in step 1. // Step 3: Notify the user using appropriate messaging. if (purchase.getPurchaseState() == PurchaseState.PURCHASED) { for (String product : purchase.getProducts()) { Log.d(TAG, product + " purchased successfully! "); } } // Step 4: Notify Google the purchase was processed. // For one-time products, acknowledge the purchase. // This sample app (client-only) uses billingClient.acknowledgePurchase(). // For consumable one-time products, consume the purchase // This sample app (client-only) uses billingClient.consumeAsync() // If you have a secure backend, you must acknowledge purchases on your server using the // server-side API. // See https://developer.android.com/google/play/billing/security#acknowledge if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) { if (shouldConsume(purchase)) { ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); billingClient.consumeAsync(consumeParams, consumeResponseListener); } else { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase( acknowledgePurchaseParams, acknowledgePurchaseResponseListener); } } }
5. Analisar desistências de compra
Até agora, no codelab, as respostas do Play Faturamento se concentraram em cenários limitados, como USER_CANCELLED, BILLING_UNAVAILABLE, OK e ITEM_ALREADY_OWNED. No entanto, o Play Faturamento pode retornar 13 códigos de resposta diferentes, que podem ser acionados por vários fatores do mundo real.
Esta seção detalha as causas das respostas de erro USER_CANCELLED
e BILLING_UNAVAILABLE
e sugere possíveis ações corretivas que podem ser implementadas.
Código de erro de resposta USER_CANCELED
Esse código de resposta indica que o usuário abandonou a interface do fluxo de compra antes de concluir a compra.
Causas prováveis | Quais ações você pode realizar? |
|
|
Código de erro da resposta BILLING_UNAVAILABLE
Esse código de resposta significa que não foi possível concluir a compra devido a um problema com o provedor de pagamento do usuário ou a forma de pagamento escolhida. Por exemplo, o cartão de crédito do usuário expirou ou ele está em um país sem suporte. Esse código não indica um erro com o próprio sistema de faturamento do Google Play.
Causas prováveis | Quais ações você pode realizar? |
|
|
Estratégias de repetição para códigos de erro de resposta
As estratégias de nova tentativa eficazes para erros recuperáveis da Biblioteca Play Faturamento (PBL) variam de acordo com o contexto, como interações do usuário na sessão (durante uma compra) em vez de operações em segundo plano (como consultas de compras na retomada do app). É importante implementar essas estratégias porque alguns valores de BillingResponseCode
significam problemas temporários que podem ser resolvidos com novas tentativas, enquanto outros são permanentes e não exigem novas tentativas.
Para erros encontrados quando o usuário está em sessão, é recomendável usar uma estratégia de nova tentativa simples com um número máximo de tentativas definido para minimizar a interrupção da experiência do usuário. Por outro lado, para operações em segundo plano, como confirmação de novas compras, que não exigem execução imediata, a espera exponencial é a abordagem recomendada.
Para informações detalhadas sobre códigos de resposta específicos e as estratégias de nova tentativa recomendadas correspondentes, consulte Processar códigos de resposta de BillingResult.
6. Próximas etapas
- Saiba como maximizar a integração do Play Faturamento.
- Não se esqueça de seguir as práticas recomendadas para verificar e processar compras no seu back-end seguro assim que os usuários começarem a comprar esses produtos.
Documentos de referência
7. Parabéns!
Parabéns! Você navegou com sucesso pelo Google Play Console para criar um novo produto único, testar códigos de resposta de faturamento e analisar as desistências de compra.
Pesquisa
Seu feedback sobre este codelab é muito importante. Reserve alguns minutos para responder à nossa pesquisa.