欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-07 10:16:08
是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码: 首先找到:thinkphp\library\think\verify.class...

是不是觉得普通的验证码已经没办法满足,接下来介绍如何将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);
  }
}

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