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

原生Android Google Play Billing库购买成功后查询购买列表为空

问题核心原因

  • 1. 非消耗型内购被错误消费
    你当前售卖的是「移除广告」类型的永久生效内购,属于非消耗型商品,但代码中在购买成功后主动调用了billingClient.consumeAsync()接口消费该商品。商品被消费后会被标记为「已使用」,自然无法再通过queryPurchases接口查询到记录。
    消耗接口仅适用于一次性消耗的商品(比如金币、限时道具),永久生效的非消耗型商品、订阅类商品都不应该调用消费接口。

  • 2. 代码执行顺序错误,BillingClient未初始化就调用查询
    你贴出的代码逻辑顺序存在明显错误:先执行if (billingClient.isReady())的查询逻辑,之后才执行billingClient = BillingClient.newBuilder(...).build()初始化操作。页面跳转后如果BillingClient实例被回收重建,还没完成初始化就调用查询,自然返回空列表。
    正确顺序应该是:先初始化BillingClient,调用startConnection()连接成功后,再执行查询购买记录的逻辑。

  • 3. 旧同步查询接口缓存未同步
    你使用的queryPurchases()是谷歌已不推荐的同步查询接口,仅会查询本地缓存的购买记录,跳转页面后如果本地缓存还未和Google Play服务同步,就会返回空列表。
    推荐改用官方建议的异步查询接口queryPurchasesAsync(),会直接请求Google Play服务拉取最新的购买记录,不受本地缓存影响。

  • 4. 未正确确认购买导致交易超时回滚
    如果购买成功后3天内没有调用确认接口(消费接口也算隐式确认),交易会被谷歌自动回滚,购买记录也会被清除。你当前代码调用了消费接口,这个问题出现概率较低,但如果后续修改了消费逻辑需要注意:非消耗型商品要调用acknowledgePurchase()确认交易,不需要消费。

修复方案

  1. 移除非消耗型商品的consumeAsync()调用逻辑,改为调用acknowledgePurchase()确认交易即可
  2. 调整代码顺序,确保BillingClient初始化并连接成功后,再执行购买记录查询
  3. 把queryPurchases()替换为queryPurchasesAsync()异步查询接口,获取最新的购买记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:15:02