uni-app iOS 购买订阅类内购收到的 transactionReceipt 全部是第一个购买项目的

uni-app iOS 购买订阅类内购收到的 transactionReceipt 全部是第一个购买项目的

项目属性 信息
产品分类 uniapp/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 15.2
HBuilderX类型 正式
HBuilderX版本号 4.43
手机系统 iOS
手机系统版本号 iOS 18
手机厂商 苹果
手机机型 iPhone XR
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

  • 先购买一个非续期订阅内购, 然后再次购买

预期结果:

  • 购买成功后返回的 transactionIdentifier 和根据返回的 transactionReceipt 中解析出来的值一致

实际结果:

  • 第二次及以后购买的 订阅类 内购 返回的 transactionReceipt 解析出来的 transactionIdentifier 始终是第一次购买的 transactionIdentifier
  • transactionReceipt 不正确

bug描述:

uni.requestPayment({  
    provider: 'appleiap',  
    orderInfo: {  
        productid,  
        username,  
        quantity: 1,  
        manualFinishTransaction: true  
    },  
    success: (transaction) => {  
        console.log(transaction.transactionIdentifier);  
        console.log(transaction.transactionReceipt);  
    }  
})
  • productid 传订阅类内购 productid
  • 收到的 transactionReceipt 解析出来的 transactionId 和 返回的transactionIdentifier不是一个 (始终是第一个购买的订阅项目)

更多关于uni-app iOS 购买订阅类内购收到的 transactionReceipt 全部是第一个购买项目的的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

{
“payment”: {
“username”:“xxxx”,
“productid”: “xxxx”,
“quantity”: “1”
},
“transactionDate”: “2024-12-28 14:38:13”,
“transactionIdentifier”: “2000000817695191”,
“transactionReceipt”: “MII…”,
“transactionState”: “1”,
“errMsg”: “requestPayment:ok”
} transactionReceipt 和实际 transactionIdentifier 不一致
解析方式参考苹果给出的sdk app-store-server-library-java

更多关于uni-app iOS 购买订阅类内购收到的 transactionReceipt 全部是第一个购买项目的的实战教程也可以访问 https://www.itying.com/category-93-b0.html


https://uniapp.dcloud.net.cn/api/plugins/payment.html#transactionstate
根据文档所述: 注意事项
相同订单,重复调用 restoreCompletedTransactions 后 transactionReceipt 会发生变化,并非唯一值
实际情况是 每次调用 所有 transaction的 transactionReceipt 全部都一样

在处理uni-app中的iOS购买订阅类内购时,如果收到的transactionReceipt始终是第一个购买项目的,这通常是由于未能正确处理或区分后续的购买交易。为了确保每个交易都能被正确识别和处理,我们需要确保在应用内正确管理和验证每一个transactionReceipt

以下是一个简化的代码示例,展示了如何在uni-app中处理iOS的购买订阅类内购,并验证每个transactionReceipt。请注意,实际生产环境中,应使用苹果提供的服务器验证API来验证收据的真实性,以下代码仅用于演示目的。

1. 监听购买事件

在uni-app中,我们可以通过监听购买事件来获取交易信息。

// 监听购买事件
uni.onPurchase((res) => {
    if (res.transactionState === 'paid') {
        // 处理已支付状态
        handlePaidTransaction(res.transactionReceipt);
    }
});

2. 处理已支付交易

handlePaidTransaction函数中,我们可以记录或验证每个transactionReceipt

function handlePaidTransaction(receipt) {
    // 存储或处理收据
    console.log('Received transaction receipt:', receipt);

    // 在这里,你应该将receipt发送到你的服务器进行验证
    // 例如,通过HTTP POST请求将receipt发送到你的服务器
    uni.request({
        url: 'https://yourserver.com/verifyReceipt', // 替换为你的服务器URL
        method: 'POST',
        data: {
            receipt: receipt
        },
        success: (response) => {
            // 处理服务器返回的验证结果
            console.log('Server response:', response.data);

            // 根据服务器返回的结果更新应用内的状态
            // 比如,给予用户相应的订阅权益
        },
        fail: (error) => {
            console.error('Failed to verify receipt:', error);
        }
    });
}

3. 服务器验证

在服务器端,你需要使用苹果提供的验证API来验证transactionReceipt。验证成功后,你可以根据返回的订阅信息来更新你的数据库或执行其他逻辑。

注意事项

  • 确保你的应用已正确配置为支持内购。
  • 使用苹果提供的验证API来验证收据,以确保安全性。
  • 处理所有可能的交易状态,如restored(恢复购买)和failed(交易失败)。
  • 妥善存储和管理用户的订阅信息,以便在需要时能够准确判断用户的订阅状态。

通过上述代码和注意事项,你应该能够正确处理和验证每个iOS购买订阅类内购的transactionReceipt,避免收到始终是第一个购买项目的收据问题。

回到顶部