Thinkphp实现短信验证注册功能

Thinkphp实现短信验证注册功能,第1张

概述注册功能是很多网站必做的功能,有注册功能就要有短信验证码,本文给大家分享thinkphp实现短信验证注册功能,感兴趣的朋友一起看看吧

前言

注册时经常需要用到短信验证码,本文记录一下思路和具体实现。

短信验证平台使用云片,短信验证码的生成使用thinkPHP。

思路

1、用户输入手机号,请求获取短信验证码。

2、thinkPHP生成短信验证码,存储,同时和其他参数一起发送请求给云片。

3、云片发送短信验证码到指定手机号。

4、用户输入短信验证码。

5、thinkPHP根据验证码是否正确、验证码是否过期两个条件判断是否验证通过。

代码实现

验证接口

接口地址:href="https://sms.yunpian.com/v1/sms/send.Json">https://sms.yunpian.com/v1/sms/send.Json。

使用postman,输入三个必须的参数APIkey、mobile和text。

PHP发起http/https请求

使用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,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //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;}

生成随机短信验证码

默认生成四位的随机短信验证码。

整合

在数据库新建表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,false); //不验证证书下同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,true);//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 !== false){$result = array('code' => '0','ext' => '修改成功','obj' => $smscodeObj);}echo Json_encode($result,JsON_UnesCAPED_UNICODE);}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_UnesCAPED_UNICODE);}}}}}

验证短信验证码

验证短信验证码时间是否过期,验证短信验证码是否正确。

where("mobile='$mobile'")->find();if($smscodeObj){$smsCodeTimeStr = $smscodeObj['update_at'];$recordCode = $smscodeObj['code'];$flag = $this->checkTime($NowTimeStr,$smsCodeTimeStr);if(!$flag){$result = array('code' => '1','ext' => '验证码过期,请刷新后重新获取');echo Json_encode($result,JsON_UnesCAPED_UNICODE);return;}if($code != $recordCode){$result = array('code' => '2','ext' => '验证码错误,请重新输入');echo Json_encode($result,JsON_UnesCAPED_UNICODE);return;}$result = array('code' => '0','ext' => '验证通过');echo Json_encode($result,JsON_UnesCAPED_UNICODE);}}// 验证验证码时间是否过期public function checkTime($NowTimeStr,$smsCodeTimeStr){//$NowTimeStr = '2016-10-15 14:39:59';//$smsCodeTimeStr = '2016-10-15 14:30:00';$NowTime = strtotime($NowTimeStr);$smsCodeTime = strtotime($smsCodeTimeStr);$period = floor(($NowTime-$smsCodeTime)/60); //60sif($period>=0 && $period<=20){return true;}else{return false;}}

改进

为了防止短信轰炸,在请求获取短信验证码时,需要加入图片验证码。

thinkPHP提供了生成图片验证码的函数,下面我们来实现验证码的生成、刷新和验证。

生成和刷新图片验证码

30,// 验证码字体大小'length'=>4,// 验证码位数'useNoise'=>false,// 关闭验证码杂点'expire'=>600);$Verify = new \Think\Verify($config);$Verify->entry(2333);//2333是验证码标志}

假设,该函数的对应url为http://localhost/owner-bd/index.PHP/Home/CheckCode/getPicCode,那么,图片验证码的地址就是这个url,放入页面图片标签的src属性即可。

验证图片验证码

check($code,2333)){$result = array('code' => '0',JsON_UnesCAPED_UNICODE);}else{$result = array('code' => '1',JsON_UnesCAPED_UNICODE);};}

以上方法,我们利用了thinkPHP提供的check方法,实现起来很简单。但是,如果想要得到验证细节,就没有办法了。比如,验证码错误,可能验证码超时,可能因为输入验证码错误,可能因为验证码已经使用过等等。必要的时候,可以重写thinkPHP的验证码类,或者重写thinkPHP的check方法。

跑通前后端

后端修改

验证图片验证码函数,改为被调用函数:

check($picCode,2333)){return true;}else{return false;};}

在获取短信验证码函数的最顶部,添加调用图片验证码函数,只有通过验证,才发送请求给云片。

checkPicCode($picCode)){$result = array('code' => '1',JsON_UnesCAPED_UNICODE);return;}/*省略*/}

前端核心代码

注册// register.Jsangular.module('sunApp').controller('registerController',function ($scope,$http,$httpParamSerializer,$state,$interval) { $scope.picCodeUrl = '/owner-bd/index.PHP/Home/CheckCode/getPicCode';$scope.isShow1 = true;$scope.isShow2 = false;$scope.btnSMSText = '获取验证码';$scope.btnSMSDisabled = false;$scope.checkOver = false;// 获取短信验证码$scope.getSMSCode = function(){var param = {mobile: $scope.mobile,picCode: $scope.picCode};$http({method:'POST',url:'/owner-bd/index.PHP/Home/SMS/getSMSCode',//url: '/owner-fd/mock/common.Json',headers:{'Content-Type':'application/x-www-form-urlencoded'},dataType: 'Json',data: $httpParamSerializer(param)}).then(function successCallback(response) {console.log(response.data);if(response.data.code == '0'){$scope.checkOver = true;$scope.btnSMSDisabled = true;var time = 60;var timer = null;timer = $interval(function(){time = time - 1;$scope.btnSMSText = time+'秒';if(time == 0) {$interval.cancel(timer);$scope.btnSMSDisabled = false;$scope.btnSMSText = '重新获取';}},1000);}},function errorCallback(response) {console.log(response.data);});}// 验证短信验证码$scope.next = function(){if(!$scope.checkOver){console.log('未通过验证');return;}var param = {mobile: $scope.mobile,code: $scope.SMSCode};$http({method:'POST',url:'/owner-bd/index.PHP/Home/SMS/checkSMSCode',data: $httpParamSerializer(param)}).then(function successCallback(response) {console.log(response.data);if(response.data.code == '0'){$scope.isShow1 = false;$scope.isShow2 = true;}},function errorCallback(response) {console.log(response.data);});}// 刷新图片验证码$scope.refresh = function(){$scope.picCodeUrl = '/owner-bd/index.PHP/Home/CheckCode/getPicCode?'+Math.random();}});

优化

以上代码,安全性不是很好,我们可以利用工具绕过前端验证。为了避免这个问题,可以在checkPicCode和checkSMSCode函数中添加session值来标记。

在最后一步,向数据库中添加用户时,先验证一下两个session值是否都为true,都为true时再添加。

成果

后记

以后也许有用的代码:

以上所述是小编给大家介绍的ThinkPHP实现短信验证注册,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对内存溢出网站的支持!

总结

以上是内存溢出为你收集整理的Thinkphp实现短信验证注册功能全部内容,希望文章能够帮你解决Thinkphp实现短信验证注册功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存