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

Flutter应用Google Play内购订阅周期显示错误:应为/week却显示/min

问题解决思路

核心问题定位

你代码里犯了一个关键错误:用非消耗品购买方法buyNonConsumable()处理订阅产品。Google Play订阅有专门的购买API,误用非消耗品方法会导致SDK对订阅周期的解析逻辑异常,这大概率是UI显示周期错误的原因。

具体修复步骤

1. 替换购买方法为订阅专用API

将buyNonConsumable替换为buySubscriptions,这是Flutter In-App Purchase插件处理订阅的标准方法:

Future<void> buySubscription(String productTitle) async {
  if (isPurchaseInProgress.value == true) {
    print("Purchase already in progress");
    return;
  }

  final productDetails = await _getProductDetails(productTitle.toLowerCase());
  late PurchaseParam purchaseParam;

  if (Platform.isAndroid) {
    purchaseParam = GooglePlayPurchaseParam(productDetails: productDetails);
  } else {
    purchaseParam = PurchaseParam(productDetails: productDetails);
  }

  // 使用订阅专用购买方法
  await InAppPurchase.instance.buySubscriptions(purchaseParam: purchaseParam);
  await Future.delayed(3000.milliseconds);
}

2. 确保产品详情查询正确

检查_getProductDetails方法,确认查询的是订阅类型的产品,而非非消耗品。查询时要明确指定订阅产品ID:

Future<ProductDetails> _getProductDetails(String productId) async {
  final queryParams = ProductDetailsQueryParameters(
    subscriptionProductIds: [productId], // 这里要传订阅ID,不是非消耗品ID
  );
  final response = await InAppPurchase.instance.queryProductDetails(queryParams);
  
  if (response.error != null) {
    throw Exception("Failed to fetch product details: ${response.error}");
  }
  if (response.productDetails.isEmpty) {
    throw Exception("Product $productId not found");
  }
  
  return response.productDetails.first;
}

3. 正确展示订阅价格和周期

UI展示时,直接使用ProductDetails提供的priceString和subscriptionPeriod字段,不要手动解析周期标识(比如P1W):

// 示例:在UI中展示订阅信息
Text("${productDetails.priceString} / ${_getPeriodText(productDetails.subscriptionPeriod)}")

// 辅助方法:将SubscriptionPeriod转为可读文本
String _getPeriodText(SubscriptionPeriod period) {
  switch (period.unit) {
    case SubscriptionPeriodUnit.day:
      return "${period.numberOfUnits}天";
    case SubscriptionPeriodUnit.week:
      return "${period.numberOfUnits}周";
    case SubscriptionPeriodUnit.month:
      return "${period.numberOfUnits}月";
    case SubscriptionPeriodUnit.year:
      return "${period.numberOfUnits}年";
    default:
      return "";
  }
}

额外验证点

  • 确认Play控制台中该产品的订阅周期确实是“每周”(P1W),且没有设置促销或入门价导致显示异常。
  • 测试时使用正式的测试账号,确保从Play Store获取的产品数据是最新配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:32:56