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で機能します-約モデレーター)。

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


All Articles