Flutter中Firebase短信验证码请求失败(错误码17499/39)求助
Flutter Firebase短信验证码请求失败(错误码17499/39)问题排查与解决
问题描述
完成reCAPTCHA验证后,Flutter应用触发Firebase短信验证码请求失败,日志报错:
E/FirebaseAuth(22392): [SmsRetrieverHelper] SMS verification code request failed: unknown status code: 17499 Error code:39
环境信息:
- Flutter版本:3.13.0 stable
- Gradle版本:8.0.2
- 已排查配置文件:Debug/AndroidManifest.xml、Main入口代码、pubspec.yaml、google-services.json、android/build.gradle、app/build.gradle
- 已尝试操作:更换真机/模拟器、不同手机号、调整插件版本,参考Stackoverflow/GitHub/Reddit方案均无效
排查与解决步骤
1. 补全SmsRetriever API配置
- 确保AndroidManifest.xml中添加SmsRetriever广播接收器:
<receiver android:name="com.google.android.gms.auth.api.phone.SmsRetriever" android:exported="true"> <intent-filter> <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" /> </intent-filter> </receiver> - 生成并添加签名哈希到Firebase控制台:
执行以下命令生成debug签名哈希(替换keystore路径和别名):
将生成的哈希值添加到Firebase控制台「项目设置→应用→SHA证书指纹」中。keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | xxd -p | tr -d "[:space:]" | echo -n com.your.package.name `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
2. 校验google-services.json有效性
- 确认文件是从Firebase控制台对应应用下载的,包名与AndroidManifest.xml的
package字段完全一致。 - 检查文件中
client/api_key/current_key是否有效,无过期或权限限制。
3. 统一Firebase插件版本适配
- 在pubspec.yaml中锁定兼容Flutter 3.13.0的稳定版本:
dependencies: firebase_core: ^2.24.2 firebase_auth: ^4.12.0 - 清理项目缓存:
flutter clean cd android && ./gradlew clean
4. 调整Gradle依赖与配置
- 在android/build.gradle中确保Google服务版本匹配:
dependencies { classpath 'com.google.gms:google-services:4.4.0' classpath 'com.android.tools.build:gradle:8.0.2' } - 在app/build.gradle中设置最低SDK版本要求:
android { compileSdkVersion 33 defaultConfig { targetSdkVersion 33 } }
5. 修正reCAPTCHA验证流程
- 确保reCAPTCHA验证后正确传递凭证到手机号验证请求:
final recaptchaVerifier = RecaptchaVerifier( container: null, size: RecaptchaVerifierSize.compact, theme: RecaptchaVerifierTheme.light, ); await FirebaseAuth.instance.verifyPhoneNumber( phoneNumber: '+xxxxx', verificationCompleted: (PhoneAuthCredential credential) {}, verificationFailed: (FirebaseAuthException e) { print(e.message); }, codeSent: (String verificationId, int? resendToken) {}, codeAutoRetrievalTimeout: (String verificationId) {}, forceResendingToken: null, timeout: const Duration(seconds: 60), recaptchaVerifier: recaptchaVerifier, ); - 非Web环境下将reCAPTCHA的container设为null,避免平台适配冲突。
6. 检查Firebase项目权限与配额
- 登录Firebase控制台,确认Auth规则允许手机号验证的访问权限。
- 查看「使用情况」面板,确认短信验证未触发配额限制。
内容的提问来源于stack exchange,提问作者Yazan
相关产品推荐
相关产品推荐

