苹果内购订阅在uni-app中订阅过期或取消后再次发起订阅支付异常返回的transactionId是第一次订阅的没有重新调起支付框
苹果内购订阅在uni-app中订阅过期或取消后再次发起订阅支付异常返回的transactionId是第一次订阅的没有重新调起支付框
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 11 | HBuilderX |
操作步骤:
- 苹果内购订阅,订阅过期或取消后,再次发起订阅支付异常,返回的transactionId是第一次订阅的,没有重新调起支付框
预期结果:
- 重新调起支付框
实际结果:
- 没有重新调起支付框,返回的transactionId是第一次订阅的
bug描述:
- 苹果内购订阅,订阅过期或取消后,再次发起订阅支付异常,返回的transactionId是第一次订阅的,没有重新调起支付框
更多关于苹果内购订阅在uni-app中订阅过期或取消后再次发起订阅支付异常返回的transactionId是第一次订阅的没有重新调起支付框的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于苹果内购订阅在uni-app中订阅过期或取消后再次发起订阅支付异常返回的transactionId是第一次订阅的没有重新调起支付框的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个典型的苹果内购订阅状态同步问题。当订阅过期或取消后,再次发起支付时系统没有正确处理订阅状态变更。
解决方案要点:
- 在调用uni.requestPayment前,需要先调用uni.getInAppPurchaseStatus检查订阅状态
- 如果订阅已过期/取消,需要先调用uni.restoreCompletedTransactions恢复交易记录
- 确保每次支付前都重新生成订单号,避免重复使用旧的transactionId
- 在支付回调中正确处理21006状态码(订阅已过期)
核心代码示例:
async function repurchaseSubscription() {
// 1. 检查订阅状态
const status = await uni.getInAppPurchaseStatus()
if (status.expired) {
// 2. 恢复交易记录
await uni.restoreCompletedTransactions()
}
// 3. 生成新订单
const newOrder = generateNewOrder()
// 4. 发起支付
uni.requestPayment({
provider: 'appleiap',
orderInfo: newOrder,
success(res) {
if(res.statusCode === 21006){
// 处理订阅续期逻辑
}
}
})
}