使用Google Play Billing queryPurchasesAsync查询到空订阅列表,但实际存在有效订阅
Google Play Billing Library查询订阅返回空列表的排查方案
调用queryPurchasesAsync查询订阅时返回空列表,但实际存在有效订阅;已尝试清空Play Store缓存,使用的是Billing Library 6.0.1版本。结合提供的代码,可从以下几个方向排查解决:
1. 修复连接时序问题
当前代码中,若billingClientConnected为false,调用startBillingClientConnection()后不会等待连接完成就结束逻辑,导致查询操作未执行。需确保连接成功后触发查询:
public void queryPurchases() { if (!billingClientConnected) { billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@NonNull BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { billingClientConnected = true; // 连接成功后执行订阅查询 performSubscriptionQuery(); } } @Override public void onBillingServiceDisconnected() { billingClientConnected = false; } }); } else { performSubscriptionQuery(); } } // 提取查询逻辑到独立方法,便于复用 private void performSubscriptionQuery() { QueryPurchasesParams subsPurchasesParams = QueryPurchasesParams.newBuilder() .setProductType(BillingClient.ProductType.SUBS) .build(); billingClient.queryPurchasesAsync(subsPurchasesParams, new PurchasesResponseListener() { @Override public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> purchaseList) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { purchases.clear(); for (Purchase purchase : purchaseList) { handlePurchase(purchase); } } } }); }
2. 补充历史订阅查询
queryPurchasesAsync依赖本地缓存,可通过queryPurchaseHistoryAsync查询云端历史记录作为补充,验证是否能获取到订阅信息:
private void queryPurchaseHistory() { QueryPurchaseHistoryParams params = QueryPurchaseHistoryParams.newBuilder() .setProductType(BillingClient.ProductType.SUBS) .build(); billingClient.queryPurchaseHistoryAsync(params, new PurchaseHistoryResponseListener() { @Override public void onQueryPurchaseHistoryResponse(@NonNull BillingResult billingResult, @Nullable List<PurchaseHistoryRecord> purchaseHistoryRecords) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchaseHistoryRecords != null) { // 遍历历史记录,可通过purchaseToken验证订阅当前有效性 for (PurchaseHistoryRecord record : purchaseHistoryRecords) { // 处理逻辑 } } } }); }
3. 其他排查点
- 账号一致性:确认设备登录的Google账号与购买订阅的账号一致,多账号环境下可切换账号重试。
- 订阅有效性:检查订阅是否处于有效状态(未过期、未取消),测试环境需确保测试账号已正确配置。
- 缓存彻底刷新:清空Play Store缓存后,重启设备或重新登录Google账号,确保缓存完全更新。
- 订阅回调处理:完善
PurchasesUpdatedListener的onPurchasesUpdated方法,确保订阅状态变化时能及时更新本地列表。
内容的提问来源于stack exchange,提问作者Jorn Rigter
相关产品推荐
相关产品推荐

