找回密码验证码总说错误,和注册不是同一条Tigshop开源商城链路

📅 2026/7/31 11:48:26
找回密码验证码总说错误,和注册不是同一条Tigshop开源商城链路
注册时验证码收得到也能顺利注册一到找回密码验证码照样收得到可一填进去就死活说「验证码错误或已失效」。这现象本身就把范围圈得很小了——短信通道是通的验证码也确实发出去、用户也收到了否则注册那条根本走不通。所以问题不在通道在「验证」这一步。很多人一上来就去查短信配置、查余额、查签名白费劲。注册能发能验说明账号、签名、余额全正常。既然验证码都收到了却校验不过那只能是「发」和「验」这两头对不上。走一遍发码和验码的代码发验证码的入口在php/app/api/controller/user/Login.php的sendMobileCode()底层调SmsService::sendCode($mobile, $event)。先纠正一个常见的误解tigshop 的验证码短信并不是按场景分模板的。看php/app/service/admin/common/sms/SmsService.phppublicfunctionsendCode(string$mobile,string$eventlogin):bool{return$this-sendSms($mobile,code,$this-creatCode($mobile,$event));}publicfunctioncreatCode(string$mobile,string$eventlogin):string{$coderand(100000,999999);Cache::set($event.mobileCode:.$mobile,$code,$this-expireTime);return$code;}不管什么场景sendCode一律走sendSms($mobile, code, ...)所有验证码共用同一个「code」模板。真正区分场景的是$event验证码存进缓存的 key 是{$event}mobileCode:{$mobile}校验时checkCode也按这个 key 取。publicfunctioncheckCode(string$mobile,string$code,string$eventlogin):bool{returnCache::get($event.mobileCode:.$mobile)$code;}问题就在 event 对不上Login.php里找回密码校验手机号的checkMobile()event 是写死的forget_passwordpublicfunctioncheckMobile(){$mobile$this-request-all(mobile,);$code$this-request-all(code,);$eventforget_password;$resultapp(UserService::class)-mobileValidate($mobile,$code,$event);return$this-success($result);}而前端找回密码页发验证码时如果没把 event 一起传成forget_passwordsendMobileCode就用默认的login。结果验证码存进了loginmobileCode:xxx校验却去读forget_passwordmobileCode:xxx两个 key 前缀不一样用户填得再对也永远说错误。解决办法很直接前端找回密码页发码时把 event 带上和后端校验对齐。// 找回密码页请求发送验证码时sendMobileCode({mobile,event:forget_password})改完再走一遍验证码就对上了。整个过程一行后端逻辑都没动就是前端漏传了个参数。顺带盯的两个点改这条链路的时候有两处我一贯会顺手确认跟这次的直接原因无关但值得一并看。一是防枚举。用户存在性提示别写成「该用户不存在」那等于告诉别人哪些手机号注册过、方便刷库。不管号存不存在对外统一返回「验证码已发送」存在才真发。二是密码存储。重置写新密码时跟着标品走UserService::modifyPassword()用的是password_hash($password, PASSWORD_DEFAULT)照它来。别自己图省事上md5一套系统里两种密码格式下次登录校验直接对不上。下次再遇到「注册能、找回不能」这类问题先别翻短信通道去比这两条链路传的 event/场景值对不对得上十有八九就在那。