请教下ios 内购自动订阅的技术细节
公司要实现一个vip会员功能,需要有自动订阅。
从网上搜集的资料,自动续费有三种模式。
1.通过客户端
2.苹果推送
3.循环历史票据信息
现在实现的代码如下,
就是想问其中是否存在bug
$receipts = $data['latest_receipt_info']; // 自动续订订阅项时才会有
if (!isset($data['latest_receipt_info'])) {
$receipts = $data['receipt']['in_app']; // 消费类型
}
if (empty($receipts)) {
return api_400('in_app信息为空');
}
//根据自身需求返回数据
$returnData = [];
//多物品信息
foreach ($receipts as $product) {
//订单重复验证
$orderCheck = PaymentOrderModel::where(['otn' => $product['transaction_id']])
->find();
if ($orderCheck) {
continue;
}
//产品验证
$productCheck = ProductModel::where(['os_type' => 1, 'ename' => $product['product_id']])
->find();
if (!$productCheck) {
return api_400('没有找到对应产品的金额,ID:' . $product['product_id']);
}
// 启动事务
Db::startTrans();
try {
//创建订单
//业务处理
Db::commit();
// 提交事务
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return api_400($e->getMessage());
}
}
我们用的是两种方式:
没有看到你提及
original_transaction_id
,如果没有登录状态,比如苹果主动推送的场景,需要通过原始订单号去查用户信息,付费信息(到期时间计算等)。暂时没用
轮询票据
的,对于自动订阅的,只要测试联调成功了,不太可能存在苹果不推送的情况。另外回调接口接入日志,真要是出现掉单,也方便排查。当然还可以通过用户提供的扣款截图,通过对应的API排查https://api.storekit.itunes.apple.com/inApps/v1/lookup/{$this->tradeNo}
对于自动订阅取latest_receipt_info这个数据,然后按时间最大倒序,取第一条,然后把订单列表有效期这个字段写到数据库就可以了