Firebase发送的短信验证码不匹配 空输入也跳转问题求助
问题根因
- 你的
comingCode默认初始值为空字符串,只有Firebase触发onVerificationCompleted自动读取到短信验证码时才会被赋值。大多数场景下应用没有短信读取权限、或测试手机号未走自动校验流程时,这个回调不会执行,comingCode会一直是空值。所以你输入任意非空内容都会匹配失败,留空时两个空字符串相等就直接通过,完全符合你现在的异常表现。 - 你的校验逻辑不符合Firebase Phone Auth的规范,不应该自行比对用户输入值和
comingCode,正确逻辑是拿到用户输入的验证码 + 之前onCodeSent返回的verificationID生成PhoneAuthCredential,再调用Firebase的校验接口完成验证。 - 即使触发了自动读取验证码的回调,你也没有把拿到的验证码回填到输入框,用户手动输入的内容依然无法和
comingCode匹配。
修复方案
- 替换按钮点击的校验逻辑,改用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() } } }
- 可选优化自动填充能力,在
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") } }
- 额外注意:建议把
verificationID存储到ViewModel或者onSaveInstanceState中,避免页面重建(比如旋转屏幕)时丢失该值导致校验失败。
内容的提问来源于stack exchange,提问作者IBRAHIM
相关产品推荐
相关产品推荐

