Google Play订阅:Android端如何检测订阅是否已自动续费
可行解决方案
核心原理说明
Google Play订阅自动续费完成后,对应订阅的Purchase对象会更新两个核心字段,你之前没注意到这两个字段的变化:
orderId:首单为普通订单号格式,后续每续费一次后缀会累加.1/.2/.3依次递增purchaseTime:会更新为最新一次续费成功的时间戳
你遇到的查询结果无变化的问题,大概率是本地缓存未更新,或是调用方法的版本不对。
客户端侧实现步骤
- 替换过时的查询方法
你现在用的queryPurchases是Google Play Billing Library 4.0及之前的过时同步方法,优先改用最新的异步查询方法获取实时数据:
billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder() .setProductType(BillingClient.SkuType.SUBS) .build(), new PurchasesResponseListener() { @Override public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !purchases.isEmpty()) { for (Purchase purchase : purchases) { if (purchase.getSku().equals("你的订阅SKU") && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { // 在这里判断续费状态 String currentOrderId = purchase.getOrderId(); long currentPurchaseTime = purchase.getPurchaseTime(); // 对比本地/服务端存储的上一次订单号/购买时间 // 如果orderId后缀数字更大,或purchaseTime晚于上一次记录时间,即为已完成自动续费 } } } } });
- 补充自动续费开关状态判断
如果需要额外判断用户是否开启了后续的自动续费权限,直接调用purchase.isAutoRenewing()即可,返回true代表自动续费处于开启状态,到期前会自动扣费。
服务端侧实现(更安全,推荐优先使用)
客户端数据存在被篡改的风险,生产环境建议用服务端验证订阅状态:
- 把客户端拿到的
purchaseToken传到你的服务端 - 服务端调用Google Play Developer API的订阅查询接口
- 接口返回的
orderId、startTimeMillis、expiryTimeMillis字段可以准确判断是否完成续费,同时还能校验订阅的真实性,防止破解。
注意事项
- 同一个订阅的
purchaseToken终身不变,不要用这个字段判断续费状态 - 尽量不要依赖
queryPurchaseHistoryAsync的返回结果,这个接口返回的是所有历史购买记录,包含已过期的订阅,排序规则也不是最新在前,容易误判 - 如果调用查询方法还是拿不到最新数据,可以尝试调用
billingClient.querySkuDetailsAsync主动拉取一次最新的商品信息,触发本地缓存更新
内容的提问来源于stack exchange,提问作者DevTest
相关产品推荐
相关产品推荐

