Thinkphp3.2实用篇之计算型验证码示例

5年以前  |  阅读数:687 次  |  编程语言:PHP 

是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码:

首先找到:ThinkPHP\Library\Think\Verify.class.php

在其中加入以下代码:


    public function entry_add($id = '') {
        $this->length='3';
        // 图片宽(px)
        $this->imageW || $this->imageW = $this->length*$this->fontSize*1.5 + $this->length*$this->fontSize/2; 
        // 图片高(px)
        $this->imageH || $this->imageH = $this->fontSize * 2.5;
        // 建立一幅 $this->imageW x $this->imageH 的图像
        $this->_image = imagecreate($this->imageW, $this->imageH); 
        // 设置背景   
        imagecolorallocate($this->_image, $this->bg[0], $this->bg[1], $this->bg[2]); 

        // 验证码字体随机颜色
        $this->_color = imagecolorallocate($this->_image, mt_rand(1,150), mt_rand(1,150), mt_rand(1,150));
        // 验证码使用随机字体
        $ttfPath = dirname(__FILE__) . '/Verify/' . ($this->useZh ? 'zhttfs' : 'ttfs') . '/';

        if(empty($this->fontttf)){
          $dir = dir($ttfPath);
          $ttfs = array();    
          while (false !== ($file = $dir->read())) {
            if($file[0] != '.' && substr($file, -4) == '.ttf') {
              $ttfs[] = $file;
            }
          }
          $dir->close();
          $this->fontttf = $ttfs[array_rand($ttfs)];
        } 
        $this->fontttf = $ttfPath . $this->fontttf;

        if($this->useImgBg) {
          $this->_background();
        }

        if ($this->useNoise) {
          // 绘杂点
          $this->_writeNoise();
        }
        if ($this->useCurve) {
          // 绘干扰线
          $this->_writeCurve();
        }

        // 绘验证码
        $code = array(); // 验证码
        $symbol=array('+','-');
        $codeNX = 0; // 验证码第N个字符的左边距
        $now_symbol=$symbol[rand(0,1)];
        for ($i = 0; $i<$this->length; $i++) {
          if($i==1){
            $code[$i] = $now_symbol;
            $codeNX += mt_rand($this->fontSize*1.2, $this->fontSize*1.6);
            imagettftext($this->_image, $this->fontSize,0, $codeNX, $this->fontSize*1.6, $this->_color, $ttfPath.'2.ttf', $code[$i]);
          }
          else{
            $code[$i] = $this->codeSet[mt_rand(0, strlen($this->codeSet)-1)];
            $codeNX += mt_rand($this->fontSize*1.2, $this->fontSize*1.6);
            imagettftext($this->_image, $this->fontSize, mt_rand(-40, 40), $codeNX, $this->fontSize*1.6, $this->_color, $this->fontttf, $code[$i]);
          } 
        }

        // 保存验证码
        $key    =  $this->authcode($this->seKey);
        $str=implode('', $code);
        eval("\$re=$str;");
        $code    =  $this->authcode($re);
        $secode   =  array();
        $secode['verify_code'] = $code; // 把校验码保存到session
        $secode['verify_time'] = NOW_TIME; // 验证码创建时间
        session($key.$id, $secode);

        header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
        header('Cache-Control: post-check=0, pre-check=0', false);    
        header('Pragma: no-cache');
        header("content-type: image/png");

        // 输出图像
        imagepng($this->_image);
        imagedestroy($this->_image);
      }


    public function check_add($code, $id = '') {
        $key = $this->authcode($this->seKey).$id;
        // 验证码不能为空
        $secode = session($key);
        if($code===false || empty($secode)) {
          return false;
        }
        //验证码是否是数字
        if(!is_numeric($code)) {
          return false;
        }
        // session 过期
        if(NOW_TIME - $secode['verify_time'] > $this->expire) {
          session($key, null);
          return false;
        }
        if($this->authcode($code) == $secode['verify_code']) {
          $this->reset && session($key, null);
          return true;
        }
        return false;
      }

生成方法:


    Public function verify(){
        import('ORG.Util.Verify');
        $Verify = new Verify();
        $Verify->useNoise = true;
        $Verify->codeSet = '0123456789';
        $Verify->useCurve = false;
        $Verify->entry_add();
      }

验证方法:


     if (!check_verify($verify,'','add')) {
          $this->error('验证码错误!');
          return;
        }

调用的公共方法:


     // 检测输入的验证码是否正确,$code为用户输入的验证码字符串
    function check_verify($code, $id = '',$type=''){
      import('ORG.Util.Verify');
      $verify = new Verify();
      if($type='add'){
        return $verify->check_add($code, $id);
      }
      else{
        return $verify->check($code, $id);
      }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例