1. Introdução
Neste codelab, você vai se concentrar na criação de um produto único, na integração do app à Biblioteca Play Faturamento (PBL, na sigla em inglês) e na análise dos motivos de desistência de compra.
Observação: para concluir este codelab, você precisa ter acesso ao recurso Várias opções de compra e ofertas para produtos únicos. Esse recurso está no Programa de acesso antecipado (PAA). Os produtos e recursos no PAA estão disponíveis "no estado em que se encontram" e podem ter suporte limitado. Para acessá-los pelo PAA, envie um pedido usando o formulário de interesse em produtos únicos no PAA (em inglês). No entanto, se você só quiser entender como analisar as desistências de compra usando os códigos de resposta do Play Faturamento, acesse diretamente a seção Analisar as desistências de compra deste codelab.
Público
Este codelab é destinado a desenvolvedores de apps Android que usam a Biblioteca Play Faturamento (PBL) ou querem usar a PBL para monetizar produtos únicos.
O que você vai aprender…
- Como criar produtos únicos no Google Play Console.
- Como integrar seu app à PBL.
- Como processar compras de produtos únicos consumíveis e não consumíveis na PBL.
- Como analisar as 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, precisará criar uma conta.
- Um app de exemplo para este codelab que pode ser baixado do GitHub.
- Android Studio.
2. Criar o app de exemplo
O app de exemplo foi projetado para ser um app Android totalmente funcional que tem o código-fonte completo, mostrando os seguintes aspectos:
- Integração do app com a PBL
- Buscar produtos únicos
- Iniciar fluxos de compra para os produtos únicos
- Cenários de compra que levam às seguintes respostas de faturamento:
BILLING_UNAVAILABLEUSER_CANCELLEDOKITEM_ALREADY_OWNED
O vídeo de demonstração a seguir mostra a aparência e o comportamento do app de exemplo 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 novo 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 pacote de apps Android assinado do app de exemplo.
Para gerar o pacote de apps Android, siga estas etapas:
- Fazer 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, a execução do app não busca produtos e preços porque os produtos não foram configurados no Play Console, o que você fará mais adiante neste codelab. - Gere um pacote de apps Android 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 Play Console. Crie um app no Play Console e faça upload do pacote de apps 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 apps assinado do app de exemplo.
Fazer upload do pacote de apps assinado
- Faça upload do pacote de apps assinado para a faixa de teste interno do console do Google Play. Somente depois de fazer o upload, você poderá configurar os recursos relacionados à monetização no Play Console.
- Clique em Teste e lançamento > 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 único
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 do produto. Insira
one_time_product_01. - (Opcional) Tags:adicione tags relevantes.
- Nome:insira um nome do produto. Por exemplo,
Product name. - Descrição:insira uma descrição do produto. Por exemplo,
Product description. - (Opcional) Adicionar uma imagem de ícone:faça upload de um ícone que represente seu produto.
- ID do produto:insira um ID exclusivo do produto. Insira
- Clique em Próxima.
- Adicione uma opção de compra e configure a disponibilidade regional. 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 a essa opção de compra.
- (Opcional) Clique em Opções avançadas para configurar as opções avançadas. Para fins deste codelab, você pode pular a configuração de 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. Isso abre uma caixa de diálogo para inserir um preço. Insira US$ 10 e clique em Aplicar.
- Clique em Salvar e em Ativar. Isso cria e ativa a opção de compra.
Para fins deste codelab, crie mais três produtos únicos com os seguintes IDs de produto:
- 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, será necessário modificar o app de exemplo para usar o ID do 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 de criação de produtos únicos
O vídeo de amostra a seguir mostra as etapas de criação de produtos únicos descritas anteriormente.
4. Integrar com a PBL
Agora, vamos mostrar 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 das etapas. Você pode usar esses snippets como orientação para implementar sua integração real.
Para integrar seu app à PBL, siga estas etapas:
- Adicione a dependência da Biblioteca 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 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 se conectar ao Google Play.
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."); } }); } - Busque os detalhes do produto único.Depois de integrar seu app à PBL, você precisa buscar os detalhes do produto único no app. O snippet de código a seguir mostra como buscar os detalhes do produto único no app.
A busca deprivate 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); } }); }ProductDetailsoferece 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); } - Detecte e processe compras. Como parte desta etapa, você precisa:
- Verificar a compra
- Conceder o direito de acesso 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 as desistências de compra
Até agora no codelab, as respostas do Play Faturamento se concentraram em cenários limitados, como respostas 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 de resposta BILLING_UNAVAILABLE
Esse código de resposta significa que a compra não pôde ser concluída 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 o usuário está em um país não aceito. Esse código não indica um erro no próprio sistema do Play Faturamento.
Causas prováveis | Quais ações você pode realizar? |
|
|
Estratégias de nova tentativa para códigos de erro de resposta
Estratégias eficazes de nova tentativa para erros recuperáveis da Biblioteca Play Faturamento (PBL) variam de acordo com o contexto, como interações do usuário na sessão (como durante uma compra) em comparação com operações em segundo plano (como consultar compras na retomada do app). É importante implementar essas estratégias porque alguns valores BillingResponseCode significam problemas temporários que podem ser resolvidos ao tentar novamente, enquanto outros são permanentes e não exigem novas tentativas.
Para erros encontrados quando o usuário está em sessão, é recomendável 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 o reconhecimento 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.
- Lembre-se de seguir as práticas recomendadas para verificar e processar compras no back-end seguro quando os usuários começarem a comprar esses produtos.
Documentos de referência
7. Parabéns!
Parabéns! Você navegou com sucesso no 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.