1***@qq.com
1***@qq.com
  • 发布:2023-04-21 16:14
  • 更新:2024-03-12 17:48
  • 阅读:912

【报Bug】uniapp使用ios 自动续期订阅时,订阅某个产品后,执行退订操作后,无法再次订阅

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win11

HBuilderX类型: 正式

HBuilderX版本号: 3.7.9

手机系统: iOS

手机系统版本号: iOS 16

手机厂商: 苹果

手机机型: iPhone XR

页面类型: nvue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
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()  
                }  
            },

操作步骤:

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市场或者转用其他开发框架。

2023-04-21 16:14 1 条评论 负责人:无 分享
已邀请:
DCloud_iOS_WZT

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

沫予沫

沫予沫

你们这个问题解决了? 后面怎么做的?

pengcheng933

pengcheng933

解决了嘛

苏陌

苏陌

2024年解决了吗

1***@qq.com

1***@qq.com

这个问题是不是个bug,能不能解决?还是说我们这些人写法错了,总共就给我们三个api,还能怎么处理呢,请问

vonfly

vonfly - 中端开发工程师

这个问题解决了吗?

pengcheng933

pengcheng933

BUG,没法解决,建议采用原生插件

要回复问题请先登录注册