Apple/Googleのサブスクリプション通知タイプについて

こんにちは。
PHR事業開発部の村越です。

今回は、Apple/Googleのサブスクリプション通知について調査した内容について記載しようと思います。

サブスクリプション通知とは

サブスクリプション通知とは、iOS/Androidのサブスクリプション(定期購入)の更新、キャンセルなどをサーバーに対して通知する機能になります。
この記事では、通知の際に取得できる通知の種類について、どういう状態か、どのようなタイミングで呼ばれるかなどを記載したいと思います。

Apple

Appleのサブスクリプション通知の種類は以下になります。
Appleのサブスクリプション通知には、ver1とver2があり、通知の種類も異なります。

Apple ver1

CANCEL

Appleによって返金などの理由で解約された場合に呼ばれます。
※ユーザーが手動で定期購入の自動更新を停止した場合は通知されない

CONSUMPTION_REQUEST

ユーザーが返金申請を開始した場合に呼ばれます。
通知を受け取ってから12時間以内に、こちらからConsumption というAPIを使って情報提供することができます。
Apple側の返金申請を早くするためと思われます。

DID_CHANGE_RENEWAL_PREF

ユーザーが定期購入のプランを変更した場合に呼ばれます。

DID_CHANGE_RENEWAL_STATUS

ユーザーが定額購入をキャンセル、またはキャンセルを取り消ししたときに呼ばれます。
このタイミングでは、定額購入のキャンセルの予約のような状態となります。
キャンセルの予約の状態は、定期購入の有効期限内と同様の状態にする必要があります。

DID_FAIL_TO_RENEW

決済の失敗などで定期購入の更新が失敗した場合に呼ばれます。
猶予期間の設定をしている場合、猶予期間に入ります。
猶予期間の設定は、AppStoreConnect上からON/OFFの設定が出来ます。期間は固定で、一週間の場合は6日、それ以外は16日となります。
猶予期間中は、定期購入の有効期限内と同様の状態にする必要があります。
猶予期間の設定がされていない場合、保留状態になります。
保留状態は、定額購入の有効期限外の状態とします。

DID_RECOVER

更新に失敗した期限切れの定期購入の自動更新が成功した場合に呼ばれます。

DID_RENEW

定期購入が更新された場合に呼ばれます。

INITIAL_BUY

新規で定期購入が購入された場合に呼ばれます。

INTERACTIVE_RENEWAL

解約していた定期購入を手動で再購入した場合に呼ばれます。
猶予期間でも呼ばれていることがあったので、自動更新以外で復帰した場合はこちらが呼ばれるのかなと思います。

PRICE_INCREASE_CONSENT

定期購入の価格が値上げされる場合に呼ばれます。

REFUND

Appleからユーザーへの払い戻しがあった場合に呼ばれます。

REVOKE

ユーザーがApp内課金のファミリー共有を無効化した場合、購入者またはメンバーがファミリー共有グループから抜けた場合、あるいは購入者が返金をリクエストまたは受領した場合に呼ばれます。

Apple ver2

ver2には、新しくサブタイプが追加されており、詳細な状態を判定することが可能になりました。

CONSUMPTION_REQUEST

ver1と同様

DID_CHANGE_RENEWAL_PREF

ver1と同様
サブタイプが「UPGRADE」の場合は、ユーザーがプランのアップグレードをしたことを示します。アップグレードはその時点で反映されます。
サブタイプが「DOWNGRADE」の場合は、ユーザーがプランのダウングレードをしたことを示します。ダウングレードは次回の更新時に反映されます。
サブタイプが空の場合は、上記のダウングレードをキャンセルしたことを示します。

DID_CHANGE_RENEWAL_STATUS

ver1と同様
サブタイプが「AUTO_RENEW_DISABLED」の場合は、ユーザーが定期購入をキャンセルしたことを示します。
サブタイプが「AUTO_RENEW_ENABLED」の場合は、ユーザーが定期購入のキャンセルを取り消したことを示します。

DID_FAIL_TO_RENEW

ver1と同様
サブタイプが「GRACE_PERIOD」の場合は、猶予期間が存在することを示します。
サブタイプが空の場合は、猶予期間が存在しないことを示します。

DID_RENEW

ver1と同様
サブタイプが「BILLING_RECOVERY」の場合は、以前に更新に失敗した期限切れの定期購入が正常に更新されたことを示します。
サブタイプが空の場合は、有効な定期購入が更新されたことを示します。

EXPIRED

定期購入の有効期限が切れた場合に呼ばれます。
サブタイプが「VOLUNTARY」の場合は、ユーザーが定期購入をキャンセルしたことによる期限切れを示します。
サブタイプが「BILLING_RETRY」の場合は、決済の失敗などで定期購入の更新が出来なかったことによる期限切れを示します。
サブタイプが「PRICE_INCREASE」の場合は、ユーザーが値上げに同意しなかったことによる期限切れを示します。
サブタイプが「PRODUCT_NOT_FOR_SALE」の場合は、更新時に定期購入のプランの購入に失敗したことによる期限切れを示します。

GRACE_PERIOD_EXPIRED

定期購入の更新に成功しないまま、猶予期間が切れた場合に呼ばれます。

OFFER_REDEEMED

