Flutter+Firebase手机OTP仅斯里兰卡可用其他国家无法接收问题咨询
问题排查方案
一、Firebase配置检查
Firebase电话认证默认支持全球发送OTP,无需单独开启全局开关,你可以优先核对以下配置项:
- 进入Firebase控制台→身份验证→设置→用户注册板块,找到电话验证的国家/地区限制配置,确认是否设置了仅允许斯里兰卡号码发送,若有则添加德国等你需要覆盖的国家,或关闭地区限制。
- 进入同项目的Google Cloud控制台,检查Cloud SMS API的配额和地区限制,确认没有对应区域的配额耗尽或发送封禁。
- 检查是否开启了reCAPTCHA验证,跨国请求的reCAPTCHA拦截概率更高,你当前代码仅捕获了
invalid-phone-number类型错误,建议在verificationFailed回调中打印完整的e.code和e.message,可以直接定位具体的失败原因。
二、代码问题修复
你当前的fetchotp函数存在硬编码错误,无论用户输入什么手机号,最终都会向固定的斯里兰卡号码+94769008291发送OTP,直接导致其他国家用户无法收到验证码:
// 错误写法 await auth.verifyPhoneNumber( phoneNumber: '+94769008291', // 硬编码了固定号码,没有读取用户输入 // 其余参数省略 )
修改为读取用户输入的号码即可:
await auth.verifyPhoneNumber( phoneNumber: numController.text, // 读取号码输入框的内容,注意要引导用户输入带国家码的完整手机号 // 其余参数保持不变 )
三、VPN测试场景说明
大部分VPN节点会被Firebase的反垃圾风控策略识别为风险请求,直接拦截OTP发送,因此VPN测试失败不代表当地真实用户在正常网络下也会失败,建议优先让德国客户在当地非VPN环境下测试,同时结合错误日志判断问题。
内容的提问来源于stack exchange,提问作者Guna Rakulan
相关产品推荐
相关产品推荐

