You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:21:00