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