Flutter:如何获取同一订阅下的不同套餐方案
解决同一订阅下多套餐的获取与选择问题
核心问题梳理
Google Play的订阅结构是「订阅产品」包含多个「订阅套餐(SKU)」,你需要确保Flutter内购逻辑能正确获取到同一个订阅下的所有SKU,而不是只拿到第一个。
具体解决方案
确认Google Play后台配置
- 登录Google Play控制台,找到你的
basic订阅产品,确认已创建basic-month和basic-year两个独立套餐,且每个套餐的SKU与你代码中填写的完全一致(大小写、字符都不能错) - 确保这两个套餐都已发布到测试轨道(内部测试/封闭测试均可),并且测试账号已添加到许可测试列表
- 登录Google Play控制台,找到你的
修正Flutter中的产品ID列表
把两个套餐的SKU都加入到产品ID列表中,不要只保留一个:const List<String> _androidProductIds = <String>[ 'plus', 'pro', 'basic-month', 'basic-year', ];正确获取订阅产品详情
使用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两个套餐的所有信息(价格、订阅周期等),你可以把这些信息展示给用户选择。发起对应套餐的购买
用户选择某个套餐后,用该套餐对应的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
相关产品推荐
相关产品推荐

