uni-app 苹果内购买订阅产品成功后取消 为什么无法复购?
uni-app 苹果内购买订阅产品成功后取消 为什么无法复购?
项目 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | Windows10 v2009 build19045.3930 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.99 |
手机系统 | iOS |
手机系统版本号 | iOS 15 |
手机厂商 | 苹果 |
手机机型 | iPhone 6s Plus |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
操作步骤:
购买订阅产品,按照正常支付流程没有问题,但是第一次购买订阅产品成功后,手动在App Store中手动取消产品订阅,再回到app内中复购则无法成功拉起支付,并且transaction 中username字段会出现丢失的情况
// 开发者服务器创建订单返回username信息
const orderId = await this.createOrder({
productId: this.productId
});
// 请求苹果支付
const transaction = await this._iap.requestPayment({
productid: this.productId,
manualFinishTransaction: true,
username: username + orderId
});
预期结果:
可以重新拉起订阅产品的支付
实际结果:
无法拉起,并会存在username丢失问题
bug描述:
uniapp内部使用苹果内购(IAP),购买消耗类产品可以成功拉起支付并支付成功。支付订阅产品的时候首次可以支付成功,但是在App Store中手动取消产品订阅,再回到app内中复购则无法成功拉起支付,使怎么回事呢?
支付环境:沙盒环境
username对于苹果那边不是用来关联订单号的 而是用来防刷的 在苹果那边就是有丢失的场景
username为空时需要添加其他关联机制来处理 参考https://shalliy.github.io/2018/07/31/iOS%E5%86%85%E8%B4%AD%EF%BC%88IAP%EF%BC%89%E9%82%A3%E4%BA%9B%E4%BA%8B/
https://tech.gotokeep.com/post/2018/12/in-app-purchase/
订阅产品复购问题这个如何处理呢?就是用户在App Store中手动取消产品订阅,再回到app内中复购则无法成功拉起支付的问题
回复 vonfly: 用restore 每次点击购买前先restore看有没有历史
回复 DCloud_iOS_WZT: 我现在的逻辑是初次进入支付页面的时候,也会用restore。处理逻辑为transactionState 为1的情况就会关闭订单,但是订阅产品会出现transactionState 为3的情况 这个时候支付也没有办法拉起
回复 vonfly: 为3的时候标识已经购买过了 你拿到这个票据去服务器校验
回复 DCloud_iOS_WZT: 我现在拿到3的场景为 首次订阅成功后 我手动在苹果手机 设置->App Store->沙盒账户里面取消了订阅,再回到app内购买连续包月产品 这个时候就无法拉起支付了
回复 vonfly: 取消订阅是指到期后不自动续费了 而不是这次支付的产品退款
看下沙箱账号 上面的注意事项 沙箱环境重复购买商品 需要清除购买记录或重新添加沙盒测试账号
回复 DCloud_iOS_WZT: 想确认下 透传的username是每笔订单都不一样,还是可以和用户身份挂钩,就是同一个用户每笔订单的username都是一样的?
回复 vonfly: 你可以用来当做订单号传 但是要处理好 username丢失的场景,苹果官方对于这个字段定义 是用来防刷的不是用来绑定业务的 可以参考苹果官网和https://tech.gotokeep.com/post/2018/12/in-app-purchase/
回复 DCloud_iOS_WZT: 有ios 版的hello uniapp iap的支付代码demo吗,想参考一下
回复 DCloud_iOS_WZT: 我后续的测试发现了一个问题,就是订阅产品首次购买后transactionState为1,交易成功了,也通过了苹果服务器的校验。但是后面再进入订阅产品购买页面使用restoreCompletedTransactions api检测未关闭的订单时候发现之前购买的订阅产品记录还有,并且transactionState 变为了3 是什么意思呢?
回复 vonfly: 你自己没有finish订单吧
回复 vonfly: 3是已购
回复 DCloud_iOS_WZT: 确认是已经关闭了的,因为购买消耗类产品成功后再使用restoreCompletedTransactions api检测是返回的空数组,但是购买订阅的产品就是不行。
回复 vonfly: 这个没问题 订阅类的会有存在的历史记录 怕你换设备查不到
回复 DCloud_iOS_WZT: 苹果手机 设置->App Store->沙盒账户里面取消了订阅,再回到app内购买订阅产品 这个时候就无法拉起支付了,会直接返回支付的结果,同时复购也没有真正成功是怎么回事呢?
回复 vonfly: 请问解决了吗 我碰到了一样的问题
回复 PenGuin1: 官方的处理机制应该是有问题
相同的问题,首次订阅之后,finishTransaction成功,然后在设置里边取消订阅,过一个小时之后进入app想重新订阅,但是requestPayment返回的是旧的transacton,无法拉起订阅产品的支付,并且这个旧的transacton无法通过finishTransaction关闭,报Payment_appleiap:本地没有响应要移除的事务