アプリの月額課金についてたくさん調べて実装し、ようやくリリースまでこぎつけて、リリース後大きな不具合もなく安心していたのも束の間、月初の昨日(3/1)に有効期限の罠にハマったので記録しておきます。
解決方法はまだ決定できていません。
1ヶ月以外の購読期間についてはわからないです。
前提と事の発端
- アプリ内に開始日と有効期限日を表示している(例・開始は2/15 有効期限は3/15)
- 有効期限はストアから発行されたレシートの情報を元にしている
- アプリ内の注意書きに「有効期限は開始日の翌月同日まで」と表記している
- ここは日本
ユーザからの**「3/1に開始したのに有効期限が3/29と表示されている。どういうことか」**という問い合わせで何かが起きていることが発覚。調査を開始しました。
結論からいうと
プラットフォーム | 開始日時 | 有効期限日 |
---|---|---|
iOS | 3/1 0:00~16:59 | 3/29 |
iOS | 3/1 17:00~ | 4/1 |
Android | 3/1 0:00~8:59 | 3/29 |
Android | 3/1 9:00~ | 4/1 |
※ プラットフォームごとに数時間のズレがあるため厳密には上の通りではありません。後述します。
どういうことかというと、ストア側とは国による時差があり上記時間帯ではストア側はまだ2/28。
iOSでは17時間(Apple本社がカリフォルニア州だから?)、Androidでは9時間(標準時)の時差がありました。
ストアとしては2/28に開始したのだから期限は当然3/28になり、時間によっては日本時間で3/29になります。
たとえばiOSの場合、日本時間で16:59に開始したユーザと17:00に開始したユーザで有効期限に3日間も差があることに。
23:59と0:00で差ができるのはユーザとして納得しますが、今回のようなのは痛いです。
実装当時は考えが及びませんでした。
解決案
チームでいくつかあがった解決案。どれも根本解決でないし、前述のとおりまだ方針は決定していません。
アプリ側で有効期限を設定する
ストアのレシート情報を無視して、開始日から1ヶ月分起算して期限を設定する案。
今回の場合は永遠にストアと3日の差が出続けます。
でもそうするべきだったのかもしれません。
アプリ内の有効期限表示をなくす
完全に逃げ
余談
このようなイレギュラー(?)な場合にかかわらず、iOSとAndroidでは有効期限の時間に差があります。
- iOS:
開始日時 + 1ヶ月 - 1時間
(例・2/15 14:00に開始 → 3/15 13:00が期限) - Android:
開始日時 + 1ヶ月 + 2時間
(例・2/15 14:00に開始 → 3/15 16:00が期限)
Androidの方がiOSに比べて3時間優しい仕様になっています。
22:00 ~ 1:00あたりの登録で日付に齟齬が生じることがあるので注意が必要です。
この時間差については検証時のテストアカウントでは発見できません。
公式リファレンスに明記しておいてほしかったです。見逃したのかな?
余談2
上で公式リファレンスを軽くdisっていますが、課金の実装で一番大切なのは公式リファレンスを読みまくることです。
大変わかりづらく書かれていたりしますが、何度も何度も読むことをおすすめします。
ちゃんと読むと必要なことは書かれています。