iOSアプリ内課金(自動更新購読型)のレシート検証をcurlで試す

iOSの自動更新型アプリ内課金を実装している中で、レシート検証を行う必要がありますが、ドキュメントでは基本的にサーバーで行われることを前提としているようです(以下[レシート検証 プログラ ミングガイド](https://developer.apple.com/jp/app-store/Receipt-Validation-Programming-Guide-JP.pdf)から引用)。
> 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
    - 本番用: https://buy.itunes.apple.com/verifyReceipt
    - 開発用: https://sandbox.itunes.apple.com/verifyReceipt


# Response
```json

{
	"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"
	}]
}
```

各キーと値については[レシート検証 プログラ ミングガイド](https://developer.apple.com/jp/app-store/Receipt-Validation-Programming-Guide-JP.pdf)から確認可能です。