1 回だけの購入商品の場合、ライフサイクルは定期購入商品よりもシンプルですが、それでもバックエンドで適切に処理する必要があるステータスと遷移イベントがいくつかあります。
1 回限りのアイテムの新規購入
ユーザーが請求フローを完了すると、アプリは次のいずれかの方法で新規購入に関する情報を確認できます。
Real-time developer notifications
をセットアップし、Get all notifications for subscriptions and one-time products
を有効にして購入ステータスに関する最新情報を受け取る。BillingClient
からPurchasesUpdatedListener
インターフェースを実装し、購入の最新情報を自動的に受信する。BillingClient.queryPurchasesAsync()
メソッドを呼び出します。
新規購入を受信したら、getPurchaseState
メソッドまたは purchases.products.get in Play Developer API
を使用して、新規購入の支払いステータスを確認します。
リアルタイム デベロッパー通知
ユーザーが 1 回限りのアイテムの購入または購入をキャンセルすると、Google Play から OneTimeProductNotification
メッセージが送信されます。バックエンドの購入ステータスを更新するには、OneTimeProductNotification
オブジェクトで提供される購入トークンを使用して purchases.products.get
メソッドを呼び出します。このメソッドで、購入トークンに基づく、最新の購入と消費のステータスを取得できます。
トランザクション関連の RTDN は安全なバックエンドで処理する必要があります。
完了した取引を処理する
ユーザーが 1 回限りのアイテムの購入を完了すると、Google Play はタイプ ONE_TIME_PRODUCT_PURCHASED
の OneTimeProductNotification
メッセージを送信します。この RTDN を受領後に、バックエンドで 1 回限りのアイテムの購入を処理するの説明に従って購入を処理します。
キャンセルされた取引を処理する
1 回限りのアイテムの購入がキャンセルされると、リアルタイム デベロッパー通知を受信するように構成されている場合、Google Play はタイプ ONE_TIME_PRODUCT_CANCELED
の OneTimeProductNotification
メッセージを送信します。たとえば、ユーザーが必要な期間内に支払いを完了しなかった場合や、デベロッパーまたはお客様のリクエストによって購入が取り消された場合などです。バックエンド サーバーがこの通知を受け取ったら、purchases.products.get
メソッドを呼び出して最新の購入ステータスを取得し、それに応じてユーザーの利用資格を含むバックエンドを更新します。
Purchased
ステータスの 1 回限りのアイテムの購入が払い戻しを受ける場合は、Voided Purchases API を介して通知されます。
バックエンドで 1 回限りのアイテムの購入を処理する
新規購入を ONE_TIME_PRODUCT_PURCHASED
RTDN 経由で検知した場合、PurchasesUpdatedListener
からアプリ内で認識した場合、アプリの onResume()
メソッドで購入を手動でフェッチした場合、いずれのケースでも、新規購入を処理する必要があります。セキュリティ強化のために、購入処理はバックエンドで処理することをおすすめします。
新規の 1 回だけの購入を処理する手順は次のとおりです。
purchases.products.get
エンドポイントをクエリして、1 回限りのアイテムの最新購入ステータスを取得します。購入でこのメソッドを呼び出すには、アプリまたはONE_TIME_PRODUCT_PURCHASED
RTDN のいずれかから、対応するpurchaseToken
が必要となります。getPurchaseState()
を呼び出して、購入ステータスがPURCHASED
であることを確認します。- 購入を確認します。
- ユーザーにコンテンツへのアクセスを許可します。購入に関連付けられたユーザー アカウントは、
purchases.products.get
のobfuscatedExternalAccountId
フィールドが購入時にsetObfuscatedAccountId()
を使用して設定されている場合、そちらから識別できます。- 非消費型アイテムの購入の場合は、
purchases.products.acknowledge
メソッドを呼び出して、コンテンツの配布を承認します。acknowledgementState
フィールドを確認して、その購入が以前に承認されていないことを確かめます。 - 消費型アイテムの場合は、
purchases.products.consume
メソッドを呼び出して、アイテムを消費済みとしてマークし、ユーザーがアイテムを消費した後で再度購入できるようにします。このメソッドは購入も承認します。
- 非消費型アイテムの購入の場合は、
Play Billing Library には、利用できる購入の承認と消費メソッドもあり、アプリからの購入を処理できますが、使用できるバックエンドがある場合は、さらに安全性の高い実装のために、バックエンドで処理することをおすすめします。