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
相关产品推荐
相关产品推荐

