QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

PHP基础

thinkphp3.2实现新版阿里大于短信验证功能

 admin  2017-09-05 12:48:01
tp3.2结合新版本的阿里大于,我研究了很久,网上的资料大部分都是旧版本的,因此也不通用,直到最近看了源鱼人生的csdn博客,感谢博主无私分享!

这篇文章即参考了江南极客的博客:http://blog.csdn.net/sinat_35861727/article/details/75666875,又参考了源鱼人生的CSDN博客:http://blog.csdn.net/m0_37587812/article/details/77575265?locationNum=3&fps=1,只是根据自己的需要,做了部分简单的修改!

​第一步:阿里大于配置

(1)注册或登录你的阿里云账号,创建自己的Access Key秘钥

(2)点击:产品与服务–>云计算基础服务–>云通信–>短信服务,进入自己的短信服务管理控制台!设置设置的短信签名和短信模板,因为需要审核,所以请提前申请


(3)下载阿里大于SDK和demo

下载地址:https://help.aliyun.com/document_detail/55359.html?spm=5176.doc55451.6.569.3psCY5

解压后:


(4)创建api

在tp3.2根目录下创建Api文件夹并把api_sdk放进去,并修改名称为:dysms



第二步:TP3.2控制器开发

(1)使用命名空间方式引入阿里大于


  1. namespace Admin\Controller; 
  2. use Think\Controller; 
  3. use Aliyun\Core\Config; 
  4. use Aliyun\Core\Profile\DefaultProfile; 
  5. use Aliyun\Core\DefaultAcsClient; 
  6. use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest; 

