1.场景:通常在使用手机号注册时需要发送短信验证码,在修改密码等敏感操作时也需要验证手机号发送短信验证码。
短信验证码的目的:验证用户的身份是否本人
在项目代码中发送短信,通常要调用第三方短信商的短信发送接口。
提供短信接口的平台:百度Apistore数据平台、聚合数据平台、京东万象、短信宝等等
一般情况下,短信接口需要企业认证用户才能申请、一般都是收费的。
以短信宝为例:个人可以购买使用
javascript:
//验证手机号
$('#dyMobileButton').click(function(){
var mobile = $('#phone').val();
var preg = /^1[3589]\d{9}$/;
if (mobile == '' || !preg.test(mobile)){
$('.error:eq(0)').html('手机格式不正确');
}else{
$('.error:eq(0)').empty();
}
//倒计时
var that = $(this);
that.attr('disabled',true);//点击过后不能再次点击
//60s之后才能再次发送
var second = 60;
var timer = setInterval(function () {
second --
if (second > 0){
that.text(second + 's后再次发送')
}else{
that.text('发送验证码')
that.attr('disabled',false);//打开点击功能
clearInterval(timer);//清空定时器
}
},1000);
//发送验证码
$.ajax({
url:'sendCode',
dataType:'json',
data:{mobile:mobile},
success:function (res) {
alert(res.msg);
return ;
}
})
});
控制器:
//验证码
public function sendCode($mobile){
$return = [
'code' => 200,
'msg' => 'ok',
'data' => []
];
$data = SendCode::sendCode($mobile);
$return['data'] = $data;
return json($return);
}
封装业务层:
//验证码
public static function sendCode($mobile){
$statusStr = array(
"0" => "短信发送成功",
"-1" => "参数不全",
"-2" => "服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间!",
"30" => "密码错误",
"40" => "账号不存在",
"41" => "余额不足",
"42" => "帐户已过期",
"43" => "IP地址限制",
"50" => "内容含有敏感词"
);
//生成随机数
$code = rand(1000,9999);
//缓存
Cache::set("code",$code,300);
$smsapi = "http://api.smsbao.com/";
$user = "***"; //短信平台帐号
$pass = md5("****"); //短信平台密码
$content="短信内容";//要发送的短信内容
$phone = "*****";//要发送短信的手机号码
$sendurl = $smsapi . "sms?u=" . $user . "&p=" . $pass . "&m=" . $phone . "&c=" . urlencode($content);
$result = file_get_contents($sendurl);
return $statusStr[$result];
}
后端验证防止重复发送
PHP限制发送验证码条数(防止重复发送)_code_nutter的博客-CSDN博客
//获取第一次发送的信息
$send_time = cache('time_key');
//判断是否发送过
if ($send_time && time() - $send_time < 60){
throw new Exception('请求的次数过多');
}