Android Java实现App启动时用户订阅状态检查的方法
Android应用启动时检查订阅状态的实现方案
现有代码仅能监听支付流程中的即时购买/取消事件,无法在应用重启后主动验证用户的订阅状态。要实现启动时自动检查订阅,需通过BillingClient主动查询Google Play服务器上的用户订阅记录,具体实现如下:
一、编写订阅查询函数
通过queryPurchasesAsync方法异步查询用户已购买的订阅,获取最新状态:
private void checkSubscriptionStatus() { if (billingClient == null || !billingClient.isReady()) { Log.d("SubscriptionCheck", "BillingClient未连接或未就绪"); return; } QueryPurchasesParams queryParams = QueryPurchasesParams.newBuilder() .setProductType(BillingClient.ProductType.SUBS) .build(); billingClient.queryPurchasesAsync(queryParams, (billingResult, purchases) -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) { boolean hasActiveSubscription = false; // 遍历所有订阅,判断是否存在有效状态的订阅 for (Purchase purchase : purchases) { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { // 若订阅未确认,先完成确认流程(Google Play要求必须确认) if (!purchase.isAcknowledged()) { acknowledgePurchase(purchase); } hasActiveSubscription = true; break; } } Constant.subscription = hasActiveSubscription; Log.d("SubscriptionCheck", "当前订阅状态:" + hasActiveSubscription); } else { Constant.subscription = false; Log.d("SubscriptionCheck", "查询失败:" + billingResult.getDebugMessage()); } }); } // 订阅确认方法(处理未确认的订阅订单) private void acknowledgePurchase(Purchase purchase) { AcknowledgePurchaseParams acknowledgeParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase(acknowledgeParams, billingResult -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { Log.d("SubscriptionCheck", "订阅确认成功"); } else { Log.d("SubscriptionCheck", "订阅确认失败:" + billingResult.getDebugMessage()); } }); }
二、在应用启动时触发查询
在应用启动入口(如Application的onCreate或主Activity的onCreate)中,确保BillingClient连接成功后调用查询函数:
// 示例:在MainActivity的onCreate中实现 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化并连接BillingClient billingClient = BillingClient.newBuilder(this) .enablePendingPurchases() .setListener(purchasesUpdatedListener) .build(); billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // BillingClient就绪,启动时检查订阅状态 checkSubscriptionStatus(); } } @Override public void onBillingServiceDisconnected() { // 处理连接断开,可添加重连逻辑 } }); }
三、修正现有代码的错误
订阅属于非消耗型商品,无需调用consumeAsync消费,原handlePurchase中的消费逻辑会导致订阅状态丢失,需修改为:
void handlePurchase(Purchase purchase) { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { if (!purchase.isAcknowledged()) { acknowledgePurchase(purchase); } Constant.subscription = true; Log.d("purchaseListners", "订阅购买成功"); } }
关键说明
- 订阅有效性判断以
Purchase.getPurchaseState()的PURCHASED状态为准; - 未确认的订阅必须调用
acknowledgePurchase完成确认,否则Google Play会在3天后自动退款; - 通过
queryPurchasesAsync查询的是Google Play服务器的实时数据,避免本地状态丢失或篡改。
内容的提问来源于stack exchange,提问作者IT Student
相关产品推荐
相关产品推荐

