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

Firebase发送的短信验证码不匹配 空输入也跳转问题求助

问题根因

  • 你的comingCode默认初始值为空字符串,只有Firebase触发onVerificationCompleted自动读取到短信验证码时才会被赋值。大多数场景下应用没有短信读取权限、或测试手机号未走自动校验流程时,这个回调不会执行,comingCode会一直是空值。所以你输入任意非空内容都会匹配失败,留空时两个空字符串相等就直接通过,完全符合你现在的异常表现。
  • 你的校验逻辑不符合Firebase Phone Auth的规范,不应该自行比对用户输入值和comingCode,正确逻辑是拿到用户输入的验证码 + 之前onCodeSent返回的verificationID生成PhoneAuthCredential,再调用Firebase的校验接口完成验证。
  • 即使触发了自动读取验证码的回调,你也没有把拿到的验证码回填到输入框,用户手动输入的内容依然无法和comingCode匹配。

修复方案

  1. 替换按钮点击的校验逻辑,改用Firebase官方校验方式:
view.ileriButton.setOnClickListener {
    val userInputCode = editTextOnayKodu.text.toString().trim()
    // 先判空拦截无输入提交
    if (userInputCode.isEmpty()) {
        Toast.makeText(activity,"请输入验证码",Toast.LENGTH_LONG).show()
        return@setOnClickListener
    }
    // 生成校验凭证
    val credential = PhoneAuthProvider.getCredential(verificationID, userInputCode)
    // 调用Firebase接口做校验
    auth.signInWithCredential(credential)
        .addOnCompleteListener(requireActivity()) { task ->
            if (task.isSuccessful) {
                // 校验通过走后续流程
                EventBus.getDefault().postSticky(EventBusDataEvents.KayitBilgileriniGonder("+90$comingNumber",null,verificationID,userInputCode))
                val transaction = requireActivity().supportFragmentManager.beginTransaction()
                transaction.replace(R.id.telefonOnayKod,FragmentRegisterDetailPhone())
                transaction.addToBackStack("TelOnayfragmentEklendi")
                transaction.commit()
            } else {
                // 校验失败提示
                Toast.makeText(activity,"验证码错误",Toast.LENGTH_LONG).show()
            }
        }
}
  1. 可选优化自动填充能力,在onVerificationCompleted回调中补充自动回填和校验逻辑:
override fun onVerificationCompleted(credential: PhoneAuthCredential) {
    if(!credential.smsCode.isNullOrEmpty()){
        comingCode = credential.smsCode!!
        // 自动填充到输入框
        editTextOnayKodu.setText(comingCode)
        progressBarOnayKod.visibility = View.GONE
        Log.e("Success","on verificationcompleted sms: " + comingCode)
        // 自动触发校验
        view.ileriButton.performClick()
    }else{
        Log.e("Error","onverification has not completed")
    }
}
  1. 额外注意:建议把verificationID存储到ViewModel或者onSaveInstanceState中,避免页面重建(比如旋转屏幕)时丢失该值导致校验失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:06:05