You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用in_app_purchase包实现订阅升降级:无法获取oldPurchaseDetails

Flutter in_app_purchase 订阅升级/降级:获取旧PurchaseDetails的方法
  • 第一步:获取用户历史购买记录
    调用InAppPurchase.instance.queryPastPurchases()拉取用户所有过往购买记录,从中筛选出当前活跃的旧订阅。代码示例:

    final QueryPurchaseDetailsResponse pastPurchasesResponse = await InAppPurchase.instance.queryPastPurchases();
    if (pastPurchasesResponse.error != null) {
      // 处理查询错误,比如网络异常、权限不足
      return;
    }
    
    // 筛选目标旧订阅(匹配产品ID+确认是已购买且自动续费的活跃状态)
    final oldPurchase = pastPurchasesResponse.pastPurchases.firstWhere(
      (purchase) => 
        purchase.productID == "你的旧订阅产品ID" && 
        purchase.status == PurchaseStatus.purchased && 
        purchase.isAutoRenewing,
      orElse: () => null,
    );
    
    if (oldPurchase == null) {
      // 未找到符合条件的旧订阅,提示用户先完成旧订阅购买
      return;
    }
    
  • 第二步:发起升级/降级请求
    拿到oldPurchase后,在创建PurchaseParam时传入upgradeDowngradeInfo参数,指定旧订单和计费模式:

    // 需提前通过queryProductDetails获取新订阅的ProductDetails
    final newProductDetails = ...; // 你的新订阅产品详情
    
    final purchaseParam = PurchaseParam(
      productDetails: newProductDetails,
      upgradeDowngradeInfo: UpgradeDowngradeInfo(
        oldPurchaseDetails: oldPurchase,
        // 根据业务需求选择计费模式,示例为立即生效并按剩余时长折算
        prorationMode: ProrationMode.immediateWithTimeProration,
      ),
    );
    
    // 发起订阅变更请求
    await InAppPurchase.instance.buySubscription(purchaseParam);
    
  • 注意事项

    • 确保用户已登录对应平台的应用商店账号(iOS App Store/Google Play),否则无法查询到历史订阅记录
    • 测试环境(沙盒/测试账号)需先完成旧订阅的购买流程,才能成功获取到oldPurchaseDetails
    • Android端若查询失败,检查是否添加了com.android.vending.BILLING权限,部分版本可能需要额外配置

内容的提问来源于stack exchange,提问作者Keval Tank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:01:41