【Google】アプリ内課金の1回限りの購入ライフサイクル
下記で Google のアプリ内課金について紹介しました。

購入レシートを元に状態把握するのは昔から変わりませんが、以下のようなイベント発生時に API やリアルタイムデベロッパー通知(以降、RTDN)を使ってハンドリングする必要があります。
- 購入完了
- キャンセル
- 払い戻し
また、購入処理を Android アプリで完結するのではなく、バックエンドで購入レシートの整合性を確認したり、GooglePlay の API で状態をチェックするとセキュリティ的にも安心ですね。
ここでは、「1回限りの購入」のライフサイクルについて紹介します。
1回限りの購入のライフサイクル
「1回限りの購入」は、定期購入(サブスクリプション)商品と比較してライフサイクルはシンプルですが、バックエンドで適切に処理すべきステータスと遷移イベントが存在します。
新規の1回限りの購入商品
ユーザーが購入フローを完了した後、アプリは下記の方法で購入情報を取得できます。
- GooglePlay Console で RTDN を設定し、「サブスクリプションと使い切り商品のすべての通知を取得する」を有効にする
PurchasesUpdatedListener
インターフェースを実装して購入の更新を自動的に受け取るBillingClient.queryPurchasesAsync()
メソッドを呼び出す
新しい購入情報を受け取ったら、Android アプリの getPurchaseState
メソッド、または GooglePlay Developer API の purchases.products.get
を使用して購入の支払い状態を確認します。
リアルタイムデベロッパー通知(RTDN)
1 回限りの購入商品の RTDN は、GooglePlay Concole で有効化していない限り送信されません。
ユーザーが 1 回限りの購入商品を購入またはキャンセルした場合、GooglePlay は OneTimeProductNotification
メッセージを送信します。
バックエンドの購入ステータスを更新するには、OneTimeProductNotification
オブジェクトに含まれる購入トークンを使用して purchases.products.get
メソッドを呼び出します。
このメソッドは、購入トークンに基づいて最新の購入状態と消費状態を提供します。
トランザクション関連の RTDN はセキュアなバックエンドで処理する必要があります。
バックエンドでの使い切り商品の購入処理
新規の使い切り商品の購入は、`ONE_TIME_PRODUCT_PURCHASED` RTDN、`PurchasesUpdatedListener`、またはアプリの onResume()
メソッドで手動取得のいずれの方法で検出された場合でも、処理する必要があります。
セキュリティ上の理由から、購入処理はバックエンドで行うことを推奨します。
新規の使い切り商品の購入を処理する手順は以下の通り。
purchases.products.get
エンドポイントに問い合わせて、使い切り商品の購入の最新ステータスを取得します- このメソッドを呼び出すには、アプリまたは
ONE_TIME_PRODUCT_PURCHASED
RTDN から取得したpurchaseToken
が必要です getPurchaseState()
を呼び出して、購入ステータスがPURCHASED
であることを確認します- 購入を承認または消費します
Play Billing Library にも購入の確認と消費のためのメソッドがありますが、より安全な実装のためにはバックエンドで処理することを推奨します。