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

Firebase邮箱密码登录下,如何区分不同账号的Google Play订阅状态?

问题分析与解决方案

核心问题在于订阅绑定Google账号,而你的服务权限绑定Firebase账号,两者未做关联校验,导致用户切换Firebase账号时,只要当前设备登录的Google账号有订阅,应用就会误判权限。以下是具体解决步骤:

1. 强制关联Google账号与Firebase账号

确保用户的Firebase账号必须和购买订阅的Google账号绑定:

  • 如果用户用非Google方式登录Firebase(如邮箱),增加「关联Google账号」流程,要求用户使用购买订阅的Google账号完成关联;
  • 优先引导用户通过Firebase Auth的Google登录方式注册/登录,直接将Firebase UID与Google账号ID绑定。

2. 购买时标记订阅归属

发起订阅购买请求时,将当前Firebase用户关联的Google账号ID传入obfuscatedAccountId,让Google Play记录该订阅的归属账号:

// 获取当前Firebase用户关联的Google账号ID
val currentFirebaseUser = FirebaseAuth.getInstance().currentUser
val linkedGoogleAccountId = currentFirebaseUser?.providerData?.find { it.providerId == "google.com" }?.uid

// 构建购买参数时传入账号标记
val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(skuDetails)
    .setObfuscatedAccountId(linkedGoogleAccountId) // 绑定订阅与Google账号
    .build()

billingClient.launchBillingFlow(activity, billingFlowParams)

3. 校验订阅与当前Firebase账号的匹配性

修改订阅状态检查逻辑,不仅验证订阅有效性,还要确认该订阅属于当前Firebase账号关联的Google账号:

val currentFirebaseUser = FirebaseAuth.getInstance().currentUser
val linkedGoogleAccountId = currentFirebaseUser?.providerData?.find { it.providerId == "google.com" }?.uid

billingClient.queryPurchasesAsync(params) { billingResult, purchases ->
    if (billingResult.responseCode == BillingResponseCode.OK) {
        purchases.any { purchase ->
            purchase.purchaseState == PurchaseState.PURCHASED && 
            purchase.isAcknowledged &&
            // 关键:校验订阅归属的Google账号与当前Firebase绑定的账号一致
            linkedGoogleAccountId != null &&
            purchase.accountIdentifiers?.obfuscatedAccountId == linkedGoogleAccountId
        }
    }
}

4. 后端做最终权限校验(必加,防客户端篡改)

客户端校验可被绕过,必须在Firebase Cloud Functions中做最终验证:

  1. 客户端请求服务(如生成求职信)时,携带purchaseToken和当前Firebase UID;
  2. 后端调用Google Play Developer API的purchases.subscriptions:get接口,验证purchaseToken的有效性;
  3. 同时校验返回结果中的obfuscatedAccountId是否与该Firebase用户绑定的Google账号ID一致;
  4. 只有双重验证通过,才允许用户使用付费服务。

5. 账号切换时重置状态

当用户切换Firebase账号时,立即清空本地订阅状态缓存,重新执行订阅校验流程,避免缓存导致的权限误判。

内容的提问来源于stack exchange,提问作者Yauheni Mokich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:16