2678777127 发表于 2018-2-11 11:58:08


            是不是觉得普通的验证码已经没办法满足,接下来介绍如何将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, $this->bg, $this->bg);
    // 验证码字体随机颜色
    $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 != '.' && substr($file, -4) == '.ttf') {
          $ttfs[] = $file;
      }
      }
      $dir->close();
      $this->fontttf = $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;
    for ($i = 0; $ilength; $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;
      $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);
}
页: [1]
查看完整版本: Thinkphp3.2实用篇之计算型验证码示例