復元機能

サブスクリプションの復元機能について説明します。

復元機能とは

復元機能とは、ゲームを再インストールした際や、新しいデバイスへ切り替えた際に、購入済みのサブスクリプションを再度利用できるようにする機能です。

ストアごとの復元対応要否

ストアごとの復元対応要否

ストア

復元対応

備考

App Store

必要

App Storeの審査ガイドラインにより、復元可能なアプリ内課金に対する復元機能をアプリケーションに実装する必要があります。
復元ボタンを実装しない場合、App Storeの審査でリジェクトされる可能性があります。
復元する際には、購入時と同じApple IDでログインしている必要があります。

Google Play

必要

再インストール時や新しいデバイスへ切り替えた際に自動的に復元処理が行われます。
復元する際には、購入時と同じGoogleアカウントでログインしている必要があります。

DMM GAMES

不要

復元機能は提供されていません

XGでの制限

復元

XGでは、復元する場合、ゲームアカウントのデータ連携やID連携などによる引き継ぎが必須です。

再インストール時に、購入時とは異なるゲームユーザー(XGユーザー)でゲームを開始した場合、新規にXGユーザーIDが発行されます。 購入時とは異なるXGユーザーIDとなるため、引き継ぎを行わない場合、過去に購入したサブスクリプションを復元できません。

再購入

サブスクリプションを解約して有効期限が切れた後の場合は復元ではなく再購入となります。 再購入の場合は、新規のゲームユーザー(XGユーザー)で再購入できます。

他社事例の確認

同様の制御仕様は他社事例で少なくとも4例確認されています。

復元時の処理

ゲーム端末がストアからサブスクリプションの購入情報を取得し、ゲームサーバーへ送信します。
ゲームサーバーはサブスクリプション購入検証APIをリクエストし、レスポンスの内容に応じて後続の処理を分岐します。

サブスクリプション購入検証APIの詳細は APIリファレンス を参照してください。

App Store

ユーザーの復元操作により、ゲーム端末がストアからトランザクションID(TransactionID)を取得しゲームサーバーへ送信します。
ゲームサーバーはサブスクリプション購入検証APIをリクエストし、レスポンスの statusevent で処理を判定します。

注釈

シーケンス図中の「購入済みサブスクリプションの取得」では、App Storeに対してトランザクションの復元を要求します。復元のたびに、購入時とは異なる新規のTransactionIDが発行されます。

Unity IAP v5では RestoreTransactions がこの処理に該当します。詳細は Apple platforms を参照してください。

サブスクリプション購入検証APIレスポンスによる分岐

status

processedReason

event

ゲームサーバーの処理

processed

by_web_order_line_item_id

purchase / renewal

サブスクリプションの購入ユーザーです。 復元時に発行されたTransactionIDに紐づくWebOrderLineItemIdで購入または継続の処理が完了しているため、引き続きサブスクリプションを利用可能です。
ただし有効期限が切れている場合があります。実際のサブスクリプションのステータスはゲームサーバーで管理しているサブスクリプションのステータスを元に判断してください。
ゲーム端末に結果を返却します。

processed

by_transaction_id

purchase / renewal

サブスクリプションの購入ユーザーです。 購入時・継続時に発行されたTransactionIDによる購入または継続の処理が完了しているため、引き続きサブスクリプションを利用可能です。
ただし有効期限が切れている場合があります。実際のサブスクリプションのステータスはゲームサーバーで管理しているサブスクリプションのステータスを元に判断してください。
ゲーム端末に結果を返却します。

unprocessed

-

purchase

サブスクリプションの購入がXGで未処理の状態です。サブスクリプション購入APIを呼び出して購入処理を行います。
購入処理の詳細は サブスクリプション購入シーケンス を参照してください。

unprocessed

-

renewal

サブスクリプションの継続がXGで未処理の状態です。サブスクリプション継続APIを呼び出して継続処理を行います。
継続処理の詳細は サブスクリプション更新処理シーケンス を参照してください。
復元の処理過程でサブスクリプション購入検証APIがHTTP 400 または HTTP 500 を返した場合はエラーコードに応じて処理します。
サブスクリプション購入検証APIで発生しうる復元に関するエラーコード

HTTPステータス

エラーコード

説明

400

subscription_transaction_id_used_by_other_user

購入時と異なるXGユーザーで処理済みのTransactionIDを指定した場合に発生します。復元を中止し、ゲーム端末にエラーを通知します。

400

subscription_web_order_line_item_id_used_by_other_user

サブスクリプション購入検証APIで、指定したTransactionIDに紐づくWebOrderLineItemIdが別のユーザーですでに利用されている場合に発生します。復元を中止し、ゲーム端末にエラーを通知します。

500

subscription_renewal_user_mismatch

継続時のTransactionIDについて、購入時と異なるXGユーザーでサブスクリプション購入検証APIまたはサブスクリプション継続APIを呼び出した場合に発生します(復元では購入検証APIのレスポンスとして返ることがあります)。ゲームアカウントのデータ連携・ID連携などによる引き継ぎにより、購入時のXGユーザーへ切り替えたうえで再試行してください。復元を中止し、ゲーム端末にエラーを通知します。

500

subscription_renewal_without_purchase

サブスクリプションの購入が確認できない状態で、継続時のTransactionIDを指定してサブスクリプション購入検証APIまたはサブスクリプション継続APIを呼び出した場合に発生します(復元では購入検証APIのレスポンスとして返ることがあります)。購入処理を完了させたうえで再試行してください。購入処理の詳細は サブスクリプション購入シーケンス を参照してください。復元を中止し、ゲーム端末にエラーを通知します。

上記以外のエラーコードについては エラーコード一覧表 を参照してください。

Google Play

再インストール時や新しいデバイスへの切り替え時に、ゲーム端末が自動的にストアから購入トークン(PurchaseToken)を取得しゲームサーバーへ送信します。
ゲームサーバーは購入トークン(PurchaseToken)をTransactionIDとしてサブスクリプション購入検証APIをリクエストし、レスポンスの status で処理を判定します。

注釈

シーケンス図中の「サブスクリプションの購入情報の問い合わせ」では、Google Playから加入中のサブスクリプション情報を取得します。PurchaseTokenは購入時に発行された値がそのまま返されます。

Unity IAP v5では FetchPurchases がこの処理に該当します。詳細は Google Play を参照してください。

サブスクリプション購入検証APIレスポンスによる分岐

status

ゲームサーバーの処理

processed

サブスクリプションの購入ユーザーです。サブスクリプションの購入または継続の処理が完了しているため、引き続きサブスクリプションを利用可能です。
実際のサブスクリプションの利用の可否はゲームサーバーで管理しているサブスクリプションのステータスを元に判断してください。

unprocessed

サブスクリプションの購入が未処理の状態です。サブスクリプション購入APIを呼び出して購入処理を行います。
購入処理の詳細は サブスクリプション購入シーケンス を参照してください。
復元の処理過程でサブスクリプション購入検証APIがHTTP 400 または HTTP 500 を返した場合はエラーコードに応じて処理します。
サブスクリプション購入検証APIで発生しうる復元に関するエラーコード

HTTPステータス

エラーコード

説明

400

subscription_transaction_id_used_by_other_user

別のユーザーで処理済みのPurchaseTokenを指定した場合に発生します。

上記以外のエラーコードについては エラーコード一覧表 を参照してください。

DMM GAMES

DMM GAMESには復元機能は提供されていません。 ログインしたユーザーのサブスクリプションの利用の可否はゲームサーバーで管理しているサブスクリプションのステータスを元に判断してください。