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

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,必然触发该错误。正确流程应为:

    1. 发起购买请求
    2. 在onPurchasesUpdated回调中接收购买结果
    3. 仅当购买状态为Purchase.PurchaseState.PURCHASED时,再调用consumeAsync
  • 检查Purchase对象的有效性
    调用consumeAsync前,必须验证Purchase对象的关键信息:

    • purchase.getPurchaseState()是否等于Purchase.PurchaseState.PURCHASED
    • purchase.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:27:33