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时间戳使用实例代码
Jun 07 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
PHPAnalysis中文分词类详解
Jun 13 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
php更新cookie内容的详细方法
Sep 30 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
Oct 03 PHP
PHP的imageTtfText()函数深入详解
Mar 03 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添加Xdebug扩展的方法
2014/02/12 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
JavaScript 乱码问题
2009/08/06 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
js 幻灯片的实现
2011/12/06 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python字典遍历操作实例小结
2019/03/05 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
如何转换一个字符串到enum值
2014/04/12 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
迟到检讨书1000字
2014/01/15 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
出国留学计划书
2014/04/27 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
助学感谢信范文
2015/01/21 职场文书
财务部岗位职责
2015/02/03 职场文书
看雷锋电影观后感
2015/06/10 职场文书
董事长秘书工作总结
2015/08/14 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js
gojs实现蚂蚁线动画效果
2022/02/18 Javascript