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 相关文章推荐
mysql 字段类型说明
Apr 27 PHP
php变量范围介绍
Oct 15 PHP
解析zend studio中直接导入svn中的项目的方法步骤
Jun 21 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
PHP实现原比例生成缩略图的方法
Feb 03 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
php实现图片按比例截取的方法
Feb 06 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 PHP
PHP7 其他语言层面的修改
Mar 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
PHP数据过滤的方法
2013/10/30 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
PHP安全下载文件的方法
2016/04/07 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
js闭包用法实例详解
2016/12/13 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
python计算方程式根的方法
2015/05/07 Python
python搭建微信公众平台
2016/02/09 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
Python进行数据提取的方法总结
2016/08/22 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
python3中str(字符串)的使用教程
2017/03/23 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
python全栈开发语法总结
2020/11/22 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
new修饰符是起什么作用
2015/06/28 面试题
校园会短篇的广播稿
2014/10/21 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
演讲开场白台词大全
2015/05/29 职场文书
导游词之无锡古运河
2019/11/14 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript