アプリ内課金

【Googleサブスク】期限が過ぎたレシートの検証が410エラーになる

久しぶりに Google Play Billing(Android)のサブスクリプションの話。

先日、有効期限が切れてそれなりの期間が経過した purchaceToken のレシートを検証してみたところ、有効期限切れで無効なレシート情報が返ってくるのかと思ったら、Google Play から 410 ステータスのエラーが返された。

「410 Gone」って初めて見たかも。

そこで、この有効期限が切れた古いレシートについて調べてみましたのでまとめておきます。

Google のサブスクの基本については以下を参照してください。

【Googleサブスク】レシート検証をPHPとKotlinで実現する前回、GooglePlayBilling(Android)の都度課金についてまとめてみましたが、最近は月額課金のサービスが多くなり、都度...

410エラーの詳細内容

410 エラーのレスポンスボディには以下の内容が表示されていました。

メッセージの通り、「有効期限を過ぎてから長期間経過しているので、そのサブスクリプションのクエリ問い合わせはできなくなりました」ということです。

どのタイミングからレシート検証が弾かれるのか

では一体、有効期限をどのくらい過ぎると問い合わせができなくなるのでしょうか。

Google Play の公式的な資料やコメントが見当たらなかったので、stackoverflow に頼ることになったのですが、どうやら有効期限から 60 日のようです。

Starting on May 21, 2018, Purchases.subscriptions.get will return HTTP status 410 with no content in the response for subscriptions that have been expired for 60 days or more. There is no change for active subscriptions or canceled subscriptions that have not yet expired or been expired for fewer than 60 days.

Google Android publisher API responds with “410 purchaseTokenNoLongerValid” error

有効期限が切れた場合、通常だと以下のフローを辿って解約状態(無効)となります。

・ユーザの意図的な解約があった(この場合は即時無効)
・決済不備で猶予期間になった
・猶予期間を過ぎて一時停止になった
・一時停止期間を過ぎて無効になった

猶予期間や一時停止期間の有無は Google Play Console の設定によりますが、どちらにしてもサブスクリプションが継続更新されないと最終的には解約状態(無効)となります。

よって、一時停止(Account Hold)を有効にしている場合は、それが終わって無効になってから、さらに 30 日後ということになりそうですね。

ちょうど手元に、55 日前と 65 日前が有効期限の purchaceToken があったので、それぞれについてレシート検証してみました。

結果はご覧の通り。

55日前:レシートの内容が返される
65日前:410エラー

通常、一時停止(Account Hold)が切れてから 30 日以上も後にレシート検証することはないと思いますが、運用上、そういったケースが発生しないとも限らないので挙動だけ覚えておきたいですね。