iOSの自動更新型アプリ内課金を実装している中で、レシート検証を行う必要がありますが、ドキュメントでは基本的にサーバーで行われることを前提としているようです(以下レシート検証 プログラ ミングガイドから引用)。
App Store を使用したレシートの検証
App Store を使用して検証する場合、App とサーバの間に安全な接続があることと、App Store を使用 してレシートを検証するためのコードがサーバ上にあることが必要です。
そのためクライアントではレシート検証をあまり意識しないのですが、サーバー側の実装をするために、リクエストボディとレスポンスのフォーマットを早めに把握したい、といったやりとりが発生したことがあります。
その時に使用したレシート検証用のcurlについて書きます。
POST request
$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"receipt-data": "<RECEIPT_ENCODED_WITH_BASE64>", "password": "<SHARED_SECRET>"}' <REQUEST_URL>
補足情報
-
<RECEIPT_ENCODED_WITH_BASE64>
: クライアント側で取得できるレシートデータをbase64エンコードしたもの -
<SHARED_SECRET>
: 購読型課金のレシート検証に必要な共有秘密キー- iTunesConnect > My App > Features > In-App Purchases > App-Specific Shared Secret から取得(無い場合は生成)可能
-
<REQUEST_URL>
: Appleのレシート検証用URL
Response
{
"status": 0,
"environment": "Sandbox",
"receipt": {
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "com.gram30.joinus.dev.PurchaseSample",
"application_version": "1",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2018-02-24 09:45:37 Etc/GMT",
"receipt_creation_date_ms": "1519465537000",
"receipt_creation_date_pst": "2018-02-24 01:45:37 America/Los_Angeles",
"request_date": "2018-03-03 05:56:03 Etc/GMT",
"request_date_ms": "1520056563571",
"request_date_pst": "2018-03-02 21:56:03 America/Los_Angeles",
"original_purchase_date": "2013-08-01 07:00:00 Etc/GMT",
"original_purchase_date_ms": "1375340400000",
"original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles",
"original_application_version": "1.0",
"in_app": [{
"quantity": "1",
"product_id": "<PRODUCT_ID>",
"transaction_id": "1000000378478086",
"original_transaction_id": "1000000378478086",
"purchase_date": "2018-02-24 09:45:35 Etc/GMT",
"purchase_date_ms": "1519465535000",
"purchase_date_pst": "2018-02-24 01:45:35 America/Los_Angeles",
"original_purchase_date": "2018-02-24 09:45:37 Etc/GMT",
"original_purchase_date_ms": "1519465537000",
"original_purchase_date_pst": "2018-02-24 01:45:37 America/Los_Angeles",
"expires_date": "2018-02-24 09:50:35 Etc/GMT",
"expires_date_ms": "1519465835000",
"expires_date_pst": "2018-02-24 01:50:35 America/Los_Angeles",
"web_order_line_item_id": "1000000037930156",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
}]
},
"latest_receipt_info": [{
"quantity": "1",
"product_id": "<PRODUCT_ID>",
"transaction_id": "1000000378478086",
"original_transaction_id": "1000000378478086",
"purchase_date": "2018-02-24 09:45:35 Etc/GMT",
"purchase_date_ms": "1519465535000",
"purchase_date_pst": "2018-02-24 01:45:35 America/Los_Angeles",
"original_purchase_date": "2018-02-24 09:45:37 Etc/GMT",
"original_purchase_date_ms": "1519465537000",
"original_purchase_date_pst": "2018-02-24 01:45:37 America/Los_Angeles",
"expires_date": "2018-02-24 09:50:35 Etc/GMT",
"expires_date_ms": "1519465835000",
"expires_date_pst": "2018-02-24 01:50:35 America/Los_Angeles",
"web_order_line_item_id": "1000000037930156",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
}],
"latest_receipt": "<RECEIPT_ENCODED_WITH_BASE64>",
"pending_renewal_info": [{
"expiration_intent": "2",
"auto_renew_product_id": "<PRODUCT_ID>",
"original_transaction_id": "1000000378478086",
"is_in_billing_retry_period": "0",
"product_id": "<PRODUCT_ID>",
"auto_renew_status": "0"
}]
}
各キーと値についてはレシート検証 プログラ ミングガイドから確認可能です。