Android Google Play Billing消耗型内购报错Response code:6求助
排查Google Play Billing消耗型内购响应码6(ITEM_NOT_OWNED)问题
错误码含义
响应码6对应Google Play Billing的ITEM_NOT_OWNED错误,说明尝试消耗的商品不属于当前登录的Google账号,或者商品已经被消耗、退款,从未被购买过。
核心排查步骤
确认购买流程的正确性
消耗操作必须在购买成功且Google Play返回有效的Purchase对象之后执行。如果直接使用硬编码的token,或者从本地缓存中获取过期/无效token,必然触发该错误。正确流程应为:- 发起购买请求
- 在
onPurchasesUpdated回调中接收购买结果 - 仅当购买状态为
Purchase.PurchaseState.PURCHASED时,再调用consumeAsync
检查Purchase对象的有效性
调用consumeAsync前,必须验证Purchase对象的关键信息:purchase.getPurchaseState()是否等于Purchase.PurchaseState.PURCHASEDpurchase.isAcknowledged()是否为false(消耗型商品无需手动确认,但已确认的商品状态可能异常)- 必须使用回调返回的原始Purchase对象的token,而非自定义拼接或存储的旧token
验证测试环境一致性
- 确保测试使用的是Google Play Console配置的测试账号,且已添加到应用测试人员列表
- 测试商品必须是Google Play Console中已发布的测试商品(草稿状态商品无法正常购买)
- 确认设备登录的Google账号与测试账号一致,无账号切换情况
排查consumeAsync调用时机
即使调整过调用位置,也要避免以下错误场景:- 购买流程未完成时提前调用(比如用户未完成支付就触发消耗)
- 重复调用消耗同一个token(第一次消耗成功后,再次调用会返回ITEM_NOT_OWNED)
- 在主线程外调用时,未确保BillingClient处于
READY状态(BillingClient必须就绪才能执行消耗操作)
代码检查要点
错误示例(使用无效token或未验证Purchase状态):
String invalidToken = "xxx"; billingClient.consumeAsync( ConsumeParams.newBuilder().setPurchaseToken(invalidToken).build(), (billingResult, purchaseToken) -> { if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) { Log.e("Billing", "Error consuming purchase with token. Response code:" + billingResult.getResponseCode()); } } );
正确实现(在购买回调中处理):
@Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { // 先验证购买状态 if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { // 执行消耗操作 ConsumeParams consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.consumeAsync(consumeParams, (consumeResult, token) -> { if (consumeResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 消耗成功,发放商品 } else { Log.e("Billing", "Error consuming purchase with token. Response code:" + consumeResult.getResponseCode()); } }); } } } }
- 调用
consumeAsync前,可通过billingClient.isReady()检查客户端状态 - 避免在购买失败、取消的分支中执行消耗操作
额外注意事项
- 测试环境需在Google Play Console中启用应用内商品测试,并将测试账号添加到许可测试列表
- 检查是否存在退款或取消购买的情况,这类操作会导致商品所有权失效
- 若使用本地存储的Purchase信息,需确保存储的是最新、有效的Purchase对象,而非过期数据
内容的提问来源于stack exchange,提问作者SHANMUKHA SAI PITHANI
相关产品推荐
相关产品推荐

