一.苹果内购流程
①先去苹果开发平台配好各种环境,比如银行卡,税号什么的
②ios客户端调用sdk,先去查你在后台配置的内购信息,查到如果有信息,就可以开始购买操作了
③付款成功后,苹果服务器会给你一个购买回执 (可以使用沙盒模式,回执要保存下来,以后主动请求数据使用)
④把回执传到自己的服务器,然后后台开发人员开发去请求苹果的服务器,返回购物信息
⑤拿到购买信息后,就可以在自己的平台为用户开通相应的权限了(使用latest_receipt_info里面的数据,in_app里面的数据不是最新的如果你的回执不是最新的话)
⑥配置回调,自动续费会给你服务器回调数据(生产实测配了也不会给你回调,只能保存回执自己主动去请求了。。。)
二.相关数据分析
拿回执主动请求返回的数据
{
"status": 0,
"environment": "Sandbox",
"receipt": { //当前回执所对应的的购买记录
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "com.sanvio.BusinessConverge",
"application_version": "3",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2019-04-17 08:05:23 Etc/GMT",
"receipt_creation_date_ms": "1555488323000",
"receipt_creation_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"request_date": "2019-04-18 03:10:17 Etc/GMT",
"request_date_ms": "1555557017655",
"request_date_pst": "2019-04-17 20:10:17 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": "vip.01",
"transaction_id": "1000000520098800",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-17 08:05:22 Etc/GMT",
"purchase_date_ms": "1555488322000",
"purchase_date_pst": "2019-04-17 01:05:22 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:10:22 Etc/GMT",
"expires_date_ms": "1555488622000",
"expires_date_pst": "2019-04-17 01:10:22 America/Los_Angeles",
"web_order_line_item_id": "1000000043895222",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
}
]
},
"latest_receipt_info": [ //记录该appleid最新的续订记录,实时更新,
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520098800",
"original_transaction_id": "1000000520098800", //跟着appleId走,用来标记用户
"purchase_date": "2019-04-17 08:05:22 Etc/GMT",
"purchase_date_ms": "1555488322000",//套餐购买毫秒值
"purchase_date_pst": "2019-04-17 01:05:22 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:10:22 Etc/GMT",
"expires_date_ms": "1555488622000",//套餐过期毫秒值
"expires_date_pst": "2019-04-17 01:10:22 America/Los_Angeles",
"web_order_line_item_id": "1000000043895222",//苹果那边的主键 唯一
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520102202",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-17 08:11:41 Etc/GMT",
"purchase_date_ms": "1555488701000",
"purchase_date_pst": "2019-04-17 01:11:41 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:16:41 Etc/GMT",
"expires_date_ms": "1555489001000",
"expires_date_pst": "2019-04-17 01:16:41 America/Los_Angeles",
"web_order_line_item_id": "1000000043895223",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520103663",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-17 08:16:41 Etc/GMT",
"purchase_date_ms": "1555489001000",
"purchase_date_pst": "2019-04-17 01:16:41 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:21:41 Etc/GMT",
"expires_date_ms": "1555489301000",
"expires_date_pst": "2019-04-17 01:21:41 America/Los_Angeles",
"web_order_line_item_id": "1000000043895386",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520106671",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-17 08:22:00 Etc/GMT",
"purchase_date_ms": "1555489320000",
"purchase_date_pst": "2019-04-17 01:22:00 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:27:00 Etc/GMT",
"expires_date_ms": "1555489620000",
"expires_date_pst": "2019-04-17 01:27:00 America/Los_Angeles",
"web_order_line_item_id": "1000000043895522",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520109596",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-17 08:27:00 Etc/GMT",
"purchase_date_ms": "1555489620000",
"purchase_date_pst": "2019-04-17 01:27:00 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:32:00 Etc/GMT",
"expires_date_ms": "1555489920000",
"expires_date_pst": "2019-04-17 01:32:00 America/Los_Angeles",
"web_order_line_item_id": "1000000043895729",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520112763",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-17 08:32:27 Etc/GMT",
"purchase_date_ms": "1555489947000",
"purchase_date_pst": "2019-04-17 01:32:27 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-17 08:37:27 Etc/GMT",
"expires_date_ms": "1555490247000",
"expires_date_pst": "2019-04-17 01:37:27 America/Los_Angeles",
"web_order_line_item_id": "1000000043895898",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520440245",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-18 01:44:55 Etc/GMT",
"purchase_date_ms": "1555551895000",
"purchase_date_pst": "2019-04-17 18:44:55 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-18 01:49:55 Etc/GMT",
"expires_date_ms": "1555552195000",
"expires_date_pst": "2019-04-17 18:49:55 America/Los_Angeles",
"web_order_line_item_id": "1000000043896090",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520440887",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-18 01:49:55 Etc/GMT",
"purchase_date_ms": "1555552195000",
"purchase_date_pst": "2019-04-17 18:49:55 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-18 01:54:55 Etc/GMT",
"expires_date_ms": "1555552495000",
"expires_date_pst": "2019-04-17 18:54:55 America/Los_Angeles",
"web_order_line_item_id": "1000000043917890",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520441645",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-18 01:54:55 Etc/GMT",
"purchase_date_ms": "1555552495000",
"purchase_date_pst": "2019-04-17 18:54:55 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-18 01:59:55 Etc/GMT",
"expires_date_ms": "1555552795000",
"expires_date_pst": "2019-04-17 18:59:55 America/Los_Angeles",
"web_order_line_item_id": "1000000043917927",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520442138",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-18 01:59:55 Etc/GMT",
"purchase_date_ms": "1555552795000",
"purchase_date_pst": "2019-04-17 18:59:55 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-18 02:04:55 Etc/GMT",
"expires_date_ms": "1555553095000",
"expires_date_pst": "2019-04-17 19:04:55 America/Los_Angeles",
"web_order_line_item_id": "1000000043917995",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520443367",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-18 02:04:55 Etc/GMT",
"purchase_date_ms": "1555553095000",
"purchase_date_pst": "2019-04-17 19:04:55 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-18 02:09:55 Etc/GMT",
"expires_date_ms": "1555553395000",
"expires_date_pst": "2019-04-17 19:09:55 America/Los_Angeles",
"web_order_line_item_id": "1000000043918050",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
},
{
"quantity": "1",
"product_id": "vip.01",
"transaction_id": "1000000520444016",
"original_transaction_id": "1000000520098800",
"purchase_date": "2019-04-18 02:09:55 Etc/GMT",
"purchase_date_ms": "1555553395000",
"purchase_date_pst": "2019-04-17 19:09:55 America/Los_Angeles",
"original_purchase_date": "2019-04-17 08:05:23 Etc/GMT",
"original_purchase_date_ms": "1555488323000",
"original_purchase_date_pst": "2019-04-17 01:05:23 America/Los_Angeles",
"expires_date": "2019-04-18 02:14:55 Etc/GMT",
"expires_date_ms": "1555553695000",
"expires_date_pst": "2019-04-17 19:14:55 America/Los_Angeles",
"web_order_line_item_id": "1000000043918120",
"is_trial_period": "false",
"is_in_intro_offer_period": "false"
}
],
"latest_receipt": "MIIkDwYJKoZIhvcNAQcCoIIkADCCI...................",//最新回执,返回的数据中,in_app 和 last_recepit_info数据一致
"pending_renewal_info": [
{
"expiration_intent": "1",
"auto_renew_product_id": "vip.01",//将要续订的套餐
"original_transaction_id": "1000000520098800",//唯一标记用户的标识
"is_in_billing_retry_period": "0",
"product_id": "vip.01",//当前套餐
"auto_renew_status": "0"//续订状态 0:不续订 1:续订
}
]
}
苹果回调的数据
{
"auto_renew_product_id": "vip.01",
"notification_type": "DID_CHANGE_RENEWAL_STATUS",
"latest_receipt_info": {
"transaction_id": "1000000519994702",
"original_transaction_id": "1000000517025422",
"quantity": "1",
"unique_identifier": "dfb3020735a03e0c791e66b2191f7a2f3c6df64d",
"is_in_intro_offer_period": "false",
"item_id": "1296544422",
"original_purchase_date_ms": "1554712593000",
"purchase_date_pst": "2019-04-16 20:10:54 America/Los_Angeles",
"expires_date": "1555470954000",
"expires_date_formatted": "2019-04-17 03:15:54 Etc/GMT",
"is_trial_period": "false",
"original_purchase_date_pst": "2019-04-08 01:36:33 America/Los_Angeles",
"original_purchase_date": "2019-04-08 08:36:33 Etc/GMT",
"purchase_date_ms": "1555470654000",
"product_id": "vip.01",
"bvrs": "3",
"bid": "com.sanvio.BusinessConverge",
"purchase_date": "2019-04-17 03:10:54 Etc/GMT",
"expires_date_formatted_pst": "2019-04-16 20:15:54 America/Los_Angeles",
"web_order_line_item_id": "1000000043752812",
"unique_vendor_identifier": "224470F0-4B66-4B0A-8426-1B420659AF17"
},
"environment": "Sandbox",
"latest_receipt": "ewoJInNpZ25hd.........",
"password": "3622d5........",
"auto_renew_status": "true"
}
三.苹果掉单问题
1)苹果服务器经常不稳定,经常访问不了
2)自动续订回调不及时 (沙盒环境经常出现不回调或回调严重延时)
3)有些回执中包含特殊字符,请求的时候会被转义,导致请求不成功,报21002
解决方法:用户第一次购买套餐时,报用户的回执记录下来,做定时任务主动去请求数据,同步会员数据
四.工具类
public static String sendHttpsCoon(String url, String code){
if(url.isEmpty()){
return null;
}
try {
//设置SSLContext
SSLContext ssl = SSLContext.getInstance("SSL");
ssl.init(null, new TrustManager[]{myX509TrustManager}, null);
//打开连接
HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
//设置套接工厂
conn.setSSLSocketFactory(ssl.getSocketFactory());
//加入数据
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Charset", "GBK");
conn.setRequestProperty("Content-type","application/json");
JSONObject obj = new JSONObject();
obj.put("receipt-data", code);
obj.put("password", "XXXXXXXXXXXXXX");//共享秘钥
BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
buffOutStr.write(obj.toString().replace("\\\\","\\").getBytes());
buffOutStr.flush();
buffOutStr.close();
//获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuilder sb = new StringBuilder();
while((line = reader.readLine())!= null){
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
return null;
}
}
五.参考资料:
https://www.cnblogs.com/TheYouth/p/6847014.html
https://www.jianshu.com/p/b199a4672608
苹果官方文档