サブスクリプション更新処理シーケンス

サブスクリプションの状態変更(継続、キャンセル、有効期限切れ等)を反映するシーケンスです。
ストアごとの差分はXGが吸収し、 XGサブスクリプション通知受信シーケンス でゲームサーバーへ通知します。
各ストアの「全体の流れ」で、サブスクリプションの更新の大まかな流れを確認できます。

App Store

サブスクリプション継続時に新しいtransactionIdが発行されるため、以下の2つの処理方法があります。

  • App Storeサーバー通知: XGがApp Storeサーバー通知(App Store Server Notifications)を受信して処理する

  • ゲーム端末の未処理レシート: ゲームサーバーがXGのAPIを呼び出して処理する

全体の流れ

App Storeサーバー通知

App Storeサーバー通知によるサブスクリプションの状態変更を処理するフローです。 XGがApp Storeサーバー通知を受信して処理します。

App Store 通知受信

XGがApp StoreからのServer Notificationsを受信し、通知を保存します。

注釈

XGがApp Storeサーバー通知を受信します。 通知に含まれるBundleIdからXG ProjectIDを特定し、通知を保存します。

App Store 通知処理(バッチ)

バッチ処理で定期的に未処理の通知を処理します。

ゲーム端末の未処理レシート・継続のみ

通常シーケンス

注釈

ゲーム端末に未処理のレシートがある場合、ゲーム端末からサブスクリプション更新APIリクエストが送信されます。 App Storeでサブスクリプションの購入の場合、以降は購入シーケンスの処理に移行します。

リカバリーシーケンス

「サブスクリプション処理状態」とリカバリー処理の要否
「サブスクリプション処理状態」とリカバリー処理の要否

No.

ゲームクライアント表示フラグ

障害発生箇所

想定状況

リカバリー処理

1

レコード無し

ゲーム端末

継続後にゲームサーバーへリクエストできなかった場合。

必要

ゲームサーバー

ゲーム端末からリクエストを受信したが、XGへ「サブスクリプション購入検証API」をリクエストできなかった場合。
XGへ「サブスクリプション購入検証API」をリクエスト後、XGからレスポンスを受信した後の処理に失敗した場合。

XG or ストア

「サブスクリプション購入検証API」でゲームサーバーからリクエストを受信したが、レスポンスに失敗した場合。

ゲームサーバー

「サブスクリプション購入検証API」成功後、XGへ「サブスクリプション継続API」をリクエストできなかった場合。
XGへ「サブスクリプション継続API」をリクエスト後、XGサブスクリプション通知を受信する前に処理が中断した場合。

XG or ストア

「サブスクリプション継続API」でXGサブスクリプション通知送信前にエラーが発生した場合(XG側の処理)。

2

未表示

ゲームサーバー

XGサブスクリプション通知を受信してレコード作成後、ゲーム端末に結果を返却する前に処理が中断した場合。
※利用権は付与済みだが、XG側のゲーム内通貨発行が未完了の可能性あり。

必要

XG

XGサブスクリプション通知受信シーケンスでゲームサーバーへの通知成功後、XG側の後続処理(ゲーム内通貨発行等)でエラーが発生した場合。
※利用権は付与済み。

3

表示済み

ゲームサーバー

XGから処理成功のレスポンスを受信したが、ゲーム端末に結果を返却する処理が出来なかった場合。

不要

ゲーム端末

finishTransactionを実行できなかった場合。

App Storeサーバー通知とサブスクリプション状態一覧

注釈

サブスクリプション状態はApp Storeのサブスクリプションのステータスを元に決定しています。
表のサブスクリプション状態は、各イベント時点において想定される状態を示しています。
App Storeサーバー通知とサブスクリプション状態一覧

notificationType

subtype

説明

サブスクリプション状態

サブスクリプション状態変更イベント

SUBSCRIBED

INITIAL_BUY

サブスクリプション購入

有効(active)

purchase

DID_RENEW

サブスクリプション継続

有効(active)

renewal

SUBSCRIBED

RESUBSCRIBE

サブスクリプション再登録(App Storeのみ)

有効(active)

purchase

DID_RENEW

BILLING_RECOVERY

サブスクリプション復元

有効(active)

recovered

DID_CHANGE_RENEWAL_STATUS

AUTO_RENEW_ENABLED

自動更新の再開

有効(active)

restart

DID_CHANGE_RENEWAL_STATUS

AUTO_RENEW_DISABLED

自動更新のキャンセル

キャンセル(canceled)

canceled

DID_FAIL_TO_RENEW

サブスクリプション継続失敗

猶予期間(grace_period)

grace_period

DID_FAIL_TO_RENEW

GRACE_PERIOD

サブスクリプション継続失敗(猶予期間)

猶予期間(grace_period)

grace_period

GRACE_PERIOD_EXPIRED

猶予期間期限切れ

