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.
- Dependência no build.gradle
dependencies {
def billing_version = "5.0.0"
implementation "com.android.billingclient:billing:$billing_version"
}
- 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();
- 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));
}
}
}
});
}
- 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);
}
});
}
- 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
}
});
}
}
- 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.