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


Posted in PHP onFebruary 09, 2017

是不是觉得普通的验证码已经没办法满足,接下来介绍如何将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 相关文章推荐
PHP 命名空间实例说明
Jan 27 PHP
探讨如何把session存入数据库
Jun 07 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
使用php清除bom示例
Mar 03 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
基于PHP实现生成随机水印图片
Dec 09 PHP
PHP 验证身份证是否合法的函数
Feb 09 #PHP
如何打开php的gd2库
Feb 09 #PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 #PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 #PHP
使用php实现网站验证码功能【推荐】
Feb 09 #PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 #PHP
PHP设置Cookie的HTTPONLY属性方法
Feb 09 #PHP
You might like
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
python中list循环语句用法实例
2014/11/10 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
python爬取哈尔滨天气信息
2018/07/14 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
幼儿园消防演练方案
2014/02/13 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS