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

使用Flutter in_app_purchase无法升级/降级Android订阅

问题分析与修复方案

核心错误点

  1. 错误的购买方法调用
    你在处理订阅变更操作,却使用了仅适用于非消耗型商品的buyNonConsumable方法——订阅相关操作必须调用buySubscription方法,这是触发Play商店错误的主要原因。

  2. 过往购买记录筛选逻辑不严谨
    当前代码直接将最后一条过往购买记录作为旧订阅,未验证该订阅是否处于活跃状态(比如未过期、为有效自动续费订阅)。无效的旧订阅会导致变更请求被拒绝。

  3. 订阅变更参数兼容性问题
    使用ProrationMode.deferred时,需确保新旧订阅的计费周期兼容(比如同为月度/年度订阅),否则Play商店会驳回请求。

修复后的代码

final platform = iapConnection
    .getPlatformAddition<InAppPurchaseAndroidPlatformAddition>();
final pastPurchases = await platform.queryPastPurchases();

GooglePlayPurchaseDetails? oldActiveSubscription;

// 筛选出活跃的有效订阅记录
for (var purchase in pastPurchases.pastPurchases) {
  // 验证订阅状态:已购买且未过期,同时匹配订阅类商品ID前缀
  if (purchase.status == PurchaseStatus.purchased && 
      purchase.productID.startsWith("your_subscription_product_prefix_")) {
    oldActiveSubscription = purchase;
    break; // 找到第一个符合条件的活跃订阅后停止遍历
  }
}

final purchaseParam = GooglePlayPurchaseParam(
    productDetails: event.productDetails,
    changeSubscriptionParam: oldActiveSubscription != null
        ? ChangeSubscriptionParam(
            oldPurchaseDetails: oldActiveSubscription,
            prorationMode: ProrationMode.deferred)
        : null);

// 调用订阅专用的购买方法
await iapConnection.buySubscription(purchaseParam: purchaseParam);

额外排查项

  • 确认新旧订阅的商品ID已在Google Play Console中正确配置为订阅类型,且处于可测试/发布状态。
  • 确保测试设备的Google Play服务为最新版本,避免兼容性问题。
  • 测试账号已添加到Play Console的许可测试列表,且使用官方提供的测试订阅商品进行验证。

内容的提问来源于stack exchange,提问作者Samiksha Garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:57:48