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

Play Integrity API调用报403错误,Firebase App Check集成故障求助

Firebase App Check集成Cloud Function失败排查

应用端App Check初始化(Main Activity)

FirebaseApp.initializeApp(this)
Firebase.appCheck.installAppCheckProviderFactory(
    PlayIntegrityAppCheckProviderFactory.getInstance(),
)

Logcat错误信息:
Error getting App Check token; using placeholder token instead. Error: com.google.firebase.FirebaseException: Error returned from API. code: 403 body: App attestation failed.

Python Cloud Function代码

from firebase_functions import https_fn
from google.auth import default
from googleapiclient.discovery import build
from firebase_admin import initialize_app

# Initialize the Firebase Admin SDK
initialize_app()


@https_fn.on_call(
    enforce_app_check = True
)
def verify_purchase(req: https_fn.CallableRequest) -> dict:
    """Callable Cloud Function to verify Android subscription purchases."""
    print("Request: ", req)
    try:
        # Use Application Default Credentials (ADC)
        credentials, _ = default(scopes=['https://www.googleapis.com/auth/androidpublisher'])
        androidpublisher = build('androidpublisher', 'v3', credentials=credentials)
    except Exception as e:
        raise https_fn.HttpsError(
            code=https_fn.FunctionsErrorCode.INTERNAL,
            message="Failed to initialize credentials or service",
            details=str(e)
        )

    # Extracting request data
    purchase_token = req.data.get('token')
    print("Purchase Token: ", purchase_token)
    subscription_id = req.data.get('subscription_id')
    print("Subscription ID: ", subscription_id)
    package_name = "" #Ive added this in my real code

    if not purchase_token:
        raise https_fn.HttpsError(
            code=https_fn.FunctionsErrorCode.INVALID_ARGUMENT,
            message="Token is required"
        )

    if not subscription_id:
        raise https_fn.HttpsError(
            code=https_fn.FunctionsErrorCode.INVALID_ARGUMENT,
            message="Subscription ID is required"
        )

    try:
        subscription = androidpublisher.purchases().subscriptions().get(
            packageName=package_name,
            subscriptionId=subscription_id,
            token=purchase_token
        ).execute()

        return {"data": subscription}
    except Exception as e:
        raise https_fn.HttpsError(
            code=https_fn.FunctionsErrorCode.UNKNOWN,
            message="Error verifying subscription",
            details=str(e)
        )

应用端调用函数代码

private fun verifyPurchaseWithFirebase(purchaseToken: String, subscriptionId: String) {
    val data = hashMapOf(
        "token" to purchaseToken,
        "subscription_id" to subscriptionId
    )

    Log.d(TAG, "Verifying purchase with token: $purchaseToken")
    Log.d(TAG, "Data to send to Firebase: $data")

    functions
        .getHttpsCallable("verify_purchase")
        .call(data)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Purchase verified successfully with Firebase")
                val result = task.result?.data as? Map<String, Any>
                if (result != null) {
                    updateUserSubscriptionStatus(result)
                } else {
                    Log.e(TAG, "No data received from Firebase function")
                }
            } else {
                Log.e(TAG, "Failed to verify purchase with Firebase", task.exception)
            }
        }
}

已完成配置及当前状态

  • 已在Firebase配置256位SHA指纹,Play Integrity验证提供商状态为已注册
  • 已启用Play Integrity API,但错误率100%
  • Play控制台显示Integrity API集成仅处于"已开始"状态,云项目已关联,解绑重绑并等待半天仍未解决

请问我是否遗漏了配置?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:48:09