【apicloud】实现iap自动续期订阅前后端

前言


业务需求,最近研究了下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就会实现自动订阅流程。(此时建议去查看一下回调接口记录的数据)


猿教程
请先登录后发表评论
  • 最新评论
  • 总共0条评论