BillingClient Purchase.getProducts()为何返回多个产品ID?
BillingClient 5.0+ 版本
getProducts()返回多产品ID的原因 先对应各版本API变更情况:
- 3.x及更早版本:仅提供
getSku()方法,固定返回单个SKU字符串,匹配当时单条购买记录仅对应单个商品的产品设计 - 4.0.0~4.x版本:新增
getSkus()方法,返回值为SKU字符串列表,原getSku()被标记为废弃 - 5.0.0及后续版本:彻底移除废弃的
getSku()方法,将getSkus()重命名为getProducts(),方法逻辑保持一致,返回当前购买记录关联的所有产品ID列表
接口改为返回多标识符的核心原因
这个API调整是为了适配Google Play结算体系的几类核心业务场景,属于前置的接口能力铺垫,不是文档疏漏:
- 组合订阅场景:新版Play订阅模型支持一个订阅订单下同时绑定多个基础计划、附加权益包、专属优惠项,每个权益项都有独立的产品ID,原来的单值返回无法完整携带组合订阅的所有权益信息
- 多商品合单支付场景:Play结算后续开放了单次结算流程同时购买多个消耗型/非消耗型商品的能力,支付完成后单条Purchase记录会关联整单内所有商品的ID,不需要再为每个商品单独生成独立的购买记录,降低客户端和服务端的订单校验成本
- 产品迁移兼容场景:如果开发者在Play后台做过SKU合并、ID调整、旧产品下线映射到新产品的操作,系统会在老用户的历史购买记录里同时保留旧SKU ID和新产品ID,避免客户端版本升级后无法识别老用户的已购权益,减少权益丢失类客诉
实际开发适配提示:目前普通单商品购买、单基础计划订阅的常规场景下,
getProducts()返回的列表长度仍然为1,你只需要把原来读取单个SKU的逻辑改成遍历列表处理即可,不需要额外做特殊分支判断。
内容的提问来源于stack exchange,提问作者AseN
相关产品推荐
相关产品推荐

