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 相关文章推荐
多文件上载系统完整版
Oct 09 PHP
我的论坛源代码(五)
Oct 09 PHP
php中iconv函数使用方法
May 24 PHP
解析crontab php自动运行的方法
Jun 24 PHP
php常用hash加密函数
Nov 22 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
php和nginx交互实例讲解
Sep 24 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 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
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
VUE重点问题总结
2018/03/19 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
js实现网页随机验证码
2020/10/19 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
飞利浦法国官网:Philips法国
2019/07/10 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
西安交大自主招生自荐信
2014/01/27 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
css3新特性的应用示例分析
2022/03/16 HTML / CSS