苹果内购订阅在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


这是一个典型的苹果内购订阅状态同步问题。当订阅过期或取消后,再次发起支付时系统没有正确处理订阅状态变更。

解决方案要点:

  1. 在调用uni.requestPayment前,需要先调用uni.getInAppPurchaseStatus检查订阅状态
  2. 如果订阅已过期/取消,需要先调用uni.restoreCompletedTransactions恢复交易记录
  3. 确保每次支付前都重新生成订单号,避免重复使用旧的transactionId
  4. 在支付回调中正确处理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){
        // 处理订阅续期逻辑
      }
    }
  })
}
回到顶部