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 相关文章推荐
Apache+php+mysql在windows下的安装与配置图解(最新版)
Nov 30 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
解析php中heredoc的使用方法
Jun 17 PHP
PHP使用递归生成文章树
Apr 21 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
详解PHP错误日志的获取方法
Jul 20 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
浅析PHP开发规范
Feb 05 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 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中quotemeta()函数的用法讲解
2019/04/04 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
pyside写ui界面入门示例
2014/01/22 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
Python如何在DataFrame增加数值
2020/02/14 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
Python hashlib模块的使用示例
2020/10/09 Python
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
高级编程求职信模板
2014/02/16 职场文书
网页美工求职信范文
2014/04/17 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
宾馆客房管理制度
2015/08/06 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL