如何使用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
相关产品推荐
相关产品推荐

