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 is_dir() 判断给定文件名是否是一个目录
May 10 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
thinkphp 多表 事务详解
Jun 17 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
PHP构造二叉树算法示例
Jun 21 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 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获取参数的几种方法总结
2014/02/18 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
javascript Math.random()随机数函数
2009/11/04 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
python中函数默认值使用注意点详解
2016/06/01 Python
Python时间获取及转换知识汇总
2017/01/11 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
Python绘制热力图示例
2019/09/27 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
python中if及if-else如何使用
2020/06/02 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
python实现网页录音效果
2020/10/26 Python
python热力图实现简单方法
2021/01/29 Python
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
理财投资建议书
2014/03/12 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书