阿里大鱼短信php+ajax发送短信验证码和提交数据实例

有时我们在帮客户做网站的过程中,会遇到需要短信验证码的场景,比如用户的注册、用户的登录、用户找回密码、留言时的短信验证码验证等。这里我以阿里大鱼的短信验证码举例,来说一说具体的使用流程,已经用在客户的网站上了,这里是做一个复盘总结,希望有需要的朋友能够用得上。

整体效果如下,流程是这样的:点击“获取验证码”会验证填的手机号格式是否正确,如果正确则把数据通过ajax方式提交到网站服务器端,服务器端也做好验证工作,没有问题的话则向对应的手机号发送一个验证码,同时通过session保存生成的验证码,60秒内有效,超过60秒点击“重新获取”,并有一个倒计时提示效果。

阿里大鱼短信php+ajax发送短信验证码和提交数据实例

验证码发送成功后,点击注册按钮的话,如果验证提交的数据没有问题,则把数据通过ajax提交到服务器端,服务器端同样做好数据验证即可,没有问题则把数据入库,并返回提示即可。

服务器端的验证码验证主要包括3个:传过来的手机号是否是客户在前端输入的那个手机号,传过来的验证码是否是客户输入的那个验证码,验证码的有效时间是否已经到期。

下面简单的附上部分代码,后面有做附件打包,感兴趣的朋友可以下载了解看看

1、前端部分:smsdemo.html

 
 <!DOCTYPE html>
 <head>
 <title>阿里大鱼,php+ajax发送短信验证码和提交数据实例</title>
 </head>
  
 <body>
  
 <form method="post" action="" class="myfm">
 <div>
 <input type="text" id="phone" name="phone" placeholder="请输入手机号">
 </div>
 <div>
 <input type="text" id="verycode" name="verycode" placeholder="请输入验证码">
 <a onclick="send_sms(this);" id="verify-btn" style="cursor: pointer;">获取验证码</a>
 </div>
  
 <div>
 <input type="password" name="password" placeholder="请输入密码 ( 最少八位 )">
 </div>
  
 <div>
 <input type="password" name="pwdconfirm" placeholder="请再次输入密码">
 </div>
  
 <input type="submit" name="dosubmit" value="注册">
 </form>
  
 <script type="text/javascript" src="sms/jquery.min.js"></script>
 <script type="text/javascript" src="sms/sms_send.js"></script> <!--短信验证码发送-->
 <script type="text/javascript" src="sms/sms_do.js"></script><!--ajax数据提交-->
  
  
 </body>
 </html>

2、ajax提交电话到服务器端,并利用阿里大鱼发送短信:/sms/sms_send.js+/sms/ali/sms_send.php

 
   //#phone 电话输入框的ID  #verify-btn  获取验证码的ID
   var countdown;
   var flag = 0;
   var sec = 60;
   var int;
   function send_sms(obj) {
       var phone = $("#phone").val();
       //console.log(phone);
       var partten = /^1[3-9]\d{9}$/;
       if(!partten.test(phone)){
         alert("请输入正确的手机号码");
         $('#phone').focus();
         return false;
       }
       if(flag == 0){
         $.post('/sms/ali/sms_send.php',{"tel":phone},function(data){
           if(data.status != 1){
             alert(data.msg);
           }else{}
         },'json')
         flag = 1;
         $(this).css("backgroundColor",'white');
         $(this).css("borderColor",'grey');
         int = setInterval(countfunc,1000);
       }
       else{
         return false;
       }
   }
       // 获取验证码点击后倒计时
   function countfunc(){
     if(sec > 0){
       $("#verify-btn").text("重新获取(" + sec + ")");
       sec--;
     }else{
       flag = 0;
       sec = 60;
       $("#verify-btn").css("backgroundColor",'white');
       // $("#verify-btn").css("borderColor",'#d43f3a');
       $("#verify-btn").text("获取验证码");
       clearInterval(int);
     }
   }
  
