diff --git a/themes/tajian/controller/FrontapiController.php b/themes/tajian/controller/FrontapiController.php index 61f0510..6697319 100644 --- a/themes/tajian/controller/FrontapiController.php +++ b/themes/tajian/controller/FrontapiController.php @@ -563,6 +563,8 @@ eof; } //短信验证码 10 分钟内有效 + //弃用:@2025-04-24 + //用方法getTodaySmsCode代替,验证码当天有效(00:00:01 - 23:59:59) protected function getMySmsCode($cellphone) { if(session_status() !== PHP_SESSION_ACTIVE) { session_start(); @@ -584,30 +586,32 @@ eof; } //保存当天最新发送过的验证码 + //改为根据手机号码保存到缓存文件 protected function saveTodaySmsCode($cellphone, $sms_code) { - if(session_status() !== PHP_SESSION_ACTIVE) { - session_start(); - } - - $_SESSION['randSmsCode_today'] = $sms_code; - $_SESSION['randSmsCode_created_date'] = date('Ymd'); - $_SESSION['smsCodePhone_today'] = $cellphone; //保存发送验证码的手机号码,便于在登录、注册的时候验证 - - return $sms_code; + $cacheKey = $cellphone; + $cacheDir = 'sms'; + $date = date('Ymd'); + $time = time(); + $data = compact('sms_code', 'date', 'time'); + return Common::saveCacheToFile($cacheKey, $data, $cacheDir); } //获取当天最新发送过的验证码 protected function getTodaySmsCode($cellphone) { - if(session_status() !== PHP_SESSION_ACTIVE) { - session_start(); + $cacheKey = $cellphone; + $cacheDir = 'sms'; + $cacheTime = 86400; + $cacheData = Common::getCacheFromFile($cacheKey, $cacheTime, $cacheDir); + if (empty($cacheData)) { + return false; } - $sms_code = !empty($_SESSION['randSmsCode_today']) ? $_SESSION['randSmsCode_today'] : 0; - $sms_date = !empty($_SESSION['randSmsCode_created_date']) ? $_SESSION['randSmsCode_created_date'] : 0; - $today = = date('Ymd'); - $codeSentPhoneNumber = !empty($_SESSION['smsCodePhone_today']) ? $_SESSION['smsCodePhone_today'] : 0; + $sms_code = $cacheData['sms_code']; + $sms_date = $cacheData['date']; + $sms_created = $cacheData['time']; + $today = date('Ymd'); - if ($today == $sms_date && $cellphone == $codeSentPhoneNumber && !empty($sms_code)) { + if ($today == $sms_date && !empty($sms_code)) { return $sms_code; } @@ -615,10 +619,10 @@ eof; } //获取短信验证码 - //TODO: 调整发送逻辑,发送前,先查询当天发送详情,从而限制一个手机号码每天最多2次发送验证码的机会 + //@2025-04-24 调整发送逻辑,发送前,先查询当天发送详情,从而限制一个手机号码每天最多2次发送验证码的机会 //查询结果判断 //rescode == 2 当天发送过,但是失败了,直接返回验证码,帮用户填上 - //rescode == 3 当天发送过,且成功了,需要用户自己填(考虑用户删除了验证码短信,可在距离上一次发送超1小时后当天再给用户一次获取验证码的机会) + //rescode == 3 当天发送过,且成功了,需要用户自己填(暂不实现:考虑用户删除了验证码短信,可在距离上一次发送超1小时后当天再给用户一次获取验证码的机会) //rescode == 0 当天没发送过,则发送验证码 public function actionSendsmscode() { $ip = $this->getUserIp(); @@ -637,6 +641,7 @@ eof; $rescode = -1; //短信发送详情结果:-1 默认值,0 - 未发送,1 - 发送中,2 - 发送失败,3 - 发送成功 $msg = ''; $err = ''; + $autofill = ''; //自动帮用户填上验证码 $postParams = $this->post(); if (!empty($postParams)) { @@ -666,7 +671,6 @@ eof; $params = array( 'phoneNumber' => $cellphone, - 'codeNumber' => $sms_code, 'action' => $action, ); $params['sign'] = $this->sign($params, FSC::$app['config']['service_3rd_api_key']); @@ -678,28 +682,54 @@ eof; //发送之前先查询当天该手机号码的发送情况,并根据发送结果来决定是否发送验证码短信 $api_query = FSC::$app['config']['service_3rd_api_domain'] . '/aliyun/querysendresult/'; - $res_query = $this->request($api, json_encode($params), $timeout, $pc, $headers); - - - //发送短信验证码 - $api = FSC::$app['config']['service_3rd_api_domain'] . '/aliyun/sendverifycode/'; - $res = $this->request($api, json_encode($params), $timeout, $pc, $headers); - - if (!empty($res) && $res['status'] == 200) { - $resData = json_decode($res['result'], true); + $res_query = $this->request($api_query, json_encode($params), $timeout, $pc, $headers); + if (!empty($res_query) && $res_query['status'] == 200) { + $resData = json_decode($res_query['result'], true); if ($resData['code'] == 1) { - $code = 1; - $msg = '短信验证码已成功发送'; + if ($resData['rescode'] == 2) { + $code = 1; + $autofill = $sms_code; + $msg = '验证码发送失败了,已帮你自动填上'; + }else if ($resData['rescode'] == 3) { + $code = 1; + $msg = '今天已发送的验证码依然有效,请直接使用'; + }else if ($resData['rescode'] == 1) { + $code = 1; + $msg = '验证码发送中,请耐心等待并查收手机短信'; + }else if ($resData['rescode'] == 0) { + //当天还没发送过,则发送短信验证码 + $params = array( + 'phoneNumber' => $cellphone, + 'codeNumber' => $sms_code, + 'action' => $action, + ); + $params['sign'] = $this->sign($params, FSC::$app['config']['service_3rd_api_key']); + $api = FSC::$app['config']['service_3rd_api_domain'] . '/aliyun/sendverifycode/'; + $res = $this->request($api, json_encode($params), $timeout, $pc, $headers); + + if (!empty($res) && $res['status'] == 200) { + $resData = json_decode($res['result'], true); + if ($resData['code'] == 1) { + $code = 1; + $msg = '短信验证码已发送,当天有效'; + }else { + $err = '短信验证码发送失败:' . $resData['message']; + } + }else { + $err = '短信验证码发送失败,请稍后再试'; + } + } }else { - $err = '短信验证码发送失败:' . $resData['message']; + $err = '短信发送详情获取失败:' . $resData['message']; } }else { - $err = '短信验证码发送失败,请稍后再试'; + $err = '系统繁忙,请稍后再试'; } + } } - return $this->renderJson(compact('code', 'msg', 'err')); + return $this->renderJson(compact('code', 'msg', 'err', 'autofill')); } //新用户注册 @@ -739,7 +769,7 @@ eof; } //验证短信验证码是否正确 - $mySmsCode = $this->getMySmsCode($cellphone); + $mySmsCode = $this->getTodaySmsCode($cellphone); if (empty($mySmsCode) || $mySmsCode != $sms_code) { $err = "{$sms_code} 验证码已过期或错误,请检查是否输入正确"; } @@ -809,7 +839,7 @@ eof; } //验证短信验证码是否正确 - $mySmsCode = $this->getMySmsCode($cellphone); + $mySmsCode = $this->getTodaySmsCode($cellphone); if (empty($mySmsCode) || $mySmsCode != $sms_code) { $err = "{$sms_code} 验证码已过期或错误,请检查是否输入正确"; } diff --git a/themes/tajian/views/site/login.php b/themes/tajian/views/site/login.php index 16d1911..cfef8db 100644 --- a/themes/tajian/views/site/login.php +++ b/themes/tajian/views/site/login.php @@ -8,7 +8,7 @@ -

如发送后 20 秒内没收到,请稍后重新发送

+

验证码当天有效,收到请保留 24 小时

-

如发送后 20 秒内没收到,请稍后重新发送

+

验证码当天有效,收到请保留 24 小时