Flutter in_app_purchase查询≥4个商品ID时部分商品无法找到
问题原因
这个问题是Flutter官方IAP插件Android端实现in_app_purchase_android低版本的已知逻辑bug,和Google Play支付接口本身能力、后台商品配置无关:
- 插件内部调用Google Play Billing接口查询商品时,需要先把传入的ID按商品类型拆分:消耗型、非消耗型属于
inapp类型,订阅属于subs类型,两类ID必须放到独立请求中发送。 - 低版本插件的列表分片逻辑存在索引计算错误:当单次传入的ID总数量≥4时,会漏传1个ID给底层Billing接口,直接导致该ID被归到
notFoundIDs列表。你测试出的「≥4个必丢1个、<4个全部正常」的规律,和这个bug的触发特征完全吻合。
修复方案
按优先级选择对应方案即可:
- 升级依赖版本:将
pubspec.yaml中in_app_purchase、in_app_purchase_android依赖升级至最新稳定版。该分片bug在2022年底发布的正式版本中已完成修复,升级后原有业务代码无需任何改动,即可正常返回全量商品详情。 - 若项目存在历史版本兼容限制无法升级依赖,手动拆分查询请求:不要将不同类型的商品ID混在同一次调用中传入,将消耗型商品、订阅商品拆分为两次独立查询,同时保证单次传入的同类型ID数量不超过3个,参考实现如下:
// 按商品类型拆分ID集合 const consumeProductIds = <String>{'consume1', 'consume2'}; const subProductIds = <String>{'test', 'test2'}; // 分两次发起查询 final consumeResponse = await iapConnection.queryProductDetails(consumeProductIds); final subResponse = await iapConnection.queryProductDetails(subProductIds); // 合并查询结果后续使用即可 final allProductDetails = [ ...consumeResponse.productDetails, ...subResponse.productDetails, ]; final allNotFoundIds = [ ...consumeResponse.notFoundIDs, ...subResponse.notFoundIDs, ];
- 若后续同类型商品数量增长超过3个,额外对同类型ID做手动分片,每3个ID为一组发起查询,最后合并所有分组的查询结果即可完全绕开低版本插件的分片逻辑bug。
注:你的场景已经排除Google Play后台商品配置问题——当单次查询ID数量小于4时
test2可以正常返回,说明该商品已完成激活、状态同步正常,不需要额外调整后台配置。
内容的提问来源于stack exchange,提问作者jorrhukmb
相关产品推荐
相关产品推荐

