Integração de Compras no Aplicativo (Google Play Billing) no Android

O Google Play Billing permite que aplicativos Android vendam conteúdo digital e assinaturas. Abaixo está um guia prático que mostra como integrar a biblioteca versão 5.0.0 usando Java.

  1. Dependência no build.gradle

dependencies {
    def billing_version = "5.0.0"
    implementation "com.android.billingclient:billing:$billing_version"
}
  1. Criação do cliente e do ouvinte de atualização

private boolean clienteConectado = false;

private PurchasesUpdatedListener ouvinteCompra = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult resultado, List<Purchase> compras) {
        int codigo = resultado.getResponseCode();
        if (codigo == BillingClient.BillingResponseCode.OK) {
            if (compras != null) {
                for (Purchase compra : compras) {
                    processarCompra(compra);
                }
            }
        }
    }
};

private BillingClient clienteFaturamento = BillingClient.newBuilder(this)
        .setListener(ouvinteCompra)
        .enablePendingPurchases()
        .build();
  1. Conexão com o serviço e iniciação da compra

Quando o usuário clica em um item para comprar, o aplicativo deve primeiro conectar-se ao serviço Google Play Billing. Após a conexão bem‑sucedida, os detalhes do produto são consultados e a compra é iniciada.

private void conectarServico(String productId) {
    clienteFaturamento.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(BillingResult resultado) {
            if (resultado.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                clienteConectado = true;
                if (!TextUtils.isEmpty(productId)) {
                    consultarProduto(productId);
                }
            }
        }
        @Override
        public void onBillingServiceDisconnected() {
            clienteConectado = false;
            conectarServico(null); // tentar reconectar
        }
    });
}
private void consultarProduto(String productId) {
    List<QueryProductDetailsParams.Product> lista = new ArrayList<>();
    lista.add(QueryProductDetailsParams.Product.newBuilder()
            .setProductId(productId)
            .setProductType(BillingClient.ProductType.INAPP)
            .build());

    QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
            .setProductList(lista)
            .build();

    clienteFaturamento.queryProductDetailsAsync(params,
        new ProductDetailsResponseListener() {
            @Override
            public void onProductDetailsResponse(BillingResult resultado,
                                                 List<ProductDetails> detalhes) {
                if (resultado.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    if (detalhes != null && detalhes.size() > 0) {
                        iniciarFluxoCompra(detalhes.get(0));
                    }
                }
            }
        });
}
  1. Lançamento da compra (Billing Flow)

private void iniciarFluxoCompra(ProductDetails productDetails) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            List<BillingFlowParams.ProductDetailsParams> lista = new ArrayList<>();
            // Para produtos não‑assinatura, o offerToken pode ser omitido ou obtido se necessário
            String offerToken = productDetails.getSubscriptionOfferDetails() != null
                    ? productDetails.getSubscriptionOfferDetails().get(0).getOfferToken()
                    : null;
            BillingFlowParams.ProductDetailsParams.Builder paramBuilder =
                    BillingFlowParams.ProductDetailsParams.newBuilder()
                            .setProductDetails(productDetails);
            if (offerToken != null) {
                paramBuilder.setOfferToken(offerToken);
            }
            lista.add(paramBuilder.build());

            BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                    .setProductDetailsParamsList(lista)
                    .build();
            clienteFaturamento.launchBillingFlow(MainActivity.this, flowParams);
        }
    });
}
  1. Consumo do item (após compra confirmada)

Para produtos consumíveis (como moedas virtuais), é necessário consumir o item para que ele possa ser comprado novamente.

private void processarCompra(Purchase compra) {
    if (compra.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
        ConsumeParams params = ConsumeParams.newBuilder()
                .setPurchaseToken(compra.getPurchaseToken())
                .build();
        clienteFaturamento.consumeAsync(params, (resultado, token) -> {
            if (resultado.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                // Sucesso: liberar o conteúdo para o usuário
            }
        });
    }
}
  1. Restauração de compras (complemento)

Para evitar perda de itens não consumidos (por exemplo, após reinicialização do app), consutle as compras pendentes no ciclo de vida da Activity (ex.: onResume).

private void verificarComprasNaoConsumidas() {
    clienteFaturamento.queryPurchasesAsync(
        QueryPurchasesParams.newBuilder()
                .setProductType(BillingClient.ProductType.INAPP)
                .build(),
        (resultado, lista) -> {
            if (resultado.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                if (lista != null) {
                    for (Purchase compra : lista) {
                        processarCompra(compra);
                    }
                }
            }
        }
    );
}

Com esses passos você pode integrar as compras no aplicativo do Google Play em seu projeto Android. Lembre‑se de testar em uma faixa de teste interna antes de pulbicar.

Tags: Google Play Billing android In-app purchases java BillingClient

Publicado em 7-10 17:20