<?php
 session_start();
  
 .......
  
 /*
     status -1 60秒内不能重复发送
     status 1  发送成功
     status 2
     status 3  手机号不正确
 */
  
  
 $phone=$_POST["tel"];
  
 if(preg_match("/^1[34578]{1}\d{9}$/",$phone)){
  
     // 加载区域结点配置
     Config::load();
  
     class Sms
     {
 
        ....... 
  
         /**
          * 发送短信
          * @return stdClass
          */
         public static function sendSms($phoneNumbers) {
      
  
             // 初始化SendSmsRequest实例用于设置发送短信的参数
             $request = new SendSmsRequest();
  
             // 必填,设置短信接收号码
             $request->setPhoneNumbers($phoneNumbers);
  
             // 必填,设置签名名称,应严格按"签名名称"填写,请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
             $request->setSignName("企业核名");
  
             // 必填,设置模板CODE,应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
             $request->setTemplateCode("SMS_205885284");
  
             // 可选,设置模板参数, 假如模板中存在变量需要替换则为必填项
             
  
  
             if (isset($_SESSION["smscode_time"]) && (time() - $_SESSION["smscode_time"]) < 60) {
                 return array('status' => -1, 'msg' => '60秒内不能重复发送');
             }
  
  
  
      function getrandchar($length){
      $str = null;
      $strPol = "0123456789";
      $max = strlen($strPol)-1;
      for($i=0;$i<$length;$i++){
      $str.=$strPol[rand(0,$max)];
      }
      return $str;
      }
  
      $code = getrandchar(6);
      
      $_SESSION["smscode"]=$code;      //保存短信验证码
      $_SESSION["phone"]=$phoneNumbers;  //保存手机号
             $_SESSION["smscode_time"]=time();   //保存短信生成时间
             
             $request->setTemplateParam(json_encode(array(  // 短信模板中字段的值
                 "code"=>$code,           
             ), JSON_UNESCAPED_UNICODE));
  
             // 可选,设置流水号
             $request->setOutId("45656");
  
             // 选填,上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
             $request->setSmsUpExtendCode("1234567");
  
             // 发起访问请求
             $acsResponse = static::getAcsClient()->getAcsResponse($request);
  
             if($acsResponse->Code == "OK")
                 return array('status' => 1, 'msg' => '发送成功!');
             else
                 return array('status' => -1, 'msg' => $acsResponse->Message);
         }
  
      
  
     }
  
     // 调用示例:
     set_time_limit(0);
     header('Content-Type: text/plain; charset=utf-8');
  
     $response = Sms::sendSms($phone); 
  
 echo json_encode($response);
  
 }else{
     $data=array(status=>3,msg=>"手机号不正确");
 echo json_encode($data);
 }

