手机版

Thinkphp实现短信验证注册功能

时间:2021-09-14 来源:互联网 编辑:宝哥软件园 浏览:

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

短信验证平台使用云,使用thinkphp生成短信验证码。

思考

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

2.thinkphp生成短信验证码,存储起来,将请求和其他参数一起发送到云端。

3.云切片向指定手机号码发送短信验证码。

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

5.thinkphp根据两个条件判断验证是否通过:验证码是否正确,验证码是否过期。

代码实现

认证接口

接口地址:https://sms.yunpian.com/v1/sms/send.json.

使用postman并输入三个必需的参数apikey、mobile和text。

Php启动http/https请求

使用php的curl函数发起https请求,并引入参数apikey、mobile和text。

//获取短信验证码公共函数getsmscode(){//创建curl资源$ ch=curl _ init();//设置URL $ URL=' https://SMS . yun pian.com/v1/SMS/send . JSON ';curl_setopt($ch,CURLOPT_URL,$ URL);//设置param $ param arr=array(' API key '=' * * * * ',' mobile'=' * * * * ',' text '='[小太阳]你的验证码是1234’);$ param=foreach($ paramArr as $ key=$ value){ $ param。=urlencode($key)。'='.urlencode($value)。'';}$param=substr($param,0,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,curl opt _ SSL _ verifypeer,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//将传输作为字符串curl_setopt($ch,CURLOPT_RETURNTRANSFER,1)返回;//$output包含输出字符串$ output=curl _ exec($ ch);//关闭curl资源以释放系统资源curl _ close($ ch);echo $输出;}生成随机短信验证码

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

//生成短信验证码公共函数create mscode($ length=4){ $ min=pow(10,($ length-1));$max=pow(10,$ length)-1;返回兰特(最小值,最大值);}集成

在数据库中创建一个新表sun_smscode:

如果存在“sun_smscode”,则删除表;CREATE TABLE ` sun _ smscode `(` id ' int(8)NOT NULL AUTO _ INCREMENT,` mobile ' varchar(11)NOT NULL,` code ' int(4)NOT NULL,` create_at` datetime NOT NULL,` update_at` datetime NOT NULL,PRIMARY KEY(` id `))ENGINE=MyISAM AUTO _ INCREMENT=3 DEFAULT CHARSET=utf8;thinkphp代码://获取短信验证码公共函数getSMSCode(){//创建卷曲资源$ ch=curl _ init();//设置网址$网址=' https://短信。云片。com/v1/短信/发送。JSON ';curl_setopt($ch,CURLOPT_URL,$ URL);//设置param $ mobile=$ _ POST[' mobile '];$ code=$ this-createSMSCode();$paramArr=数组(' apikey'='**** ',' mobile'=$mobile,' text'='【小太阳】您的验证码是$ code);$ param=foreach($ paramArr as $ key=$ value){ $ param .=urlencode($key ).'='.urlencode($value ).'';}$param=substr($param,0,strlen($ param)-1);curl_setopt($ch,CURLOPT_POSTFIELDS,$ param);curl_setopt($ch,CURLOPT_HEADER,0);curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//不验证证书下同curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//将传输作为字符串curl_setopt($ch,CURLOPT_RETURNTRANSFER,1)返回;//$输出包含输出字符串$ output=curl _ exec($ ch);//关闭卷曲资源以释放系统资源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($成功!==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);}}}}}验证短信验证码

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

//验证短信验证码是否有效公共函数checkSMSCode(){ $ mobile=$ _ POST[' mobile '];$ code=$ _ POST[' code '];$ nowTimeStr=日期(' Y-m-d h : I :s ');$ smscode=D(' smscode ');$ smscodeObj=$ smscode-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);返回;}if($code!=$ record COde){ $ result=array(' COde '=' 2 ',' ext'='验证码错误,请重新输入');echo json_encode($result,JSON _ Unescaped _ UNICODE);返回;}$result=array('code'='0 ',' ext'='验证通过');echo json_encode($result,JSON _ Unescaped _ UNICODE);}}//验证验证码时间是否过期公共函数checkTime($nowTimeStr,$ smsCodeTimeStr){//$ nowTimeStr=' 2016-10-15 14:39:59 ';//$ smsCodeTimeStr=' 2016-10-15 14:30:00 ';$ now time=strtotime($ now time str);$ smsCodeTime=strtotime($ smsCodeTimeStr);$ period=floor($ now time-$ smsCodeTime)/60);//60s if($ period=0 $ period=20){返回true} else {返回false}}改进

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

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

生成和刷新图片验证码

//获取图片验证码,刷新图片验证码公共函数getpiccode(){ $ config=array(' font size '=30,//验证码字号' length'=4,//验证码位数' useNoise'=false,//关闭验证码杂乱' expire '=600);$ Verify=new \ Think \ Verify($ config);$ Verify-entry(2333);//2333是验证码标志。}假设这个函数对应的url是http://localhost/owner-BD/index . PHP/home/check code/getpiccode,那么图片验证码的地址就是这个url,所以只需要放页面图片标签的src属性即可。

验证图片验证码

