前言
业务需求,最近研究了下IOS内购自动订阅。
初次接入,仅提供一个基本思路。目前流程已走通,待继续优化中。
自动订阅需要基于已引入基础的iap内购流程。
项目基于apicloud实现的,可能与原生稍微不同。
思路
自定订阅与普通iap内购的区别在于,第二次自动订阅流程。
首次购买可以与普通内购一致,同样直接将自动订阅作为普通商品购买,但是在后端注意做类型区分,同时记录下对应的 transaction-id。
1:自动订阅不再需要用户手动支付订单;
2:次月到期前苹果服务器会尝试对该用户进行扣费;
3:若成功则会自动调取已在苹果后台配置好的回调接口;
4:服务器接收到回调后,验证订单并给予用户订单对应的物品,同时对订单进行记录;
5:用户下次打开APP时,APP中的监听会自动接收到对应订单信息,此时就可以走正常的内购流程,但是后端判断当前订单已完成,返回提示。
注意细节
1:必须将iap内购以全局监听的形式实现,同时设置禁止自动完成订单,改为主动关闭订单。
通过setTransactionListener实现监听,建议在APP的root页面设置,作为全局监听,避免单独页面监听时,若打开多个页面会造成多次监听。
//设置全局监听,同时设置为不自动完成订单 var iap = api.require('iap'); iap.setTransactionListener({autoFinishTransaction: false}, function(ret, err) { if (ret) { //主动关闭订单 iap.finishTransaction({ transactionId:'当前的订单号'}); alert(JSON.stringify(ret)); } else { alert(JSON.stringify(err)); } });
详细参考:https://docs.apicloud.com/Client-API/Func-Ext/iap#setTransactionListener
2:自动订阅必须设置生成收据验证代码
为了提高安全性,连续订阅必须在App Store中生成共享密钥。到时后端进行订单验证时需要提供该密钥进行匹配后才能完成流程。
详细参考:https://help.apple.com/app-store-connect/#/devf341c0f01
3:自动订阅必须设置用于接收App Store服务器通知的网址
自动订阅的购买回调是由App Store发起的,所以我们需要提供一个接收回调的接口。
App Store会将对应的订单参数以JSON的形式通过POST传递给服务器。
接收后,自行验证密钥是否正确,后期可根据自行项目需求做对应设置。
建议将对应的订单回调信息入库,以备用。
如下通过PHP实现的一个简单框架可以参考:
function iapResponseAction(){ //接收IOS服务器回调的JSON信息 $response = file_get_contents('php://input'); if(empty($response)){ //空回调 } $response = json_decode($response, true); if ($response['password'] != '*********你自己的密钥********') { //验证共享秘钥失败 } if ($response['notification_type'] == 'CANCEL') { //【取消订阅】----订阅已经由Apple消费者支持所取消。请检查Cancellation Date字段来确定何时订阅被取消。 } else if ($response['notification_type'] == 'INITIAL_BUY') { //【初次购买订阅】----请将latest_receipt存储在你的服务器,随时可以当作token来验证,以确定用户的订阅状态。 } else if ($response['notification_type'] == 'RENEWAL' || $response['notification_type'] == 'INTERACTIVE_RENEWAL') { //【续订】 //RENEWAL ---- 一个已过期的订阅被成功地自动续订。请检查Subscription Expiration Date来确定下一个续订的日期和时间。 //INTERACTIVE_RENEWAL ---- 在订阅过期之后,用户手动选择了续订,可以是在你的App UI中操作,或者在Apple Store的用户设置中操作。续订后服务应该立即可用。 } else if ($response['notification_type'] == 'DID_CHANGE_RENEWAL_PREF') { //【更改订阅计划】----用户修改了订阅计划,在下一个订阅周期的时候生效。当前生效的订阅计划不受影响。 } }
详细参考:https://help.apple.com/app-store-connect/#/dev0067a330b
具体回调订单参数可参考:https://developer.apple.com/documentation/appstoreservernotifications/responsebody (英文的,自行网页翻译一下)
4:如何测试自定订阅
通过沙盒可以进行测试,沙盒第一次购买后,关闭APP(杀死进程的那种),等2-3分钟(时间不固定),再次打开APP就会实现自动订阅流程。(此时建议去查看一下回调接口记录的数据)
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com