如何在Play Billing Library v5.0中查询用户当前订阅的优惠方案
解决方案
要获取用户当前订阅的优惠方案(offer1/offer2),你需要利用Google Play Billing返回的Purchase对象中的隐藏字段,具体步骤如下:
核心方法:解析Purchase的原始JSON
queryPurchasesAsync返回的Purchase对象虽然公开API未直接提供优惠方案信息,但它的getOriginalJson()方法返回的JSON字符串包含了完整的订阅详情,其中就包含用户订阅的offer标识:
- 调用
billingClient.queryPurchasesAsync获取用户的订阅列表 - 遍历列表找到对应月度基础套餐的
Purchase实例 - 调用
purchase.getOriginalJson()获取原始JSON字符串 - 使用JSON解析库(如Gson、Jackson)解析该字符串,提取
offerId字段(或subscriptionOfferDetails数组中的offerId),即可判断用户订阅的是offer1还是offer2
示例代码(用Gson解析):
// 获取目标Purchase Purchase targetPurchase = null; for (Purchase purchase : purchases.getPurchasesList()) { if (purchase.getProductId().equals("你的月度基础套餐productId")) { targetPurchase = purchase; break; } } // 解析原始JSON获取offerId if (targetPurchase != null) { String originalJson = targetPurchase.getOriginalJson(); Gson gson = new Gson(); PurchaseJson purchaseJson = gson.fromJson(originalJson, PurchaseJson.class); String userOfferId = purchaseJson.getOfferId(); // 或从subscriptionOfferDetails中提取 // 根据userOfferId判断是offer1还是offer2 } // 对应的实体类示例 class PurchaseJson { private String offerId; // 其他需要的字段 public String getOfferId() { return offerId; } }
备选方案:查询购买历史记录
如果queryPurchasesAsync未返回所需信息,可以调用billingClient.queryPurchaseHistoryAsync获取用户最近的购买历史,PurchaseHistoryRecord同样包含getOriginalJson()方法,解析后可得到offer信息。
额外建议
- 确保使用Billing Library 5.0及以上版本,旧版本可能不包含offer相关字段
- 为了更可靠,建议在用户首次订阅时将
offerId同步到你的后端服务器,卸载重装后直接从后端拉取该信息,避免本地解析可能出现的兼容性问题
内容的提问来源于stack exchange,提问作者Priya Sindkar
相关产品推荐
相关产品推荐

