ThinkPHP
发布时间:2022-04-09 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Thinkphp实现短信验证注册功能,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
前言
注册时经常需要用到短信验证码,本文记录一下思路和具体实现。
短信验证平台使用云片,短信验证码的生成使用thinkphp。
思路
1、用户输入手机号,请求获取短信验证码。
2、thinkphp生成短信验证码,存储,同时和其他参数一起发送请求给云片。
3、云片发送短信验证码到指定手机号。
4、用户输入短信验证码。
5、thinkphp根据验证码是否正确、验证码是否过期两个条件判断是否验证通过。
代码实现
验证接口
接口地址:https://sms.yunpian.com/v1/sms/send.json">https://sms.yunpian.com/v1/sms/send.json。
使用postman,输入三个必须的参数apikey、mobile和text。
使用php的curl函数发起https请求,带入参数apikey、mobile和text。
'
******','mobile' => '
******','text' => '【小太阳】您的验证码是1234'
);
$param = '';
foreach ($paramArr as $key => $
value) {
$param .= urlencode($key).'='.urlencode($
value).'&';
}
$param = substr($param,strlen($param)-1
);
curl_setopt($ch,CURLOPT_POSTFIELDS,$param
);
curl_setopt($ch,CURLOPT_HEADER,0
);
curl_setopt($ch,CURLOPT_POST,1
);
//curl默认不支持
https协议,设置不验证协议
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,
fals
E);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,
fals
E);
//return the transfer as a
String
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1
);
// $output contains the output
String
$output = curl_exec($ch
);
// close curl
resource to free up system
resources
curl_close($ch
);
echo $output;
}
生成随机短信验证码
默认生成四位的随机短信验证码。
php;">
// 生成短信验证码
public function createSMSCode($length = 4)
{
$min = pow(10,($length - 1)
);
$max = pow(10,$length) - 1;
return rand($min,$ma
X);
}
整合
在数据库新建表sun_smscode:
createSMSCode(
);
$paramArr = array(
'apikey' => '
******','mobile' => $mobile,'text' => '【小太阳】您的验证码是'.$code
);
$param = '';
foreach ($paramArr as $key => $
value) {
$param .= urlencode($key).'='.urlencode($
value).'&';
}
$param = substr($param,1
);
curl_setopt($ch,
fals
E); //不验证证书下同
curl_setopt($ch,1
);
// $output contains the output
String
$output = curl_exec($ch
);
// close curl
resource to free up system
resources
curl_close($ch
);
//$outputJson = json_decode($output
);
$outputArr = json_decode($output,tru
E);
//echo $outputJson->code;
//echo $outputArr['code'];
if($outputArr['code'] == '0')
{
$data['mobile'] = $mobile;
$data['code'] = $code;
$smscode = D('smscode'
);
$smscodeObj = $smscode->where("mobile='$mobile'")->find(
);
if($smscodeObj)
{
$data['
update_at'] = date('Y-m-d H:i:s'
);
$
success = $smscode->where("mobile='$mobile'")->save($data
);
if($
success
!==
fals
E){
$result = array(
'code' => '0','ext' => '修改成功','obj' => $smscodeObj
);
}
echo json_encode($result,JSON_U
nesCAPED_UNICOD
E);
}else
{
$data['create_at'] = date('Y-m-d H:i:s'
);
$data['
update_at'] = $data['create_at'];
if($smscode->create($data))
{
$id = $smscode->add(
);
if($id)
{
$smscode_temp = $smscode->where("id='$id'")->find(
);
$result = array(
'code'=> '0','ext'=> '创建成功','obj'=>$smscode_temp
);
echo json_encode($result,JSON_U
nesCAPED_UNICOD
E);
}
}
}
}
}
验证短信验证码
验证短信验证码时间是否过期,验证短信验证码是否正确。
where("mobile='$mobile'")->find(
);
if($smscodeObj)
{
$smsCode
timestr = $smscodeObj['
update_at'];
$recordCode = $smscodeObj['code'];
$flag = $this->
checkTime($now
timestr,$smsCode
timestr
);
if(!$flag)
{
$result = array(
'code' => '1','ext' => '验证码过期,请刷新后重新获取'
);
echo json_encode($result,JSON_U
nesCAPED_UNICOD
E);
return;
}
if($code
!= $recordCod
E){
$result = array(
'code' => '2','ext' => '验证码错误,请重新输入'
);
echo json_encode($result,JSON_U
nesCAPED_UNICOD
E);
return;
}
$result = array(
'code' => '0','ext' => '验证通过'
);
echo json_encode($result,JSON_U
nesCAPED_UNICOD
E);
}
}
// 验证验证码时间是否过期
public function
checkTime($now
timestr,$smsCode
timestr)
{
//$now
timestr = '2016-10-15 14:39:59';
//$smsCode
timestr = '2016-10-15 14:30:00';
$nowTime = strtotime($now
timestr
);
$smsCodeTime = strtotime($smsCode
timestr
);
$period = floor(($nowTime-$smsCodeTim
E)/60
); //60s
if($period>
=0 && $period<=20)
{
return true;
}else
{
return
false;
}
}
改进
为了防止短信轰炸,在请求获取短信验证码时,需要加入图片验证码。
thinkphp提供了生成图片验证码的函数,下面我们来实现验证码的生成、刷新和验证。
生成和刷新图片验证码
30,// 验证码字体大小
'length'=>4,// 验证码位数
'useNoise'=>
false,// 关闭验证码杂点
'expire'=>600
);
$Verify = new \Think\Verify($config
);
$Verify->entry(2
333);//2333是验证码标志
}
假设,该函数的对应url为http://localhost/owner-bd/index.php/Home/checkCode/getPicCode,那么,图片验证码的地址就是这个url,放入页面图片标签的src属性即可。
验证图片验证码
check($code,2
333))
{
$result = array(
'code' => '0',JSON_U
nesCAPED_UNICOD
E);
}else
{
$result = array(
'code' => '1',JSON_U
nesCAPED_UNICOD
E);
};
}
以上方法,我们利用了thinkphp提供的check方法,实现起来很简单。但是,如果想要得到验证细节,就没有办法了。比如,验证码错误,可能验证码超时,可能因为输入验证码错误,可能因为验证码已经使用过等等。必要的时候,可以重写thinkphp的验证码类,或者重写thinkphp的check方法。
跑通前后端
后端修改
验证图片验证码函数,改为被调用函数:
在获取短信验证码函数的最顶部,添加调用图片验证码函数,只有通过验证,才发送请求给云片。
checkPicCode($picCod
E))
{
$result = array(
'code' => '1',JSON_U
nesCAPED_UNICOD
E);
return;
}
/*省略*/
}
前端核心代码