アプリ内課金

【Googleサブスク】レシート検証の結果で410エラーになる(期限が過ぎたレシートやトークン無効化)

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

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

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

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

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

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

2020 年に Google の公式ドキュメントが整理され、以前よりも必要な情報へのアクセスがしやすくなりました。こちらをベースにまとめた記事を書いてみましたので、以下の記事も参考にしてみてください。

【2021年版】Googleアプリ内課金の導入と運用方法(GooglePlayBilling)

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 日以上も後にレシート検証することはないと思いますが、運用上、そういったケースが発生しないとも限らないので挙動だけ覚えておきたいですね。

[追記]
2020 年の後半に Google の公式ドキュメントにも記載されました。

注: 購入トークンは、定期購入の登録から有効期限の 60 日後まで有効です。この日を過ぎると、購入トークンが無効になり、Google Play Developer API を呼び出せなくなります。

定期購入を販売する – 定期購入ライフサイクルを処理する

トークンが無効化されるパターン

古いレシートの件とは別に、トークン(purchaseToken)が無効化された場合にも 410 エラーが返ってくるパターンがありました。

Google に問い合わせてみないと詳しいことはわかりませんが、ユーザがサブスクの解約ではなくて Google のアカウント削除をしてしまったのではないかと推測しています。

ただ、それならそれで、レシートの解約理由(cancelReason)などにそれっぽい設定をして、解約済のレシートを返却して欲しいですよね。

こちらとしては一時的な問題なのか判断に迷うところです。