//验证验证码是否正确Public函数check piccode($ code){ $ Verify=new \ think \ Verify();If ($ verify-check ($ code,2333)) {$ result=array ('code'=' 0 ',' ext '=' verification passed ');echo json_encode($result,JSON _ UNescaped _ UNICODE);} else {$ result=array ('code'=' 1 ',' ext'='错误的验证码,请重新输入');echo json_encode($result,JSON _ UNescaped _ UNICODE);};}以上方法都是使用thinkphp提供的check方法简单实现的。但是,如果你想得到验证细节,是没有办法的。例如,验证码错误,验证码可能超时,验证码可能输入错误,验证码可能已经被使用。如果需要,可以重写thinkphp的验证码类,或者重写thinkphp的check方法。

贯穿前端和后端

后端修改

验证图片验证码功能,并将其更改为调用的功能:

公共函数checkPicCode($ picCode){ $ Verify=new \ Think \ Verify();if($verify-check($picCode,2333)){返回true} else { return false};}在获取短信验证码功能的顶部,增加了调用图片验证码的功能,只有验证通过后,才能将请求发送到云端。

//获取短信验证码公共函数getsmscode(){ $ piccode=$ _ post[' piccode '];if(!$ this-check piccode($ piccode)){ $ result=array(' code '=' 1 ',' ext'='验证码错误,请重新输入');echo json_encode($result,JSON _ UNescaped _ UNICODE);返回;}/*省略*/}前端核心代码

!register.html!DOCTYPE html html lang=' zh ' ng-app=' Sunapp ' hearta charset=' UTF-8 ' title注册/title/head body ng-controller=' registerController ' form action=' class=' register-form ' ng-show=' is show 1 ' div class=' input-group ' input type=' text ' class=' mobile ' ng-model=' mobile ' placeholder='手机号/div class=' input-group '输入类型=' text ' class=' pic-code ' ng-model=' Piccode '占位符='图片验证码img类=' img ' src=' http : { { Piccode URl } } ' alt=' ng-click=' refresh()'/div类=' input-group '输入类型=' text ' class=' SMS-code ' ng-model=' SMSCode ' placeholder='短信验证码button class=' BTN-短信' ng-click=' getSMSCode()' ng-disabled=' btnSMSDisabled ' { btnSMSText } }/button/div button class=' confirm-BTN ' ng-click=' next()'下一步/button/form form action=' class=' register-form ' ng-show=' IsShow 2 ' div class=' input-group ' input type=' text ' class=' mobile ' ng-model=' mobile ' placeholder='手机号disabled=' true '/div class=' input-group ' input type=' password ' class=' password ' ng-model=' password ' placeholder='请输入密码输入类型=' password ' class=' password ' ng-model=' password 2 '占位符='请再次输入密码/div按钮class=' confirm-BTN ' ng-click=' getSMSCode()'注册/button/form/body/html//register。 jsangular。模块(' Sunapp ').controller('registerController ',function ($scope,$http,$httpParamSerializer,$state,$ interval){ $ scope。piccodeurl='/owner-BD/index。PHP/Home/校验码/getPicCode ';$ scope . isshow 1=true $ scope . isshow 2=false $ scope . btnsmstext='获取验证码;$ scope . btnsmsdisabled=false $ scope . checkover=false//获取短信验证码$ scope。getsmscode=function(){ var param={ mobile : $ scope。移动,Piccode :美元范围。piccode };$http({method:'POST ',URL : '/owner-BD/index。PHP/Home/SMS/getSMSCode ',//URL : '/所有者-FD/mock/common。JSON ',标头RS : { ' Content-Type ' : ' application/x-www-form-URL encoded ' },dataType: 'json ',数据: $ httparamserializer(param)}).然后(函数成功回调(响应){控制台。日志(响应。数据);if(响应。数据。代码==' 0 '){ $ scope。检查=真;$ scope.btnSMSDisabled=true变化时间=60;定义变量计时器=null timer=$ interval(function(){ time=time-1;$scope.btnSMSText=time '秒;if(time==0){ $ interval。取消(计时器);$ scope . btnsmsdisabled=false $ scope . btnsmstext='重新获取;}}, 1000);}},函数错误回调(响应){控制台。日志(响应。数据);});}//验证短信验证码$scope.next=function(){if(!$scope.checkOver){console.log('未通过验证');返回;} var param={ mobile : $ scope。手机,代码:美元范围.SMSCode };$http({method:'POST ',URL : '/owner-BD/index。PHP/Home/SMS/checkSMSCode ',//URL : '/所有者-FD/mock/common。JSON ',标头RS : { ' Content-Type ' : ' application/x-www-form-URL encoded ' },dataType: 'json ',数据: $ httparamserializer(param)}).然后(函数成功回调(响应){控制台。日志(响应。数据);if(响应。数据。代码==' 0 '){ $ scope。isshow 1=false$ scope.isShow2=true}},函数错误回调(响应){控制台。日志(响应。数据);});}//刷新图片验证码$ scope。refresh=function(){ $ scope。Piccode URL='/owner-BD/index。PHP/Home/CheckCode/GetPiccode?数学。random();}});优化

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

$ _ SESSION[' CheckPiccode ']=true;$ _ SESSION[' CheckSmScode ']=true;在最后一步,向数据库中添加用户时,先验证一下两个会议值是否都为没错,都为真实的时再添加。

成果

后记

以后也许有用的代码:

echo JSON _ encode($ _ SESSION);//打印出会议中的数据回声会话id();//打印当前会议的编号以上所述是小编给大家介绍的Thinkphp实现短信验证注册,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

版权声明:Thinkphp实现短信验证注册功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。