async iospay() {
if (this.loading == true) {
return;
}
let that = this
this.loading = true;
uni.showLoading({
title: '支付处理中...',
mask: true
});
try {
let params = {
id: this.rechargeOptions[this.current]._id, //选择的产品id 。这个id在苹果端和数据库端的id是一致的。
}
//console.log(params)
let result = await Api.post('user/vip/iosbuy', params) //在后端对产品id进行下单,并且返回数据库的订单号
uni.setStorageSync('iosVipOrdersn', result.ordersn) //保存订单号到本地
// 使用iap.js 请求苹果支付
const transaction = await this._iap.requestPayment({
productid: this.rechargeOptions[this.current]._id,
manualFinishTransaction: true,
username: result.ordersn //订单号
});
console.log(transaction) // 取消订阅后,再次订阅会出现 上述描述中,没有username的现象,而且也不会弹出IOs的确认订阅弹窗
// 检查receiptData 是否正确,以及根据 ordersn 以及在后端给这个用户开通VIP
let checkIos = await Api.post('user/vip/checkiospay', {
receiptData: transaction.transactionReceipt,
ordersn: transaction.payment.username||'',
})
console.log(checkIos)
if (checkIos) {
// 验证成功后关闭订单
await this._iap.finishTransaction(transaction);
uni.showToast({
icon: "success",
title: "支付完成",
})
uni.removeStorageSync('iosVipOrdersn')
}
} catch (e) {
console.log(e)
uni.showModal({
content: '支付失败',
showCancel: false
});
} finally {
this.loading = false;
uni.hideLoading();
that.$refs.paypop.close()
}
},
- 发布:2023-04-21 16:14
- 更新:2024-12-02 13:01
- 阅读:1838
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win11
HBuilderX类型: 正式
HBuilderX版本号: 3.7.9
手机系统: iOS
手机系统版本号: iOS 16
手机厂商: 苹果
手机机型: iPhone XR
页面类型: nvue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
示例代码:
操作步骤:
1.订阅一个自动续期订阅产品
2.取消这个订阅
3.再次订阅 无法订阅
1.订阅一个自动续期订阅产品
2.取消这个订阅
3.再次订阅 无法订阅
预期结果:
可以再次订阅
可以再次订阅
实际结果:
无法再次订阅
无法再次订阅
bug描述:
使用官方的iap.js ,在VIP购买页面,沙盒环境下,在执行订阅且付款后,transaction的回调如下
{
"payment": {
"productid": "包月会员id",
"quantity": "1",
"username": "订单id",
},
"transactionDate": "2023-04-21 15:17:37",
"transactionIdentifier": "2000000317502408",
"transactionReceipt": "MIIhFgYJKoZIhvcNAQcCoII......",
"transactionState": "1",
"errMsg": "requestPayment:ok"
}
然后上传transactionReceipt username在后端进行判断,这些都是没有问题的。
但是,我想测试,如果用户取消了订阅,不想自动扣费,但是一个月后,又在VIP开通页面,再次开通。所以我在设置中,取消包月会员的订阅。然后回到这个VIP页面,可是在手机却不弹出付款框,而transaction直接给了 回调,类似如下内容
{
"payment": {
"productid": "包月会员id",
"quantity": "1",
},
"transactionDate": "2023-04-21 15:17:37",
"transactionIdentifier": "2000000317502408",
"transactionReceipt": "MIIhFgYJKoZIhvcNAQcCoII......",
"transactionState": "1",
"errMsg": "requestPayment:ok"
}
里边没有username信息,也不会弹出付款框 。导致用户无法取消后 再次订阅。
而在代码中我也调用了iap.js中的
await this._iap.finishTransaction(transaction);
来关闭订单,可是好像订单并没有被关闭。
此功能极其重要,对于APP而言,ios付费购买虚拟物品,只能通过IAP,如果不修复,可能会导致丧失IOS市场或者转用其他开发框架。
10 个回复
pengcheng933
BUG,没法解决,建议采用原生插件
DCloud_iOS_WZT
退订后再次订阅属于恢复购买,需要调用restore
相关参考:
https://uniapp.dcloud.net.cn/api/plugins/payment.html#iap
https://uniapp.dcloud.net.cn/tutorial/app-payment-aip.html
1***@qq.com (作者)
使用iap.restoreComplateRequest 或者iap.restoreCompletedTransactions 都只是会得到一个transaction 的回弹,并不能唤起ios的付款支付弹窗,这些回调都是已经支付过的订单,并不能唤起付款支付弹窗,没有意义。用户取消订阅后,如果要再次购买,需要唤起确定支付的付款弹窗不是么?只是返回之前的 transaction 有什么意义呢?
2023-04-24 15:52
1***@qq.com (作者)
吊用 restoreComplateRequest 返回的 transaction 如下 {
"payment": {
"productid": "620913a13ae424c7a003876c",
"quantity": "1"
},
"transactionDate": "2023-04-21 15:40:09",
"transactionIdentifier": "2000000317520057",
"transactionReceipt": "MIIhGQYJKoZIhvcNAQcAQEEBQIDAnFlMA0CARMCAQEEBQwDMS4wMA4CAQkCAQEEBgIEUDI2MDAYAgEEAgECBBCOINFSdoIW",
"transactionState": "1"
},
2023-04-24 15:54
1***@qq.com (作者)
finishTransaction 这个方法能否关闭 自动续期订阅的订单 ?是不是 必须用finishTransaction 关闭订单后,才可以再次订阅?我在付费后调用了 finishTransaction 方法,为何订单没有关闭?
2023-04-24 16:34
DCloud_iOS_WZT
回复 1***@qq.com: 用正式环境测 可能是沙箱环境的问题
2023-04-24 17:39
1***@qq.com (作者)
回复 DCloud_iOS_WZT: 正式环境需要上架,那我现在直接忽略这个问题上架么?
2023-04-26 14:26
DCloud_iOS_WZT
回复 1***@qq.com: 可以通过testFlight 测试正式环境
2023-04-26 16:10
1***@qq.com
回复 1***@qq.com: 遇到了同样的问题,楼主解决了吗
2023-06-24 11:39
沫予沫
回复 1***@qq.com: 老哥解决了吗
2023-07-31 21:35
苏陌
回复 1***@qq.com: 作者解决了吗
2024-01-11 14:11
vonfly
这个问题如何解决呢?
2024-01-26 14:47
vonfly
订阅产品的购买与复购有demo代码吗?
2024-03-01 10:51
y***@163.com
回复 DCloud_iOS_WZT: 生产环境也是这样的, 麻烦解决一下
2024-08-26 16:45
沫予沫
你们这个问题解决了? 后面怎么做的?
1***@qq.com
请问你解决了吗
2024-01-16 20:49
pengcheng933
解决了嘛
苏陌
2024年解决了吗
1***@qq.com
这个问题是不是个bug,能不能解决?还是说我们这些人写法错了,总共就给我们三个api,还能怎么处理呢,请问
vonfly - 中端开发工程师
这个问题解决了吗?
y***@163.com
官方能不能解决一下问题呢。生产环境也是这样的
s***@163.com
同样的问题,这么长时间了,还没解决吗
huijin工程师
官方能解决吗
y***@163.com
如果是沙盒环境,可以考虑在取消后等待20分钟后 在发起订阅就可以弹支付弹窗了,应该是沙盒环境的问题
2024-12-11 11:44