技術系TIPS
PR

【Google】参照期限が過ぎたレシートやトークン無効化のレスポンス(400, 410エラー)

saratogax
記事内に商品プロモーションを含む場合があります

Google Play Billing(Android)の古いレシートの話。

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

400 はともかく、「410 Gone」って初めて見たかも。

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

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

あわせて読みたい
【Google】定期購入のレシート検証をPHPとKotlinで実現する
【Google】定期購入のレシート検証をPHPとKotlinで実現する

Googleの400エラーの詳細内容

purchases.subscriptionsv2 の API では、失効から一定の日数が経過した参照で 400 エラーが返されます。

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

具体的には以下のようなレスポンスです。

{
    "error": {
        "code": 400,
        "message": "The subscription purchase is no longer available for query because it has been expired for too long.",
        "errors": [
            {
                "message": "The subscription purchase is no longer available for query because it has been expired for too long.",
                "domain": "global",
                "reason": "failedPrecondition"
            }
        ],
        "status": "FAILED_PRECONDITION"
    }
}

Googleの410エラーの詳細内容

purchases.subscriptions の API では、失効から一定の日数が経過した参照で 410 エラーが返されます。

v2 の API の時と同様の内容ですが、ステータスコードが 410 になっています。

具体的には以下のようなレスポンスです。

{
    "error": {
        "errors": [
            {
                "domain": "androidpublisher",
                "reason": "subscriptionPurchaseNoLongerAvailable",
                "message": "The subscription purchase is no longer available for query because it has been expired for too long."
            }
        ],
        "code": 410,
        "message": "The subscription purchase is no longer available for query because it has been expired for too long."
    }
}

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

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

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)などにそれっぽい設定をして、解約済のレシートを返却して欲しいですよね。

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

{
    "error": {
        "code": 410,
        "message": "The purchase token is no longer valid.",
        "errors": [
            {
                "message": "The purchase token is no longer valid.",
                "domain": "androidpublisher",
                "reason": "purchaseTokenNoLongerValid"
            }
        ]
    }
}
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました