ag旗舰厅官网_ag旗舰厅下载客户端

热门关键词: ag旗舰厅官网,ag旗舰厅下载客户端

关于计算机

当前位置:ag旗舰厅官网 > 关于计算机 > thinkphp短信验证注册例子,3验证码显示

thinkphp短信验证注册例子,3验证码显示

来源:http://www.pedaLyourcycLe.com 作者:ag旗舰厅官网 时间:2019-10-03 17:08

ThinkPHP3.2.3验证码体现、刷新、校验 ,具体如下:

 

来得验证码

图片 1

首先在Home/Controller下创立二个公共调节器PublicController

前言
登记时平常索要用到短信验证码,本文记录一下思路和实际达成。
短信验证平台利用云片,短信验证码的生成使用thinkphp。

 

思路
1、顾客输入手机号,央浼获取短信验证码。
2、thinkphp生成短信验证码,存款和储蓄,同期和其他参数一同发送乞求给云片。
3、云片发送短信验证码到钦点手提式无线电话机号。
4、客商输入短信验证码。
5、thinkphp根据验证码是不是正确、验证码是还是不是过期五个尺码判定是还是不是表达通过。

 代码如下

代码完结
表明接口
接口地址:https://sms.yunpian.com/v1/sms/send.json。
运用postman,输入几个必得的参数apikey、mobile和text。

<?php

php发起http/https请求
使用php的curl函数发起https必要,带入参数apikey、mobile和text。

namespaceHomeController;

// 获取短信验证码
public function getSMSCode(){

 

    // create curl resource
    $ch = curl_init();

useThinkController;

    // set url
    $url = '';
    curl_setopt($ch, CURLOPT_URL, $url);

useThinkVerify;

    // set param
    $paramArr = array(
        'apikey' => '******',
        '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);

classPublicControllerextendsController

    //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);

  publicfunctionverify()

    echo $output;
}
变迁随机短信验证码
私下认可生成四人的妄动短信验证码。

  {

// 生成短信验证码
public function createSMSCode($length = 4){
    $min = pow(10 , ($length - 1));
    $max = pow(10, $length) - 1;
    return rand($min, $max);
}
整合
在数据库新建表sun_smscode:

    $config= [

DROP TABLE IF EXISTS `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代码:

      'fontSize'=> 19,// 验证码字体大小

// 获取短信验证码
public function getSMSCode(){

      'length'=> 4,// 验证码位数

    // create curl resource
    $ch = curl_init();

      'imageH'=> 34

    // set url
    $url = '';
    curl_setopt($ch, CURLOPT_URL, $url);

    ];

    // set param
    $mobile = $_POST['mobile'];
    $code = $this->createSMSCode();
    $paramArr = array(
        'apikey' => '******',
        'mobile' => $mobile,
        'text' => '【小太阳】您的验证码是'.$code
    );
    $param = '';
    foreach ($paramArr as $key => $value) {
        $param .= urlencode($key).'='.urlencode($value).'&';
    }
    $param = substr($param, 0, strlen($param)-1);

    $Verify=newVerify($config);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VE凯雷德IFYPEE奇骏, false); //不验证证书下同
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $Verify->entry();

    //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);
    //$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;

  publicfunctioncheck_verify($code,$id='')

        $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);
                }
            }
        }
       
    }
}
证实短信验证码
证实短信验证码时间是还是不是过期,验证短信验证码是还是不是准确。

  {

// 验证短信验证码是不是管用
public function checkSMSCode(){
    $mobile = $_POST['mobile'];
    $code = $_POST['code'];
    $nowTimeStr = date('Y-m-d H:i:s');

    $verify=newThinkVerify();

    $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);
            return;
        }

    $res=$verify->check($code,$id);

        if($code != $recordCode){
            $result = array(
                'code' => '2',
                'ext' => '验证码错误,请重新输入'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
            return;
        }

    $this->ajaxReturn($res,'json');

        $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); //60s
    if($period>=0 && $period<=20){
        return true;
    }else{
        return false;
    }
}
改进
为了防范短信轰炸,在伸手获取短信验证码时,必要插手图片验证码。

}

thinkphp提供了生成图片验证码的函数,下边大家来促成验证码的改换、刷新和表明。

 

变化和刷新图片验证码
// 获取图片验证码,刷新图片验证码
public function getPicCode(){
    $config = array(
        'fontSize'=>30,    // 验证码字体大小
        'length'=>4,     // 验证码位数
        'useNoise'=>false, // 关闭验证码杂点
        'expire'=>600
    );
    $Verify = new ThinkVerify($config);
    $Verify->entry(2333);//2333是验证码标识
}
只要,该函数的应和url为

verify函数用于生成验证码,config是用来安顿展现验证码的属性。该属性有哪些可配备项,能够查阅Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。

表明图片验证码
// 验证验证码是不是精确
public function checkPicCode($code){
    $verify = new ThinkVerify();
    if($verify->check($code, 2333)){
        $result = array(
            'code' => '0',
            'ext' => '验证通过'
        );
        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方法。

check_verify函数用于校验验证码的不利。模板post客户填写的验证码到该函数,再次回到$res==true验证通过false验证战败。
前台模板页建设构造index.html

跑通前后端
后端修改
表明图片验证码函数,改为被调用函数:

 

public function checkPicCode($picCode){
    $verify = new ThinkVerify();
    if($verify->check($picCode, 2333)){
        return true;
    }else{
        return false;
    };
}
在收获短信验证码函数的最最上端,增加调用图片验证码函数,唯有经过认证,才发送央求给云片。

 代码如下

// 获取短信验证码
public function getSMSCode(){
    $picCode = $_POST['picCode'];
    if(!$this->checkPicCode($picCode)){
        $result = array(
            'code' => '1',
            'ext' => '验证码错误,请重新输入'
        );
        echo json_encode($result,JSON_UNESCAPED_UNICODE);
        return;
    }
    /*省略*/
}
前边贰个核心代码
<!--register.html-->
<!DOCTYPE html>
<html lang="zh" ng-app="sunApp">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body ng-controller="registerController">
    <form action="" class="register-form" ng-show="isShow1">
        <div class="input-group">
            <input type="text" class="mobile" ng-model="mobile" placeholder="手机号">
        </div>
        <div class="input-group">
            <input type="text" class="pic-code" ng-model="picCode" placeholder="图片验证码">
            <img class="img" src="{{picCodeUrl}}" alt="" ng-click="refresh()">
        </div>
        <div class="input-group">
            <input type="text" class="sms-code" ng-model="SMSCode" placeholder="短信验证码">
            <button class="btn-sms" ng-click="getSMSCode()" ng-disabled="btnSMSDisabled">{{btnSMSText}}</button>
        </div>
        <button class="confirm-btn" ng-click="next()">下一步</button>
    </form>

<divclass="">

    <form action="" class="register-form" ng-show="isShow2">
        <div class="input-group">
            <input type="text" class="mobile" ng-model="mobile" placeholder="手机号" disabled="true">
        </div>
        <div class="input-group">
            <input type="password" class="password" ng-model="password" placeholder="请输入密码">
            <input type="password" class="password" ng-model="password2" placeholder="请再一次输入密码">
        </div>
        <button class="confirm-btn" ng-click="getSMSCode()">注册</button>
    </form>
</body>
</html>
// register.js
angular.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;

<labelfor="j_verify"class="t">验证码:</label> <inputid="j_verify"

    // 获取短信验证码
    $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);
        });
    }

name="j_verify"type="text"class="form-control x in">

    // 验证短信验证码
    $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',
            //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.isShow1 = false;
                $scope.isShow2 = true;
            }
        }, function errorCallback(response) {
            console.log(response.data);
        });
    }

<imgid="verify_img"alt="点击更动"title="点击改变"

    // 刷新图片验证码
    $scope.refresh = function(){
        $scope.picCodeUrl = '/owner-bd/index.php/Home/CheckCode/getPicCode?'+Math.random();
    }

src="{:U('public/verify',array())}"class="m">

});
优化
以上代码,安全性不是很好,大家得以行使工具绕过前端验证。为了制止那几个题材,能够在checkPicCode和checkSMSCode函数中加多session值来标志。

</div>

$_SESSION['checkPicCode'] = true;
$_SESSION['checkSMSCode'] = true;
在终极一步,向数据库中增加客商时,先验证一下多少个session值是还是不是都为true,都为true时再拉长。

 

 

使用Thinkphp的U方法形成生成验证码的图样。

点击刷新验证码

从下面发生验证码的链接大家能够观望,域名/public/verify就能够产生验证码。Thinkphp的验证码生成机制是,若是我们须要发出新的验证码,在该链接后加盟三个变量值就可以。

大家能够设想达成public/verify/变量值的款式UHighlanderL。

 

 代码如下

$("#verify_img").click(function() {

  varverifyURL ="public/verify";

  vartime =newDate().getTime();

  $("#verify_img").attr({

   "src": verifyURL +"/"+ time

  });

});

 

使用JS获取当前岁月戳参预到U路虎极光L之后就能够。

到此大家就能够完结验证码的点击刷新功用。具体表现情势,本身随便哈。

异步兵高校验验证码

我们自然见过在某个网站,大家输入验证码的时候,输入的历程粤语本框前边一向突显错误,直到我们输入争取的时候会先提醒验证码正确的格局。下边代码就足以完成:

 

 代码如下

$("#j_verify").keyup(function() {

  $.post("public/check_verify", {

    code : $("#j_verify").val()

    },function(data) {

    if(data == true) {

      //验证码输入正确

    }else{

      //验证码输入错误

    }

  });

});

 

使用onekeyup。原理就不供给多讲了呢!

如此那般大家就足以兑今后付出顾客名密码从前先举办三遍验证码校验,之后表单提交之后再扩充三次校验,提高顾客体验啦!

还没甘休:

当大家使用如上情势落到实处验证码一回校验的时候,料定会出现第一回异步兵学园验成功,可是付出表单却提示验证码错误的意况!其实原因也许出在Thinkphp的Verify.class.php上:

以下是此类开端的config配置:

 

 代码如下

protected$config= array(

    'seKey'  =>'ThinkPHP.CN', // 验证码加密密钥

    'codeSet' =>'2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',      // 验证码字符集结

    'expire' => 1800,     // 验证码过期时间(s)

    'useZh'  => false,     // 使用普通话验证码

    'zhSet'  =>'……此处不粘贴了,太多了!',      // 国语验证码字符串

    'useImgBg'=> false,     // 使用背景图片

    'fontSize'=> 25,      // 验证码字体大小(px)

    'useCurve'=> false,     // 是还是不是画混淆曲线

    'useNoise'=> false,     // 是还是不是丰盛杂点 

    'imageH' => 0,       // 验证码图片高度

    'imageW' => 0,       // 验证码图片宽度

    'length' => 5,       // 验证码位数

    'fontttf' =>'',      // 验证码字体,不设置随机拿到

    'bg'   =>array(243, 251, 254),// 背景颜色

    'reset'  => true,     // 验证成功后是还是不是重新设置

    );

 

请大家留意最终六特特性reset 表示的是表达成功后是还是不是重新恢复设置验证码。相信大家都精晓了吗,大家开展第二遍校验通过之后,其实该验证码已经失效了,只不过因为大家选用的是异步兵高校验,页面并未刷新,导致了第三次申请校验的时候和类别产生的早已经是不平等的了。所以只要我们爱怜这种一次校验的风格,能够思考将reset配置为false就可以。

本文由ag旗舰厅官网发布于关于计算机,转载请注明出处:thinkphp短信验证注册例子,3验证码显示

关键词:

上一篇:Python文件操作工具

下一篇:没有了