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 }