最近公司需要做这样一个功能,网上查了这方面的资料不是很多就记录一下, 对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题.
苹果IAP内购支付实际上是"将客户端支付后的一些信息传给后台, 后台拿着这些信息在传给苹果支付平台, 来验证客户端支付是否有效"的一个过程, 中间的难点有三个.
一是沙盒测试数据和线上测试数据的问题. 刚开始接入苹果内购时,网上的各种测试一大堆, 几乎你就找不到两篇相同的数据, 这导致我刚开始做的时候踩了很多坑, 对于这种情况建议各位java开发者以实际测试数据为准, 因为我认为, 随着时间往后, 苹果平台返回的测试数据还会变化, 请以真实得到的数据为准. 下面贴一下我当时项目的测试数据。
这个是沙箱测试数据(经过检验,正式的测试数据与沙箱测试数据结构是一样,所以采用同一套代码即可)
{
"status": 0,
"environment": "Sandbox",
"receipt": {
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "com.jiuying.twelveAnimal",
"application_version": "0",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2018-01-05 10:06:12 Etc/GMT",
"receipt_creation_date_ms": "1515146772000",
"receipt_creation_date_pst": "2018-01-05 02:06:12 America/Los_Angeles",
"request_date": "2018-01-05 10:06:14 Etc/GMT",
"request_date_ms": "1515146774645",
"request_date_pst": "2018-01-05 02:06:14 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": "com.jiuying.twelveAnimal.6", //这个6是关键, 6就是苹果客户端支付的金额, 我们取到这个值,进行我们的业务逻辑即可
"transaction_id": "1000000364151484",
"original_transaction_id": "1000000364151484",
"purchase_date": "2018-01-05 10:06:11 Etc/GMT",
"purchase_date_ms": "1515146771000",
"purchase_date_pst": "2018-01-05 02:06:11 America/Los_Angeles",
"original_purchase_date": "2018-01-05 10:06:11 Etc/GMT",
"original_purchase_date_ms": "1515146771000",
"original_purchase_date_pst": "2018-01-05 02:06:11 America/Los_Angeles",
"is_trial_period": "false"
}
]
}
}
得到前端支付数据,发给苹果平台,进行二次验证
/**
* @throws Exception
* 苹果内购支付
* @Title: doIosRequest
* @Description:Ios客户端内购支付
* @param TransactionID :交易单号 需要客户端传过来的参数1
* @param Payload:需要客户端传过来的参数2
* @throws
*/
public Map<String, Object> doIosRequest(String TransactionID,String Payload, int userId) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
Map<String, Object> mapChan