iOS客户端完成内购买后,会得到一个收据(receipt)。需要服务器用这个收据发送给苹果进行验证,防止内购买作弊。
服务端向苹果服务器发送post请求
苹果测试环境 https://sandbox.itunes.apple.com/verifyReceipt,
苹果生产环境 https://buy.itunes.apple.com/verifyReceipt
开发和苹果审核时要使用测试环境,上架苹果商店后要使用生产环境。服务端可以配置固定账号用于开发和测试,用苹果测试环境验证,其它账号用生产环境验证。
以下适用于非自动订阅的商品。
请求的http body是json格式,receipt-data字段对应的就是收据数据,例如
{
"receipt-data":"***"
}
苹果服务器返回的http body里的status字段对应的是收据状态,若为0,则收据为真。
在receipt字段里,bundle_id 是APP的固定ID,可用于检查收据是否属于我们的APP。
In_app数组包含了用户每次的交易,
product_id 是商品id,要与购买的商品ID相符才有效。
transaction_id标志了每次的交易。服务端通过新增的transaction_id,得知此次的购买,添加用户时长。
例如
{
"receipt": {
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "***",
"application_version": "6",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2019-11-20 06:33:11 Etc/GMT",
"receipt_creation_date_ms": "1574231591000",
"receipt_creation_date_pst": "2019-11-19 22:33:11 America/Los_Angeles",
"request_date": "2019-11-20 07:08:44 Etc/GMT",
"request_date_ms": "1574233724373",
"request_date_pst": "2019-11-19 23:08:44 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": "***",
"transaction_id": "1000000592835282",
"original_transaction_id": "1000000592835282",
"purchase_date": "2019-11-15 08:28:40 Etc/GMT",
"purchase_date_ms": "1573806520000",
"purchase_date_pst": "2019-11-15 00:28:40 America/Los_Angeles",
"original_purchase_date": "2019-11-15 08:28:40 Etc/GMT",
"original_purchase_date_ms": "1573806520000",
"original_purchase_date_pst": "2019-11-15 00:28:40 America/Los_Angeles",
"is_trial_period": "false"
}
]
},
"status": 0,
"environment": "Sandbox"
}
补充说明:在向苹果验证收据,返回的表示购买时间的字段中
purchase_date 其时间格式类似ISO 8601
purchase_date_ms 是Unix时间戳格式,单位为毫秒
purchase_date_pst 是太平洋时区