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 相关文章推荐
java EJB 加密与解密原理的一个例子
Jan 11 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
php将session放入memcached的设置方法
Feb 14 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
php常用的url处理函数总结
Nov 19 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
Oct 08 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
PHP中关键字interface和implements详解
Jun 14 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
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
python重试装饰器示例
2014/02/11 Python
Python字符串格式化输出方法分析
2016/04/13 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
UNIX文件类型
2013/08/29 面试题
财务管理专业推荐信
2013/11/19 职场文书
函授毕业自我鉴定
2013/12/19 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
校园公益广告语
2014/03/13 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript