はじめに
こんにちは、ビンゴ葦名です。
今回はiOSのアプリ課金時のレシート確認方法について、見落としやすい落とし穴とその対策を紹介します。
レシート確認先はひとつではない
アプリで月額課金をする場合、ユーザーがアップルのサーバーで正しく購入手続きをしたかどうかを確認するために、レシートをチェックします。
このレシートのチェック方法が実は曲者で、確認方法が2種類存在します。
1.アプリがSandbox環境(開発バージョン)の場合
問い合わせ先:https://sandbox.itunes.apple.com/verifyReceipt
2.アプリが本番環境(AppStoreからダウンロードされたもの)の場合
問い合わせ先:https://buy.itunes.apple.com/verifyReceipt
申請時にはどちらの問い合わせ先に?
普通に考えれば、開発時はSandboxの問い合わせ先、AppStore申請時には、本番環境の問い合わせ先に切り替えて申請すると思います。
なぜなら、Sandbox向けのままにして申請したら、申請が通ってAppStoreに出たときにレシート確認ができなくなるからです。
「アップルのレビューチームが審査しているときは、(特別な)本番環境のような状態でテストしているに違いない!」
という根拠のない思い込みをしていました。
しかし現実は
アップルから「課金機能が動いていない」という理由で何回かリジェクトを食らっているうちに、以下のことに気づきました。
「もしや、アップルのレビューチームはSandbox環境でレビューしている??」
もしこの仮定が正しければ、確かにレシートチェックで失敗しますから、課金機能は動きません。
しかし、申請時にSandbox向けにしたら、審査が通ってAppStoreに出たときに、今度は一般ユーザーの課金処理が動かないことになります。
解決方法
解決方法は2つあります。
1.レシート確認を別のサーバー経由にして、審査が通ったらそのサーバーのレシート確認先を切り替える
2.アプリの中で、今の実行環境がSandboxか本番環境かを判定して、レシート確認先を切り替える
1の方法についてはそのままなので、2の方法について解説します。
今の実行環境がSandboxか本番環境かを判定する方法は、アップルのドキュメントにも明示的には書かれていません。
これ、多くの人がハマるポイントだと思うのですが、あまり情報がないのは不親切ですよね。
以下のブログの方がその真相に迫っていました。
レシートのverifyとSandbox
http://nantekottai.com/2012/08/27/verifying-receipts/
要点は以下になります。
>とりあえず最初はProductionサーバーの方の認証APIを叩いてみて、
>status code: 21007が返ってきたらそれはSandbox用のレシートだからSandboxサーバーに問い合わせなおしてね
この方法が認知されて、多くのアプリがスムーズに申請通るようになるといいですね!