Browse Source

sms code send logic improved

master
filesite 2 weeks ago
parent
commit
f0be4cb5e6
  1. 100
      themes/tajian/controller/FrontapiController.php
  2. 2
      themes/tajian/views/site/login.php
  3. 2
      themes/tajian/views/site/register.php
  4. 11
      www/js/tajian.js

100
themes/tajian/controller/FrontapiController.php

@ -563,6 +563,8 @@ eof; @@ -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; @@ -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; @@ -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; @@ -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; @@ -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; @@ -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; @@ -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; @@ -809,7 +839,7 @@ eof;
}
//验证短信验证码是否正确
$mySmsCode = $this->getMySmsCode($cellphone);
$mySmsCode = $this->getTodaySmsCode($cellphone);
if (empty($mySmsCode) || $mySmsCode != $sms_code) {
$err = "{$sms_code} 验证码已过期或错误,请检查是否输入正确";
}

2
themes/tajian/views/site/login.php

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
<label for="text_input_sm" class="form-label">验证码</label>
<input id="text_input_sm" name="smscode" placeholder="输入收到的短信验证码" type="number">
<button class="smsbtn bt_sms_JS button button-sm button-shadow">发送验证码</button>
<p><small>如发送后 20 秒内没收到,请稍后重新发送</small></p>
<p><small class="sms_tip_JS">验证码当天有效,收到请保留 24 小时</small></p>
</div>
<div class="avform_bt vercenter">
<button class="jsbtn" aria-label="登录" type="submit">

2
themes/tajian/views/site/register.php

@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
<label for="text_input_sm" class="form-label">验证码</label>
<input id="text_input_sm" name="smscode" placeholder="输入收到的短信验证码" type="number">
<button type="button" class="smsbtn bt_sms_JS button button-sm button-shadow">发送验证码</button>
<p><small>如发送后 20 秒内没收到,请稍后重新发送</small></p>
<p><small class="sms_tip_JS">验证码当天有效,收到请保留 24 小时</small></p>
</div>
<div class="avform_bt vercenter">
<button class="jsbtn" aria-label="注册" type="submit">

11
www/js/tajian.js

@ -219,12 +219,10 @@ if ($('.bt_sms_JS').get(0)) { @@ -219,12 +219,10 @@ if ($('.bt_sms_JS').get(0)) {
if (data.code == 0 && data.err) {
alert(data.err);
}else {
//TODO: 根据接口返回的发送结果,区分不同情况
//data.rescode == 2, 当天有发送过,但是失败了
//data.rescode == 3, 当天有发送过,且成功了
$('.sms_tip_JS').text(data.msg);
if (typeof(data.autofill) != 'undefined' && data.autofill) {
$('input[name=smscode]').val(data.autofill);
}
}
}, function (jqXHR, textStatus, errorThrown) {
alert('网络请求失败,请重试。');
@ -323,7 +321,6 @@ if ($('#login_form').get(0)) { @@ -323,7 +321,6 @@ if ($('#login_form').get(0)) {
btLoading.addClass('elementNone');
if (data.code == 1 && data.shareUrl) {
btText.text('完成');
//alert(data.msg);
setTimeout(function() {
location.href = data.shareUrl;
}, 100);

Loading…
Cancel
Save