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
{
“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
,避免收到始终是第一个购买项目的收据问题。