Flutter Firebase OTP迁移Play Integrity后无法自动验证问题咨询
Firebase OTP迁移Play Integrity失效排查修复方案
1. 先升级不兼容的依赖版本
你当前使用的依赖版本过旧,对Play Integrity的自动验证适配存在已知bug,根本无法完整支持新的校验链路,必须升级到最低兼容版本:
- Flutter端pubspec.yaml依赖调整为:
firebase_core: ^2.15.0 firebase_auth: ^4.7.0
- Android端build.gradle的classpath调整为:
classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
升级后如果遇到Android 13+通知权限编译报错,在AndroidManifest.xml补充POST_NOTIFICATIONS权限声明即可,不影响OTP核心逻辑。
2. 修正错误的Play Integrity配置
- 立刻弃用你新建的Firebase项目,切回原有项目。完全不需要删除原有SafetyNet配置,Firebase官方支持SafetyNet和Play Integrity并行启用,过渡期会自动做版本兜底,新建项目反而会打乱应用签名、服务关联的原有配置,是故障核心诱因之一。切回原项目后,直接在Firebase控制台「Authentication-设置-应用验证」页面打开Play Integrity开关即可,原有SafetyNet配置不用改动。
- 补全所有环境的签名指纹:把本地Debug签名、本地Release签名、Play Store托管签名(开了Play应用签名功能后,应用上架后的实际签名由Google托管,这个指纹漏加概率超过80%)的SHA-1、SHA-256值全部加到Firebase项目的应用配置页。
- 到对应关联的Google Cloud控制台API库中,手动启用「Play Integrity API」,默认新建项目不会自动开启该接口,未开启时所有校验请求会被直接拦截。
- 所有配置改完后,重新下载最新的
google-services.json替换项目中Android目录下的旧配置文件,不要用缓存的旧文件。
3. 关于Debug包失效、短信带(unreviewed)标记的说明
这两个现象和应用是否处于待审核状态没有直接关系,是配置错误的典型表现:
- 短信后缀带
(unreviewed),说明当前应用签名没有和Play Integrity校验链路打通,触发了未验证应用降级逻辑,这个状态下Google会强制禁用OTP自动验证能力,不管Debug还是Release包都无法自动填充验证码。 - Debug包自动验证失效,是因为你切换到新Firebase项目后,没有把本地Debug keystore的签名指纹加到新项目配置里,加上提交审核后Play侧校验规则收紧,直接拦截了Debug环境的校验请求。
- 不要在审核阶段反复切换SafetyNet/Play Integrity配置,会触发Google反滥用风控,把包名标记为高风险,遇到这种情况至少等24小时风控重置后再测试。
4. 生效验证步骤
所有配置调整完成后按以下顺序测试,避免缓存干扰:
- 先卸载测试机上所有旧版本应用,清除Google Play服务缓存,避免旧的校验token缓存影响结果。
- 优先用本地Release签名的安装包测试,不要直接用Debug包测——Debug环境默认会被Play Integrity判定为非可信环境,部分机型不会返回自动验证结果。
- 等应用在Play Store审核通过正式上架后,再从Play Store下载正式包测试。未上架的包即使处于审核流程中,Play Integrity也不会返回完整的可信判定,自动验证大概率失败。
- 如果切回原项目配置后还是无法恢复,直接在Firebase控制台提交工单,让后台人员重置应用的App verification状态,大部分风控拦截类问题,后台重置后1小时内即可恢复。
内容的提问来源于stack exchange,提问作者Arif
相关产品推荐
相关产品推荐

