Google Billing Library v4 内购状态校验及退款后权限残留问题咨询
问题1:是否可以使用queryPurchasesAsync()判断用户是否已购买对应内购商品?
可以使用,该接口是Google Play Billing Library 4.0及以上版本官方提供的标准购买查询接口,用于读取Google Play服务本地缓存的有效购买数据,响应速度快,完全符合启动时校验权限的场景。需要注意的是该接口默认读取本地缓存,不会每次都实时请求Google服务端,存在数据更新延迟的可能性。
问题2:如何解决用户退款后仍保留高级版权限的问题?
你现有代码的核心问题是仅实现了符合购买条件时设置高级版状态的逻辑,没有补充不符合条件时重置状态的分支,因此一旦全局变量被设为true,除非应用数据被清空,否则状态不会被覆盖更新。你可以按以下方案修改:
- 补全状态重置逻辑,只要校验不满足有效购买条件,就将全局
isPremium设为false - 增加
queryPurchaseHistoryAsync接口补充校验,该接口会直接请求Google服务端拉取最新购买历史,不受本地缓存延迟影响,解决退款后本地数据未更新的问题 - 遍历所有返回的购买项匹配对应SKU,不要仅取列表第一个元素,避免其他内购商品干扰判断
修改后的参考代码如下:
public void checkIsPremium(){ boolean isPremium = false; String PREMIUM_SKU = "替换为你的高级版商品SKU"; if (billingClient != null && billingClient.isReady()){ // 第一步:先查询本地缓存的有效购买 billingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP, (billingResult, list) -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !list.isEmpty()){ for (Purchase purchase : list) { if (purchase.getSku().equals(PREMIUM_SKU) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && purchase.isAcknowledged() && verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())){ isPremium = true; break; } } } // 先更新一次本地缓存对应的状态 AppGlobal.getInstance().setIsPremium(isPremium); // 第二步:请求服务端最新购买历史,修正本地缓存延迟问题 billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP, (historyResult, historyList) -> { boolean serverSidePremium = false; if (historyResult.getResponseCode() == BillingClient.BillingResponseCode.OK && historyList != null && !historyList.isEmpty()){ for (PurchaseHistoryRecord record : historyList) { if (record.getSku().equals(PREMIUM_SKU) && verifyValidSignature(record.getOriginalJson(), record.getSignature())){ serverSidePremium = true; break; } } } // 用服务端返回的最新状态覆盖本地状态 AppGlobal.getInstance().setIsPremium(serverSidePremium); }); }); } else { // billingClient不可用时直接设为非高级版 AppGlobal.getInstance().setIsPremium(false); } }
补充说明:如果你的高级版是订阅类型,需要将代码中的
BillingClient.SkuType.INAPP替换为BillingClient.SkuType.SUBS。
内容的提问来源于stack exchange,提问作者Riggel
相关产品推荐
相关产品推荐

