In-App Purchase

iOSアプリでアイテムを購入したときに、Appleのサーバーで購入チェックを行う。
apple が用意している、pdfを元に素直に実装すると、以下のようになる。

class AppStore

        STATUS_OK = 0

	/**
	 * @param[in] reveipt base64エンコードされた、レシートデータ
	 * @retval 購入情報
	 */
        def self.verify(receipt)

                receipt_data = { "receipt-data" => receipt }.to_json
                urls =  [
                                'https://buy.itunes.apple.com/verifyReceipt',
                                'https://sandbox.itunes.apple.com/verifyReceipt',
                        ]

                data = { 'status' => 21005 }

                for url in urls
                        uri = URI(url)
                        http = Net::HTTP.new(uri.host, uri.port)
                        http.use_ssl = true
                        request = Net::HTTP::Post.new(uri.request_uri)

                        response = http.request(request, receipt_data)
                        data = JSON.parse response.body

                        break if data['status'] == STATUS_OK
                end

                return data
        end

end

ここで、レスポンスの購入情報にどのような階層の構造でデータが格納されているのかが、実際に取得するまでわからなかったので、
記載しておく。

{
	"receipt":
	{
		"original_purchase_date_pst":"2013-02-20 21:47:18 America/Los_Angeles",
		"unique_identifier":"0000b0092818","original_transaction_id":"1000000000000000",
		"bvrs":"1.0","transaction_id":"1000000000000000",
		"quantity":"1",
		"product_id":"test.com.dummy.item.name.accessory.1",
		"item_id":"606000000",
		"purchase_date_ms":"1361499471862",
		"purchase_date":"2013-02-22 02:17:51 Etc/GMT",
		"original_purchase_date":"2013-02-21 05:47:18 Etc/GMT",
		"purchase_date_pst":"2013-02-21 18:17:51 America/Los_Angeles",
		"bid":"com.site.storetest.appname",
		"original_purchase_date_ms":"1361425638000"
	},
	"status":0
}