(2)开发控制器方法(大部分直接复制的源鱼人生博客)

  1. public function index(){ 
  2.      $this->display(); 
  3.     
  4.   /** 
  5.      * 数据处理 
  6.      */ 
  7.     public function send_message(){ 
  8.         $phone=I("post.phone"); 
  9.         //查找是否已经注册,他是验证有无注册,我这边不需要直接注释掉了 
  10.         //$user = D('User') -> where("user_phone = {$phone}") -> find(); 
  11.         //if ($user) { 
  12.        //     echo "手机号已注册!"; 
  13.        // }else{ 
  14.       //      $this->send_phone($phone); 
  15.       //  } 
  16.          $this->send_phone($phone); 
  17.     } 
  18.     /** 
  19.      * 生成短信验证码 
  20.      * @param  integer $length [验证码长度] 
  21.     * 该函数可以自定义生产随机验证码! 
  22.      */ 
  23.     public function createSMSCode($length = 4){ 
  24.         $min = pow(10 , ($length - 1)); 
  25.         $max = pow(10, $length) - 1; 
  26.         return rand($min, $max); 
  27.     } 
  28.     /** 
  29.      * 发送验证码 
  30.      * @param  [integer] $phone [手机号] 
  31.      */ 
  32.     public function send_phone($phone){ 
  33.         $code=$this->createSMSCode($length = 4); 
  34.         require_once  './Api/dysms/vendor/autoload.php';    //此处为你放置API的路径 
  35.         Config::load();             //加载区域结点配置 
  36.  
  37.         $accessKeyId = '*********;您的accessKeyId 
  38.         $accessKeySecret = '*****'; 您的accessKeySecret 
  39.         $templateCode = '****';   //短信模板ID 格式为:SMS_***,只填写后边的*** 
  40.          /*以上三个参数可以存到系统配置里边通过C(‘’)方式引入*/ 
  41.  
  42.         //短信API产品名(短信产品名固定,无需修改) 
  43.         $product = "Dysmsapi"
  44.         //短信API产品域名(接口地址固定,无需修改) 
  45.         $domain = "dysmsapi.aliyuncs.com"
  46.         //暂时不支持多Region(目前仅支持cn-hangzhou请勿修改) 
  47.         $region = "cn-hangzhou"
  48.         // 初始化用户Profile实例 
  49.         $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret); 
  50.         // 增加服务结点 
  51.         DefaultProfile::addEndpoint("cn-hangzhou""cn-hangzhou", $product, $domain); 
  52.         // 初始化AcsClient用于发起请求 
  53.         $acsClient = new DefaultAcsClient($profile); 
  54.         // 初始化SendSmsRequest实例用于设置发送短信的参数 
  55.         $request = new SendSmsRequest(); 
  56.         // 必填,设置短信接收号码 
  57.         $request->setPhoneNumbers($phone); 
  58.         // 必填,设置签名名称 
  59.         $request->setSignName("您的签名"); 
  60.         // 必填,设置模板CODE 
  61.         $request->setTemplateCode("您的短信ID"); 
  62.         $smsData = array('number'=>$code);    //所使用的模板若有变量 在这里填入变量的值 即你的模板短信中出现的变量! 
  63.         //选填-假如模板中存在变量需要替换则为必填(JSON格式),友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败 
  64.         $request->setTemplateParam(json_encode($smsData)); 
  65.         //发起访问请求 
  66.         $acsResponse = $acsClient -> getAcsResponse($request); 
  67.         //返回请求结果 
  68.         $result = json_decode(json_encode($acsResponse), true); 
  69.         $resp = $result['Code']; 
  70.         $this->sendMsgResult($resp,$phone,$code); 
  71.     } 
  72.     /** 
  73.      * 验证手机号是否发送成功  前端用ajax,发送成功则提示倒计时,如50秒后可以重新发送 
  74.      * @param  [json] $resp  [发送结果] 
  75.      * @param  [type] $phone [手机号] 
  76.      * @param  [type] $code  [验证码] 
  77.      * @return [type]        [description] 
  78.      */ 
  79.     private function sendMsgResult($resp,$phone,$code){ 
  80.         if ($resp == "OK") { 
  81.             $data['phone']=$phone; 
  82.             $data['code']=$code; 
  83.             $data['send_time']=time(); 
  84.             $result = D("sms")->add($data); 
  85.             if($result){ 
  86.                 $data="发送成功"
  87.             }else
  88.                 $data="发送失败"
  89.             } 
  90.         } else
  91.             $data="发送失败"
  92.         } 
  93.      $this->ajaxReturn($data);//一般都是ajax验证,所以这里我改成了ajaxReturn返回! 
  94.     } 
  95.     /** 
  96.      * 验证短信验证码是否有效,前端用jquery validate的remote 
  97.      * @return [type] [description] 
  98.      */ 
  99.     public function checkSMSCode(){ 
  100.         $phone = I("param.phone"); 
  101.         $code =  I("param.verify"); 
  102.         $nowTimeStr = time(); 
  103.        $where['phone'] = $phone;//改成通用tp3.2的模式 
  104.        $where['code']  = $code; 
  105.         $smscodeObj = D("Sms")->where($where)->find(); 
  106.        $data = ""
  107.         if($smscodeObj){ 
  108.             $smsCodeTimeStr = $smscodeObj['send_time']; 
  109.             $recordCode = $smscodeObj['code']; 
  110.             $flag = $this->checkTime($nowTimeStr, $smsCodeTimeStr); 
  111.             if($flag!=true || $code !== $recordCode){ 
  112.            if($flag){ 
  113.                   $data = "no"
  114.            }else
  115.               $data = "nos";//多写了一个判断,用来判断验证码是否超时 
  116.           } 
  117.             }else
  118.                $data = "ok"
  119.             } 
  120.         } 
  121.      $this->ajaxReturn($data);//同样引入ajaxReturn方式 
  122.     } 
  123.     /** 
  124.      * 验证验证码是否在可用时间 
  125.     *  @param  [json] $nowTimeStr  [发送结果] 
  126.      * @param  [type] $smsCodeTimeStr [手机号] 
  127.      */ 
  128.     public function checkTime($nowTimeStr,$smsCodeTimeStr) { 
  129.         $time = $nowTimeStr - $smsCodeTimeStr; 
  130.         if ($time>900) { 
  131.             return false
  132.         }else
  133.             return true
  134.         } 
  135.     } 


第三步:前端设计

