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

如何使用Play Billing Library v6.0.1查询历史一次性购买商品

查询Play Billing Library 6.0.1历史一次性购买项的实现方案

在Play Billing Library v6.x中,确实没有像IABv3那样直接的isPurchased()方法,需要通过BillingClient主动查询购买记录并过滤校验。以下是针对一次性非消耗型购买项的查询实现代码:

Kotlin 实现

1. 初始化BillingClient

private lateinit var billingClient: BillingClient

fun initBillingClient(context: Context) {
    billingClient = BillingClient.newBuilder(context)
        .setListener { _, _ -> } // 若无需实时监听购买更新,可留空实现;如需处理实时购买,补充逻辑
        .enablePendingPurchases()
        .build()

    billingClient.startConnection(object : BillingClientStateListener {
        override fun onBillingSetupFinished(result: BillingResult) {
            if (result.responseCode == BillingClient.BillingResponseCode.OK) {
                // 连接成功后执行查询
                queryNonConsumablePurchases()
            }
        }

        override fun onBillingServiceDisconnected() {
            // 断开连接后自动重连
            billingClient.startConnection(this)
        }
    })
}

2. 查询并校验购买记录

private fun queryNonConsumablePurchases() {
    val queryParams = QueryPurchasesParams.newBuilder()
        .setProductType(BillingClient.ProductType.INAPP) // 指定查询一次性内购商品
        .build()

    billingClient.queryPurchasesAsync(queryParams) { billingResult, purchases ->
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
            // 过滤出已确认的有效购买记录:状态为已购买 + 已完成确认
            val validPurchases = purchases.filter {
                it.purchaseState == Purchase.PurchaseState.PURCHASED && it.isAcknowledged
            }

            // 检查目标商品是否已购买
            val targetProductId = "your_target_product_id"
            val isProductOwned = validPurchases.any { it.products.contains(targetProductId) }

            // 根据结果处理业务逻辑
            if (isProductOwned) {
                // 商品已购买,执行解锁等操作
            } else {
                // 未购买,引导用户购买
            }
        } else {
            // 查询失败,处理错误(如提示用户重试)
        }
    }
}

Java 实现

1. 初始化BillingClient

private BillingClient billingClient;

public void initBillingClient(Context context) {
    billingClient = BillingClient.newBuilder(context)
            .setListener((billingResult, purchases) -> {}) // 按需补充实时购买监听逻辑
            .enablePendingPurchases()
            .build();

    billingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                queryNonConsumablePurchases();
            }
        }

        @Override
        public void onBillingServiceDisconnected() {
            billingClient.startConnection(this);
        }
    });
}

2. 查询并校验购买记录

private void queryNonConsumablePurchases() {
    QueryPurchasesParams queryParams = QueryPurchasesParams.newBuilder()
            .setProductType(BillingClient.ProductType.INAPP)
            .build();

    billingClient.queryPurchasesAsync(queryParams, (billingResult, purchases) -> {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
            List<Purchase> validPurchases = new ArrayList<>();
            for (Purchase purchase : purchases) {
                // 筛选有效购买记录
                if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED
                        && purchase.isAcknowledged()) {
                    validPurchases.add(purchase);
                }
            }

            // 检查目标商品是否已购买
            String targetProductId = "your_target_product_id";
            boolean isProductOwned = false;
            for (Purchase purchase : validPurchases) {
                if (purchase.getProducts().contains(targetProductId)) {
                    isProductOwned = true;
                    break;
                }
            }

            // 业务逻辑处理
            if (isProductOwned) {
                // 商品已购买
            } else {
                // 未购买
            }
        } else {
            // 查询失败处理
        }
    });
}

关键说明

  • queryPurchasesAsync:获取当前用户所有有效的非消耗型购买记录(已完成购买且未被退款/撤销),是判断用户是否拥有商品的核心接口。
  • 双重校验:必须同时检查purchaseState == PURCHASED(确认购买状态有效)和isAcknowledged(确认购买已被你的应用确认,避免处理未完成的pending订单)。
  • 若需查询历史购买记录(包括已退款的),可使用queryPurchaseHistoryAsync,但该接口仅返回最近的购买记录,且状态可能失效,通常不用于判断商品所有权。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:23:18