uni-app 苹果内购买订阅产品成功后取消 为什么无法复购?

发布于 1周前 作者 zlyuanteng 来自 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内中复购则无法成功拉起支付,使怎么回事呢?

支付环境:沙盒环境


21 回复

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:本地没有响应要移除的事务

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!