参考他们的博客,都没有写前端,因为前端都相对简单了,这里为了方便大家交流,我把我的代码贴了出来!我使用的是layui的前端代码!


  1. class="layui-table"
  2.      
  3. "20%" align="right">手机号: 
  4. "80%"
  5.       class="table_span" style="width:300px; float:left;">"phone" type="text" id="phone" class="layui-input"> 
  6.        
  7.       class="table_txt" id="times">
  8.       class="table_txt" id="send">发送验证码
  9.        
  10.      
  11.      
  12.     "right">验证码: 
  13.      
  14.        class="table_span" style="width:300px; float:left;">"text" id="verify" name="verify"  class="layui-input"> 
  15.             class="table_txt" id="chk_verify">
  16.      
  17.      
  18.       "right"
  19. "middle"
  20. "submit" name="Submit" id="login" value="确   定" class="layui-btn" > 
  21.  
  22.  
  23.      



AJAX代码:

   
  1. $('#login').attr({'disabled':'false','title':'禁止提交'}).css({'background-Color':'#ccc'}); 
  2.     //验证码倒计时 
  3.    function timetips(){ 
  4.             var i=60; 
  5.             var timer=setInterval(function(){ 
  6.                 i--; 
  7.                 $("#times").text(i); 
  8.                 if(i==0){ 
  9.                     $("#send").css("display","block"); 
  10.                     $("#times").css("display","none"); 
  11.                     clearInterval(timer); 
  12.                     $("#times").text(60); 
  13.                 } 
  14.           },1000); 
  15.       }; 
  16.     $('#send').click(function(){ 
  17.          var phone = $('#phone').val(); 
  18.         $.ajax({ 
  19.               url: "__CONTROLLER__/send_message"
  20.               data: {'phone': phone }, 
  21.               dataType: "json",//改成了json方式 
  22.               type: "POST"
  23.              success: function(data) { 
  24.                       if (data == 2) { 
  25.                            $('#phone_tips').html('手机号已注册!');//这一步我没用到,可以根据情况删除 
  26.                       }else
  27.                            $("#send").css("display","none"); 
  28.                           $("#times").css("display","block"); 
  29.                          timetips(); 
  30.                     } 
  31.                   //console.log(data); 
  32.                } 
  33.          }); 
  34. }); 
  35. //判断验证码是否正确 
  36. //通过键盘事件触发 
  37. $('#verify').keyup(function(){ 
  38. var verify = $('#verify').val(); 
  39. var phone  = $('#phone').val(); 
  40. $.ajax({ 
  41. url: "__CONTROLLER__/checkSMSCode"
  42. data: {'verify': verify,'phone': phone }, 
  43. dataType: "json"
  44. type: "POST"
  45. success: function(data) { 
  46. if (data == 'ok') { 
  47. $('#login').attr({'disabled':'true','title':'登录'}).css({'background-Color':'#009688'}); 
  48. }else if (data == 'nos'){ 
  49.   $('#login').attr({'disabled':'false','title':'禁止提交'}).css({'background-Color':'#ccc'}); 
  50.   $("#chk_verify").html("验证码超时");//增加一个超时验证 
  51. }else if(data == 'no'){ 
  52.   $('#login').attr({'disabled':'false','title':'禁止提交'}).css({'background-Color':'#ccc'}); 
  53.   $("#chk_verify").html("验证码错误"
  54. //console.log(data); 
  55. }); 
  56. }); 



如果中间出现任何错误提示,可以参考阿里云帮助:https://help.aliyun.com/document_detail/55451.html?spm=5176.doc55359.6.556.ZG9vwi 进行修改!

至此所有的教程写完了,经验证无误!终于搞定了!

版权所有,转载请注明出处!(百度百家的朋友,请不要在抄袭了!)
¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《thinkphp3.2实现新版阿里大于短信验证功能》发布于石头博客文章,作者:admin,如若转载,请注明出处:https://www.pweb123.com/html/php/717.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有1条评论
点击图片更换
默认站点网友 2017-11-07 17:45:03
回复 支持0
文章不错在一下吧

添加微信好友

添加微信好友

微信小程序

百度小程序