アプリ内課金(In-App Purchase)でnewNullResponseエラー
今日はiPhoneアプリのアプリ内課金を実装した時に、サーバーサイドで発生したエラーについてのメモです。
サンドボックスで、サーバプロダクトモデルでのレシートの有効性確認のテストを実施していたときに、以下のエラーが発生。
Your request produced an error. [newNullResponse]
レシートにはテストで適当な数字を設定していたのですが、それでも「21002 receipt-dataプロパティのデータは形式が不正です。」が返却されるのを期待していたんですが…
さっそくドキュメントを確認すると、レシートデータはbase64エンコードしないといけないとのこと。
なるほど、base64エンコードしていないと空が返ってくるのかぁ。
というわけで、下のサンプルのような形でレシートの有効性を確認するように修正しました。
<?php class Iphone_payment { /** * AppStoreでレシートの有効性を確認する * * @param $receipt * @return レシート確認結果を返す */ public function confirm_receipt($receipt) { // Apple Storeに送信するデータを作成 $data = array( 'receipt-data' => base64_encode($receipt), ); // 送信データをJSONに $send_json = json_encode($data); $curl = curl_init("https://sandbox.itunes.apple.com/verifyReceipt"); // オプションの設定 curl_setopt($curl, CURLOPT_POST, true); // POST送信 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 出力結果を加工しない curl_setopt($curl, CURLOPT_POSTFIELDS, $send_json); // ポストデータ curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/json; charset=UTF-8')); // HTTPヘッダー $result = curl_exec($curl); curl_close($curl); $result = json_decode($result, true); return $result; } }
うおー前途多難だぜ―