Androidショッピング-課金ライブラリを再生する

画像



そして、これについてはまだHabréに関する記事がないのはどうしてですか? 問題ではなく、修正する必要があります。



Androidアプリにアプリ内購入を追加するには、新旧の2つの方法があります。 2017年まで、誰もがanjlabのライブラリを使用していましたが、2017年6月から状況が変わり、Googleは内部購入とサブスクリプション用の独自のライブラリ、Play Billing Libraryをリリースしました。 現在、後者が標準と見なされています。



Play Billing Libraryは非常にシンプルです。



依存関係を接続します。



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





マニフェストに許可を追加します。



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





BillingClientインスタンスを作成し、接続を開始します。



 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() { //    -    } });
      
      





購入が行われるとonPurchasesUpdated()メソッドに入り、 onBillingSetupFinished()メソッドでは商品と購入に関する情報をリクエストできます。



製品情報をリクエストします。 querySkuDetails()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); } } } }); }
      
      





コードでは、SKUの概念に気付くかもしれませんが、それは何ですか? SKU-英語の在庫保管単位(商品アイテム識別子)から。



これでmSkuDetailsMapに、このアプリケーションのPlay Consoleに登録された製品に関するすべての情報(名前、説明、価格)があります(詳細は後ほど)。 この行に注意してくださいskuList.add(mSkuId); 、ここでPlay Consoleから製品IDを追加しました。ここに、やり取りしたいすべての製品をリストします。 1つの製品(sku_id_1)があります。



すべてが購入リクエストを満たす準備ができています。 製品IDを渡します。 たとえば、ボタンをクリックして、このメソッドを実行します。



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





これで、このメソッドを実行すると、このようなダイアログボックスが表示されます(インターネットからの写真)。



画像



さて、ユーザーが商品を購入した場合-彼らは彼を提供する必要があります。 payComplete()メソッドを追加し、購入した製品へのアクセスを提供するアクションを実行します。 たとえば、ユーザーが広告の切断を購入した場合、広告が表示されないようにこのメソッドを作成します。



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





すべて問題ありませんが、ユーザーがアプリケーションを再起動すると、プログラムは購入について何も知りません。 それらに関する情報を要求する必要があります。 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(); }
      
      





purchasesListでは、ユーザーが行ったすべての購入のリストを取得します。



チェックを行います:商品が購入された場合、 payComplete()を実行します。



できた Play Consoleでこのアプリケーションを公開し、製品を追加することは残っています。 製品を追加する方法: アプリケーションページの説明 > 販売コンテンツ > 限定コンテンツの作成



注1 :アプリケーションビルドをPlay Consoleにアップロードするまで、商品を追加することはできません。



注2 :購入ダイアログを表示するには、ビルドをPlayコンソールにアップロードし、製品を追加して、製品が更新されるまでしばらく(約30分-1時間-3時間)待つ必要があります。その後、ダイアログボックスが表示され、購入します。



注3入力パラメータのエラーを修正してください。 SKUをnullにすることはできません-Playコンソールの製品にはまだ更新する時間がありません。お待ちください。



注4 :テスト中に、ログに応答コード6としてエラーエラー "トランザクションを完了できません"が表示される場合があります。 どういう理由でこれが起こるかは正確にはわかっていませんが、私の観察によると、これは商品の購入と返品を頻繁に操作した後に起こります。 これを修正するには、銀行カードメニューに移動してカードを追加します。 これを避ける方法は? アカウントをテスターとしてPlay Consoleに追加し、テストカードからのみ購入します。



githubのデモ



コーヒーを買って



(ちなみに、ドネットのシステムは、記事の下のボタンによってHabrで機能します-約モデレーター)。



All Articles