Android Shopping - Play Billing Library

imagem

E como ainda não existe um artigo sobre Habré sobre isso? Não importa, é necessário corrigi-lo.

Existem duas maneiras de adicionar compras no aplicativo ao seu aplicativo Android - antigas e novas. Até 2017, todos usavam a biblioteca do anjlab, mas desde junho de 2017 a situação mudou, o Google lançou sua própria biblioteca para compras e assinaturas internas - Play Billing Library. Agora, este último é considerado o padrão.

A Biblioteca de cobrança do Google Play é muito simples.

Conecte a dependência.

implementation 'com.android.billingclient:billing:1.2' 

Adicione permissão no manifesto.

 <uses-permission android:name="com.android.vending.BILLING"/> 

Crie uma instância BillingClient e inicie a conexão.

 private BillingClient mBillingClient; ... mBillingClient = BillingClient.newBuilder(this).setListener(new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       } } }).build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         } } @Override public void onBillingServiceDisconnected() { //    -    } }); 

Chegamos ao método onPurchasesUpdated () quando a compra é feita, no método onBillingSetupFinished () , você pode solicitar informações sobre mercadorias e compras.

Solicite informações do produto. Coloque querySkuDetails () em onBillingSetupFinished () .

 private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private String mSkuId = "sku_id_1"; ... @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   } } ... private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); List<String> skuList = new ArrayList<>(); skuList.add(mSkuId); skuDetailsParamsBuilder.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { if (responseCode == 0) { for (SkuDetails skuDetails : skuDetailsList) { mSkuDetailsMap.put(skuDetails.getSku(), skuDetails); } } } }); } 

No código, você pode perceber o conceito de SKU, o que é? SKU - da unidade de manutenção de estoque em inglês (identificador de item de mercadoria).

Agora, no mSkuDetailsMap , temos todas as informações sobre os produtos (nome, descrição, preço) registrados no Play Console deste aplicativo (mais sobre isso posteriormente). Preste atenção a esta linha skuList.add (mSkuId); , aqui adicionamos o ID do produto no Play Console e liste aqui todos os produtos com os quais você deseja interagir. Temos um produto - sku_id_1.

Tudo está pronto para atender a solicitação de compra. Passamos o ID do produto. Execute esse método, por exemplo, clicando no botão

 public void launchBilling(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); mBillingClient.launchBillingFlow(this, billingFlowParams); } 

Agora, executando este método, você verá esta caixa de diálogo (aproximadamente fotos da Internet).

imagem

Agora, se o usuário comprar os produtos, eles precisam fornecê-lo. Adicione o método payComplete () e execute ações nele que fornecem acesso ao produto adquirido. Por exemplo, se um usuário comprou um anúncio, desconecte-o, faça esse método para que o anúncio não apareça mais.

 ... @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       payComplete(); } } ... 

Está tudo bem, mas se o usuário reiniciar o aplicativo, nosso programa não saberá nada sobre compras. É necessário solicitar informações sobre eles. Faça isso em onBillingSetupFinished () .

 @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   List<Purchase> purchasesList = queryPurchases(); //   //   ,    for (int i = 0; i < purchasesList.size(); i++) { String purchaseId = purchasesList.get(i).getSku(); if(TextUtils.equals(mSkuId, purchaseId)) { payComplete(); } } } } ... private List<Purchase> queryPurchases() { Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); return purchasesResult.getPurchasesList(); } 

Em ordersList, obtém uma lista de todas as compras feitas pelo usuário.

Fazemos uma verificação: se as mercadorias forem compradas, execute payComplete () .

Feito. Resta publicar este aplicativo no Play Console e adicionar produtos. Como adicionar um produto: Descrição da página do aplicativo > Conteúdo à venda > Criar conteúdo limitado .

Nota 1 : você não poderá adicionar mercadorias até fazer o upload da compilação do aplicativo no Play Console.

Nota 2 : para ver a caixa de diálogo de compra, você precisa fazer o upload da versão para o Play Console, adicionar o produto e aguardar um pouco (~ 30 minutos - 1 hora - 3 horas) até que o produto seja atualizado, somente depois que uma caixa de diálogo aparecer e você poderá fará uma compra.

Nota 3 : Corrija o erro dos parâmetros de entrada. O SKU não pode ser nulo - o produto no Play Console ainda não foi atualizado. Aguarde.

Nota 4 : você pode encontrar o erro Erro "Sua transação não pode ser concluída" , nos logs como código de resposta 6, enquanto você testará. Por que razões isso acontece comigo não é exatamente conhecido, mas, de acordo com minhas observações, isso ocorre após frequentes manipulações na compra e devolução de mercadorias. Para corrigir isso, acesse o menu do cartão bancário e transfira seu cartão. Como evitar isso? Adicione sua conta ao Play Console como testador e compre apenas de um cartão de teste.

Demo no github

Compre-me café

(A propósito, o sistema de donets funciona no Habr pelo botão abaixo do artigo - aprox. Moderador).

Source: https://habr.com/ru/post/pt444072/


All Articles