3、ajax提交数据,服务器端做好对应的验证:/sms/sms_do.js和/sms/ali/sms_do.php

 $(document).ready(function(){
       $('.myfm input[name=dosubmit]').click(function(e){
         let obj={
           'phone':$('.myfm input[name=phone]').val(),    //电话     
           'verycode':$('.myfm input[name=verycode]').val(),     //短信验证码
           'password':$('.myfm input[name=password]').val(),     //密码
           'pwdconfirm':$('.myfm input[name=pwdconfirm]').val(),     //确认密码
         }

         if(obj.phone==''){
           alert("请输入手机号");
           $('.myfm input[name=phone]').focus();
           return false;
         }
         if(!checkPhone(obj.phone)){
           alert("手机号码输入有误,请重新输入");
           $('.myfm input[name=phone]').focus();
           return false;
         }
  
          if(obj.verycode==''){
            alert("请输入你收到的验证码");
            $('.myfm input[name=verycode]').focus();
            return false;
          }
  
          if(obj.password==''){
            alert("请输入密码");
            $('.myfm input[name=password]').focus();
            return false;
          }
  
          if(obj.pwdconfirm==''){
            alert("请输入确认密码");
            $('.myfm input[name=pwdconfirm]').focus();
            return false;
          }
  
          if(obj.password != obj.pwdconfirm){
             alert("密码输入不一致!");
             return false;
          }
  
         $.ajax({ 
          type : "POST", //提交方式 
          url : "/sms/ali/sms_do.php",//路径 
          data : { 
           "dosubmit":"dosubmit",
           "ajax":"1",
  
           'info[phone]':obj.phone,
           'info[password]':obj.password,
           'info[pwdconfirm]':obj.pwdconfirm,
  
           'verycode':obj.verycode,
  
          },//数据,这里使用的是Json格式进行传输 
          //dataType: "json",
          success : function(result) {//返回数据根据结果进行相应的处理             
           if(result == "ok"){
             alert('您已提交成功,我们会马上安排人员和您联系!');
            }else if(result == "codeerror"){
              alert('验证码错误!');
              }else if(result == "timeerror"){
               alert("验证码已过期!");
              }else if(result == "telerrorr"){
               alert("电话号码错误!");
              }else{alert(result);}
          } 
         });
           e.stopPropagation();//禁止响应父元素的相关事件
           e.preventDefault();//防止跳转
       })
  
 })
  
     function checkPhone(phone){ 
       if(!(/^1[3456789]\d{9}$/.test(phone))){ 
         return false; 
       }else{
         return true;
       }
       
     }
<?php
 session_start();
  
 if(isset($_POST['verycode'])){//手机验证码验证
  
  
 $code = isset($_SESSION['smscode']) ? $_SESSION['smscode'] : '';  //短信验证码增加
 $phone_numbers = isset($_SESSION['phone']) ? $_SESSION['phone'] : '';  //短信验证码增加
 $time = isset($_SESSION['smscode_time']) ? $_SESSION['smscode_time'] : 0;  //短信验证码增加
  
     if($_POST['smscode'] != $code){ 
         echo "codeerror";exit;
     }
  
     if(time() - $time >= 60){ // 这个是过期时间,60秒内有效
         echo "timeerror";exit;
         exit;   
     }
  
  
 if($_POST['info']['phone'] != $phone_numbers){ 
         echo 'telerrorr';
         exit;
     }
  
 $_SESSION['smscode'] = '';
  
 //处理其他事务,比如数据入库等操作
 }else{
  
 }
  
 ?>

关注公众号:太友帮,回复“阿里大鱼短信”即可免费获取 《利用阿里大鱼发送短信验证代码实例.zip》

管道链接:阿里云短信官网

2021-04-22更新

如果第三方短信服务提供商提供的是api接口的写法,短信发送实现方式如下,结合网站访客留言,短信验证码实例如下:

            $url = "https://sdk2.02d8lwk.com:9988/BatchsSend2.aspx?";
             $ContentS = "您好,您的验证码是:".$code.",请妥善保管。";
             $ContentS = rawurlencode(mb_convert_encoding($ContentS, "gb2312", "utf-8"));//短信内容做GB2312转码处理
             $CorpID = "CdDJT0dd01054";
             $Pwd = "B3dd56dEC";
             $Mobile = $phoneNumbers;
  
             $SendTime = "";
  
             $curpost = "CorpID=".$CorpID."&Pwd=".$Pwd."&Mobile=".$Mobile."&Content=".$ContentS."&SendTime=".$SendTime;
  
             //POST方式请求
             $ch = curl_init();
             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 -https
             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); 
             curl_setopt($ch, CURLOPT_URL, $url);
             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
             curl_setopt($ch, CURLOPT_POST, 1);
             curl_setopt($ch, CURLOPT_POSTFIELDS, $curpost);
             $result = curl_exec($ch);
             curl_close($ch);
api短信php+ajax发送短信验证码和提交数据实例

相关推荐