技術と趣味の亜空間

主にゲームプログラミングとその周辺に関する記事を不定期で上げていきます

【Android】課金ライブラリをAIDLからPBLへ移行させる

f:id:Goropocha:20210328235546p:plain

概要

本記事はGoogleから提供されていたAndroid インターフェース定義言語(以下、AIDL)を利用した課金処理を、Google Play Billing Library(以下、PBL)へ移行させたときの備忘録です。

developer.android.com

Goole App Storeには、AIDLを利用したアプリは2021年の11月1日からアップロードできなくなり、PBLバージョン3.0以上での実装が必須になります。
また、これから2年ごとにPBLのアップデートが定期的に必要になります。以下のリンクで更新がないか定期的にチェックすることをオススメします。

developer.android.com

◆執筆時
Android Studio バージョン: 4.0.1
Google Play Billing Library バージョン: 3.0.1

はじめに

これから解説するフローは公式ドキュメントにも記載されているので実はここを読めば大体わかります。

developer.android.com

……ですが説明は結構端折っている箇所もあり、もし課金処理の改修をやる羽目になった場合は理解するのが大変と思われるので、順を追って分かりやすく解説しようと思います。
前提として、AIDLを利用した課金処理のクラスが既に存在しているものとして進めていきますのでご了承ください。

詳細

PBLの導入とAIDLの駆逐

まずは課金ライブラリのPBLをインポートします。
build.gradle ファイルのdependencies欄に以下を記述します。

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

上では3.0.1ですが、バージョンは最新のものでOKです。
そして AndroidManifest.xml に記述されている以下の設定はPBLだと不要なので削除します。

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

次にAIDLに関するものを削除します。削除対象は以下の通り:

AIDLを利用しているコード箇所は削除 or コメントアウトします(差し替え前なのでコメントアウトがおすすめ)。
主に IabHelper クラスを呼び出している部分がそれに該当します。

PBLの初期化

PBLライブラリの初期化を行います。
まず、課金管理クラスは PurchasesUpdatedListenerimplements で実装します。

/**
 * 課金周り制御クラス
 */
public class InAppBillingManager implements PurchasesUpdatedListener

次にAIDLだと以下のような初期化部分を探します。

上記は以下に差し替えます。

課金アイテムデータを取得

次に初期化時にGoogleから課金アイテムの情報を受け取る部分を追加します。
上記コードだとTODOの部分で、差し替え前は iabHelper.queryInventoryAsync(queryInventoryFinishedListener); の箇所です。

SKU_IDSGoogle Play Storeで設定されている課金アイテムのIDです。
BillingClient.SkuType.INAPP は消費コンテンツであることを明示します。他には定期購読などがありますので必要に応じて取得してください。
次に購入処理を記述します。コードの「TODO:リストア確認」はその後対応します。

購入処理

購入処理を差し替えます。 以下のような記述の部分を探します。

この部分を次のように差し替えます。

これで購入画面の呼び出し部分はできました。
次に実際に購入が完了した時の処理を差し替えます。
AIDLだと購入完了時のコールバックは OnIabPurchaseFinishedListener で登録し、 onActivityResult(int requestCode, int resultCode, Intent data) で購入結果をActivityが受け取るための設定をしていましたが、PBLからは PurchasesUpdatedListeneronPurchasesUpdated() をオーバーライドするだけでOKです。
ここで重要なのが購入アイテムを承認するフローです。AIDLはこの機能がありませんので新しく実装します。
承認をしておかないと、3日後にユーザーに購入金額が全て払い戻しされて購入が取り消しになりますので必ず実装しましょう。
承認メソッドはクライアントで呼び出していますがサーバーでも呼び出しが可能で、できればサーバーの方が望ましいです。(今回は解説のためクライアントでやってます)

リストア確認

次に SkuDetailsResponseListener() メソッドでTODOだったリストア処理を対応していきます。
ユーザーが課金した際に、購入したアイテムが付与される前にアプリをタスクキルした場合は付与が保留となっているので、アプリ起動時に再度付与できないかチェックする部分を実装します。
billingClient.queryPurchases() で未消費のアイテムを取得できますのでこれを呼び、あとは購入時と同様に承認チェックからの consumeAsync() 呼び出しでOKです。
あとはこのメソッドを呼び出したいタイミングで呼べばリストア処理は完了となります。

終了時

終了する箇所は mHelper.dispose()billingClient.endConnection() に差し替えます。

終わりに

これで最低限必要な箇所は差し替えが完了しました。
あとはテストアカウントを使って実機で課金テストをやってみれば大丈夫です。
アップロードはアルファ版orベータ版でもOKですが、実際に見れるようになるまでに時間がかかるので、内部アプリ共有のアップロードページにアップロードすれば素早く確認できます。

support.google.com

今回一番重要だったのは購入アイテムの承認をすることですね。これだけは注意してください。

そのほかのメソッドとして、購入履歴が取れる billingClient.queryPurchaseHistoryAsync() というのもあったりします。
あとはBillingClientのAPIリファレンスを適宜見ていただければと。
課金処理以外の部分で改修が必要ならば、以下の記事が参考になるかもしれません。

goropocha.hatenablog.com goropocha.hatenablog.com

参考サイト