iOSアプリ内課金におけるレシート確認先の切り替え

iOSアプリ内課金におけるレシート確認先の切り替えorigin_5487700484

はじめに

こんにちは、ビンゴ葦名です。
今回は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サーバーに問い合わせなおしてね

この方法が認知されて、多くのアプリがスムーズに申請通るようになるといいですね!


この記事はあなたの役に立ちましたか?他の人達にも役立ちそうでしたら、上のボタンより共有をお願いします。共有して頂けたら今後提供する記事の参考やモチベーションアップにつながります。

Categorized: iOS