保留中(on_hold)

on_hold

EXPIRED

VOLUNTARY

サブスクリプション期限切れ(任意)

期限切れ(expired)

expired

EXPIRED

BILLING_RETRY

サブスクリプション期限切れ(請求再試行)

期限切れ(expired)

expired

EXPIRED

PRICE_INCREASE

サブスクリプション期限切れ(価格上昇)

期限切れ(expired)

expired

EXPIRED

PRODUCT_NOT_FOR_SALE

サブスクリプション期限切れ(販売停止)

期限切れ(expired)

expired

REFUND

返金・払い戻し

返金済み(revoked)

revoked

REVOKE

返金・払い戻し

返金済み(revoked)

revoked

Google Play

リアルタイム デベロッパー通知(RTDN)を受けとり、サブスクリプションの状態変更します。

全体の流れ

リアルタイム デベロッパー通知

リアルタイム デベロッパー通知(RTDN)によるサブスクリプションの状態変更を処理するフローです。 XGがリアルタイム デベロッパー通知(RTDN)を受信して処理します。

リアルタイム デベロッパー通知受信

XGがGoogle Playからのリアルタイム デベロッパー通知(RTDN)を受信し、Google Play側のサブスクリプション情報を取得した上で通知を保存します。

注釈

XGがリアルタイム デベロッパー通知(RTDN)を受信します。 通知に含まれるPackageNameからXG ProjectIDを特定し、通知を保存します。

リアルタイム デベロッパー通知処理(バッチ)

バッチ処理で定期的に未処理の通知を処理します。

リアルタイム デベロッパー通知とサブスクリプション状態一覧

注釈

サブスクリプション状態はGoogle Playのサブスクリプションのステータスを元に決定しています。
表のサブスクリプション状態は、各イベント時点において想定される状態を示しています。
Google Play通知とサブスクリプション状態一覧

notificationType

説明

サブスクリプション状態

サブスクリプション状態変更イベント

SUBSCRIPTION_RECOVERED (1)

サブスクリプション復元

有効(active)

recovered

SUBSCRIPTION_RENEWED (2)

サブスクリプション継続

有効(active)

renewal

SUBSCRIPTION_CANCELED (3)

サブスクリプションキャンセル

キャンセル(canceled)

canceled

SUBSCRIPTION_PURCHASED (4)

サブスクリプション購入

有効(active)

purchase

SUBSCRIPTION_ON_HOLD (5)

サブスクリプション保留中

保留中(on_hold)

on_hold

SUBSCRIPTION_IN_GRACE_PERIOD (6)

サブスクリプション猶予期間

猶予期間(grace_period)

grace_period

SUBSCRIPTION_RESTARTED (7)

サブスクリプション再開

有効(active)

restart

SUBSCRIPTION_PAUSED (10)

サブスクリプション停止

停止(paused)

paused

SUBSCRIPTION_REVOKED (12)

サブスクリプション返金

返金済み(revoked)

revoked

SUBSCRIPTION_EXPIRED (13)

サブスクリプション期限切れ

期限切れ(expired)

expired

DMM GAMES

XGがバッチ処理で更新を検知して処理します。

バッチは定期的に実行されるため、実行タイミングによりキャンセルから期限切れまでの経過など状態変化の一部を個別のイベントとして検知できず、直近の状態のみが通知される場合があります。

サブスクリプションの継続に関する通知はバッチ実行のタイミングに依存するため、遅れて届くことがあります。次回のバッチ実行時にDMM GAMESから現在のサブスクリプション状態を取得するため、決済が完了していれば検知され通知されます。

サブスクリプション継続の検知

サブスクリプションの継続時、DMM GAMES側で決済が行われるとOrderIdが発行されます。バッチはlatestOrderIdが更新されているかどうかで、サブスクリプションの継続が行われたかを判別しています。このため、サブスクリプションの継続時の決済が完了した分は次回のバッチ実行で検知され通知されます。

全体の流れ

DMM GAMES バッチ

注釈

バッチによる定期実行で、サブスクリプションの状態を確認します。 latestOrderIdが更新されていない場合は、サブスクリプションの継続が行われていないため処理をスキップします。

DMM GAMESのサブスクリプションのステータスとXGサブスクリプション状態の対応一覧

DMM GAMESのサブスクリプションのステータスとサブスクリプション状態一覧

DmmgamesSubscriptionState

説明

サブスクリプション状態

サブスクリプション状態変更イベント

SUBSCRIPTION_STATE_ACTIVE

有効(購入時)

有効(active)

purchase

SUBSCRIPTION_STATE_ACTIVE

有効(継続時・latestOrderId更新時)

有効(active)

renewal

SUBSCRIPTION_STATE_CANCELED

キャンセル

キャンセル(canceled)

canceled

SUBSCRIPTION_STATE_EXPIRED

期限切れ

期限切れ(expired)

expired