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

Flutter:如何获取同一订阅下的不同套餐方案

解决同一订阅下多套餐的获取与选择问题

核心问题梳理

Google Play的订阅结构是「订阅产品」包含多个「订阅套餐(SKU)」,你需要确保Flutter内购逻辑能正确获取到同一个订阅下的所有SKU,而不是只拿到第一个。

具体解决方案

  1. 确认Google Play后台配置

    • 登录Google Play控制台,找到你的basic订阅产品,确认已创建basic-month和basic-year两个独立套餐,且每个套餐的SKU与你代码中填写的完全一致(大小写、字符都不能错)
    • 确保这两个套餐都已发布到测试轨道(内部测试/封闭测试均可),并且测试账号已添加到许可测试列表
  2. 修正Flutter中的产品ID列表
    把两个套餐的SKU都加入到产品ID列表中,不要只保留一个:

    const List<String> _androidProductIds = <String>[
      'plus',
      'pro',
      'basic-month',
      'basic-year',
    ];
    
  3. 正确获取订阅产品详情
    使用in_app_purchase插件时,要明确指定产品类型为订阅,确保能拉取到所有套餐:

    final QueryProductDetailsRequest request = QueryProductDetailsRequest(
      productIds: _androidProductIds,
      productType: ProductType.subscription, // 必须指定订阅类型
    );
    final QueryProductDetailsResponse response = await InAppPurchase.instance.queryProductDetails(request);
    

    处理返回的response.productDetails,这里面会包含basic-month和basic-year两个套餐的所有信息(价格、订阅周期等),你可以把这些信息展示给用户选择。

  4. 发起对应套餐的购买
    用户选择某个套餐后,用该套餐对应的ProductDetails对象发起购买请求:

    // 假设selectedProduct是用户选中的ProductDetails(比如basic-year)
    final PurchaseParam purchaseParam = PurchaseParam(productDetails: selectedProduct);
    await InAppPurchase.instance.buyNonConsumable(purchaseParam: purchaseParam);
    

常见坑点排查

  • 检查SKU拼写:Google Play的SKU是严格区分大小写的,代码里的ID必须和后台完全一致
  • 测试权限:测试账号必须在Google Play控制台的「许可测试」列表中,否则无法获取未发布的套餐
  • 插件版本:确保使用的in_app_purchase插件是最新版本,旧版本可能存在多SKU获取的bug
  • 网络与日志:打印response.error查看是否有请求错误,比如权限问题或SKU不存在

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:10:48