ユーザーがプロモーションオファーまたはオファーコードを引き換えた場合に呼ばれます。
サブタイプが「INITIAL_BUY」の場合は、初回購入時に引き換えたことを示します。
サブタイプが「RESUBSCRIBE」の場合は、定期購入の再登録時に引き換えたことを示します。
サブタイプが「UPGRADE」の場合は、定期購入のアップグレード時に引き換えたことを示します。
サブタイプが「DOWNGRADE」の場合は、定期購入のダウングレード時に引き換えたことを示します。
サブタイプが「OFFER_REDEEMED」の場合は、有効な定期購入を引き換えたことを示します。

PRICE_INCREASE

定期購入の価格が値上げされる場合に呼ばれます。
サブタイプが「PENDING」の場合は、ユーザーがまだ値上げに同意していないことを示します。
サブタイプが「ACCEPTED」の場合は、ユーザーが値上げに同意した、または同意が必要ない値上げであることを示します。

REFUND

ver1と同様

REFUND_DECLINED

Appleが、アプリ開発者によって開始された払い戻しリクエストを拒否した場合に呼ばれます。

RENEWAL_EXTENDED

Appleが、アプリ開発者が要求した定期購入の更新日を延長した場合に呼ばれます。

REVOKE

ver1と同様

SUBSCRIBED

定期購入が購入された場合に呼ばれます。
サブタイプが「INITIAL_BUY」の場合は、新規で購入されたことを示します。
サブタイプが「RESUBSCRIBE」の場合は、定期購入を再購入されたことを示します。

TEST

テスト用の通知。アプリ開発者から要求があった場合にのみ呼ばれます。

Google

Googleのサブスクリプション通知の種類は以下になります。

(1)SUBSCRIPTION_RECOVERED

定期購入が「(5)SUBSCRIPTION_ON_HOLD」で保留の状態になっている状態で購入された場合に呼ばれます。

(2)SUBSCRIPTION_RENEWED

定期購入が更新された場合に呼ばれます。

(3)SUBSCRIPTION_CANCELED

定期購入が自発的または非自発的にキャンセルされた場合の呼ばれます。
自発的なキャンセルの場合、ユーザーが定額購入をキャンセルしたときに呼ばれます。
このタイミングでは、定額購入のキャンセルの予約のような状態となり、その後、有効期限が切れた際に「(13)SUBSCRIPTION_EXPIRED」が呼ばれ定額購入のキャンセルとなります。
キャンセルの予約の状態は、定期購入の有効期限内と同様の状態にする必要があります。
非自発的なキャンセルの場合、保留状態が切れた場合に呼ばれます。
この場合は、定額購入の有効期限外の状態とします。

(4)SUBSCRIPTION_PURCHASED

新規で定期購入が購入された場合に呼ばれます。

(5)SUBSCRIPTION_ON_HOLD

決済の失敗などで定期購入の更新が失敗し、その後の猶予期間も切れた場合に呼ばれ、保留状態になります。
保留状態は、定額購入の有効期限外の状態とします。
その後、保留状態が切れると「(3)SUBSCRIPTION_CANCELED」が呼ばれて定額購入のキャンセルとなります。

(6)SUBSCRIPTION_IN_GRACE_PERIOD

決済の失敗などで定期購入の更新が失敗し、猶予期間に入った場合に呼ばれます。
猶予期間は、GooglePlayConsole上から「なし、3日、7日、14日、30日」で設定が出来ます。
猶予期間中は、定期購入の有効期限内と同様の状態にする必要があります。
その後、猶予期間が切れたら「(5)SUBSCRIPTION_ON_HOLD」が呼ばれて保留の状態になります。
この時点で、定期購入の有効期限外の状態に変更します。

(7)SUBSCRIPTION_RESTARTED

ユーザーが自発的に定期購入を解約後、有効期限が切れる前に解約をキャンセルした場合に呼ばれます。

(8)SUBSCRIPTION_PRICE_CHANGE_CONFIRMED

定期購入の料金変更がユーザーによって確認された場合に呼ばれます。

(9)SUBSCRIPTION_DEFERRED

定期購入の契約期間が延長された場合に呼ばれます。

(10)SUBSCRIPTION_PAUSED

定期購入が一時停止された場合に呼ばれます。
一時停止状態は、定額購入の有効期限外の状態とします。
一時停止の期間が終了すると、自動で定期購入が再開します。

(11)SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED

定期購入の一時停止をされた、キャンセルされた場合に呼ばれます。
その後、有効期限が切れた際に「(10)SUBSCRIPTION_PAUSED」が呼ばれ定額購入の一時停止となります。

(12)SUBSCRIPTION_REVOKED

有効期限前にユーザーが定期購入を取り消した場合に呼ばれます。

(13)SUBSCRIPTION_EXPIRED

定期購入が自発的にキャンセルされ、有効期限が切れた場合に呼ばれます。

補足

Appleは猶予期間中は
pending_renewal_info → grace_period_expires_date
に猶予期間を考慮した有効期限、
Googleは通常の有効期限自体が猶予期間を考慮した有効期限
で返却してくれるようになっています。(Appleは通常の有効期限はそのまま)
そのため、サーバー側で定額購入中かどうかを判定する場合、通知のステータスに応じて状態を変更しなくても、レシート検証の結果の有効期限内かどうかだけでも問題ないかと思います。

参考資料

Apple

Google

最後に

今回はサブスクリプションの通知についてまとめてみました。
通知はどのタイミングで何の通知が呼ばれるのか分かりづらく、毎回調べてしまうので、自分なりにまとめてみました。

今回は以上となります。
今後とも「PSP」をよろしくお願い致します。

村越