const order = {
orderInfo: {
productid: productId,
username: channelId /* 服务器使用 channelId 反查交易 */
}
};
uni.requestPayment({
...order,
provider: 'appleiap',
...其它回调
})
- 发布:2020-09-18 23:27
- 更新:2020-09-19 01:07
- 阅读:1070
产品分类: uniapp/App
PC开发环境操作系统: Mac
PC开发环境操作系统版本号: 10.15.6
手机系统: iOS
手机系统版本号: iOS 13.4
手机厂商: 苹果
手机机型: iPhone SE2 等其它 iOS 14 机型
页面类型: vue
打包方式: 离线
项目创建方式: CLI
CLI版本号: 2.0.0-28920200907001
示例代码:
操作步骤:
在 iOS 发起 IAP 支付,并且提供 username
在 iOS 发起 IAP 支付,并且提供 username
预期结果:
在支付成功后也能从 transaction 里读取 username
在支付成功后也能从 transaction 里读取 username
实际结果:
成功的 transaction 里读取不到 username,state 是 0 的却有 username
成功的 transaction 里读取不到 username,state 是 0 的却有 username
bug描述:
由于论坛还不支持提交 iOS 14 的 bug,我先分类在 13 了。
uni-app 在发起 IAP 交易时,有个参数是 username: 购买商品用户的用户名,我们之前把系统的交易 ID 存在这个字段中,提交给 Apple,目的是为了避免用户在支付成功后,因网络、软件 bug(等各种异常情况)导致无法成功结算。
由于非订阅类型的商品,只能在支付成功的那一刻拿到苹果的 transaction,或者在打开 App 时通过订阅 Apple 的通道拿到这个 transaction,但都只能拿到一次,所以这个 transaction 非常重要,如果丢失就代表用户花了钱,却拿不到对应的商品。我们通过把交易 ID 存在 username 字段中,并在必要环节对 transaction 进行缓存,降低丢单的概率。
现在的问题是,在升级 iOS 14 以后,虽然创建订单时我们提供了 username,但是苹果返回给我们的 transaction 中并没有一起返回 username,我初步查看了苹果的 API 文档,似乎也是这个逻辑,但这会让我们非常被动,提高了丢单的概率。
https://developer.apple.com/documentation/storekit/skpaymenttransaction
https://developer.apple.com/documentation/storekit/skpayment
现在不能明确是苹果还是 uni-app 的问题,希望能快速帮忙核查,如果是苹果的问题,希望 uni-app 也能帮忙进行反馈。
如果有人能提出其它更好的降低丢单概率,或是避免丢单的方案,请不吝赐教,感谢。
2 个回复
h***@qq.com (作者)
注意,这个 bug 是 iOS 14 才出现的。
h***@qq.com (作者)
现在我们的方案是:在正常支付的情况下,手动把 username 拼进去兼容旧的逻辑;后端增加新的逻辑来处理异常情况,通过 transaction 中的 receipt 来校验,生成新的交易(以前是标记对应的交易为已完成或者已失败),希望给到大家参考。