首页 >后端开发 >php教程 >关于Thinkphp3.2的计算型验证码的解析

关于Thinkphp3.2的计算型验证码的解析

不言
不言原创
2018-06-11 10:12:251629浏览

本篇文章主要介绍了Thinkphp3.2实用篇之计算型验证码示例,内容挺不错的,现在分享给大家,也给大家做个参考。

是不是觉得普通的验证码已经没办法满足,接下来介绍如何将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.&#39;2.ttf&#39;, $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(&#39;&#39;, $code);
    eval("\$re=$str;");
    $code    =  $this->authcode($re);
    $secode   =  array();
    $secode[&#39;verify_code&#39;] = $code; // 把校验码保存到session
    $secode[&#39;verify_time&#39;] = NOW_TIME; // 验证码创建时间
    session($key.$id, $secode);
            
    header(&#39;Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate&#39;);
    header(&#39;Cache-Control: post-check=0, pre-check=0&#39;, false);    
    header(&#39;Pragma: no-cache&#39;);
    header("content-type: image/png");

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

public function check_add($code, $id = &#39;&#39;) {
    $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[&#39;verify_time&#39;] > $this->expire) {
      session($key, null);
      return false;
    }
    if($this->authcode($code) == $secode[&#39;verify_code&#39;]) {
      $this->reset && session($key, null);
      return true;
    }
    return false;
  }

生成方法:

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

验证方法:

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

 调用的公共方法:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

thinkPHP5框架自定义验证器的实现

thinkPHP模板算术运算相关函数的用法

以上是关于Thinkphp3.2的计算型验证码的解析的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn