ええやんブログ

ええやないかのええやんブログ

アプリ内課金(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;

    }

}

うおー前途多難だぜ―