php封装的验证码类分享


Posted in PHP onFebruary 26, 2017

验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为php的类插件用,在此分享给各位读友。

实现的原理也是很简单,就是利用画布的几个函数,再加上一些字符串的获取,东凑西凑就构成了,呵呵。

这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前??乱幌隆?/p>

首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正。

1、创建画布函数:imagecreatetruecolor(w,h);

说明:用于创建一个画布。

w 画布的宽

h 画布的高

此函数的返回值资源类(gd)

2、为画布创建一种颜色:imagecolorallocate(img,red,green,blue)

说明:

img画布资源

red,green,blue

是0~255的范围

3、为画布添加背景色

imagefill(img,x,y,color);

说明:

在 image 图像的坐标 x,y(图像左上角为 0, 0)

4、画边框

imagerectangle($img,x1,y1,x2,y2,color);

说明:

其左上角坐标为 x1, y1,右下角坐标为 x2, y2。图像的左上角坐标为 0, 0。

3、绘制内容(字符)

imagestring(img ,size,x,y,string,color);

说明:

img画布

size是字大小 1至5

x,y是起始点

string是所要画的内容

color是颜色

4、告诉浏览器图片格式

header("Content-type:image/png");可为image/gif等等

5、输出(或保存),也可以使用第2个参数实现保存

imagepng(img【,filename】)

imagejpeg(img【,filename】)

imagegif(img【,filename】)

6、添加干扰线,本质就是直线

imageline(img,x1,y1,x2,y2,color);

说明:

img 画布

x1,y1 起点

x2,y2 终点

color 颜色

7、imagettftext ( img,size, angle, x, y, color, fontfile,text )

说明:

img 画布

size 字体大小,缺省单位像素

angle 角度

x,y 坐标点

color 颜色

fontfile 字体文件,必须是中文字体

text 内容

特别说明:这里的color参数都是imagecolorallocate()函数创建的颜色

下面是思路:

这里最先生成画布,之后就是为画布添加字符串,直线,噪点,边框,来生成验证码的,最后类返回的两个公用接口是:可供外面调用的生成验证码的画布和验证码的字符串构成,为的是给外界输出验证码画布,以及存储字符串,作为验证用

下面是代码:

<?php
namespace captcha;
/*
*验证码类
*verify方法生成验证码字符串
*entry方法生成验证码
*特别提醒:这里要先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法调用captchaImage生成的,所以必须先调用它才行
*有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码
*/
class Captcha{
  //配置参数
  private $config = array();
  //验证码
  private $verifyCode = '';
  //获取配置文件的配置信息,给类传参数就行,例如new Captcha($config);$config是你的配置文件信息
  public function __construct($config=array('width'=>100,'height'=>40,'length'=>4,'size'=>7,'lines'=>0,'dots'=>0,'font'=>'simfang.ttf','rectangle'=>array(255,55,122),'charset'=>true,'chinese'=>'来到新机场主航站楼建设在婚姻关系存续期间所负债务她在收到要求她偿还前夫在婚姻关系存续期间所欠债务的法院传票后要精益求精善始善终')){
    $this->config = $config;
  }
  //创建验证码
  private function captchaImage(){
    //画布
    $img = imagecreatetruecolor($this->config['width'],$this->config['height']);
    //填充画布颜色
    imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
    //需要边框则画边框
    if($this->config['rectangle'] && is_array($this->config['rectangle']) && count($this->config['rectangle']) == 3){
      $this->tangle($img);
    }
    $this->verifyCode = $this->code($img,$this->config['charset'],$this->config['chinese']);
    //存在则添加干扰线
    if($this->config['lines']){
      $this->codeLines($img);
    }
    //存在则添加干扰点
    if($this->config['dots']){
      $this->codeDots($img);
    }
    return $img;
  }
  private function codeLines($img){
    //绘制干扰线
    for($i=0;$i<$this->config['lines'];$i++){
      imageline($img,mt_rand(0,$this->config['width'] / 10),mt_rand(0,$this->config['height']),mt_rand($this->config['width'] * 7/ 10,$this->config['width'] * 9/ 10),mt_rand(0,$this->config['height']),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
    }
  }
  private function codeDots($img){
    //添加噪点
    for($i=0;$i<$this->config['dots'];$i++){
      //噪点颜色
      $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180));
      imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),'*',$color);
    
    }
  }
  /*画布边框*/
  private function tangle($img){
    imagerectangle($img,0,0,$this->config['width']-1,$this->config['height']-1,imagecolorallocate($img,$this->config['rectangle'][0],$this->config['rectangle'][1],$this->config['rectangle'][2]));
  }
  /*生成验证码,默认英文,$ch为true则为中文*/
  private function code($img,$ch=false,$set=''){
    $str = "";
    //计算间隔
    $span = ceil($this->config['width']/($this->config['length']+1));
    if($ch && !empty($set)){
      //随机产生字符
      $set = $this->config['chinese'];
      for($i=0;$i<$this->config['length'];$i++){
        $end = strlen($set)/3;
        $pos = mt_rand(0,$end-1);
        $str .= substr($set,$pos*3,3);
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config['length'];$i++){
        imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config['height']*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config['font'],substr($str,($i-1)*3,3));
      }
    }else{
      //随机生成字母或者数字
      for($i=0;$i<$this->config['length'];$i++){
        switch(mt_rand(0,2)){
          case 0:
          $str .= chr(mt_rand(65,90));
          break;
        case 1:
          $str .= chr(mt_rand(97,122));
          break;
        case 2:
          $str .= chr(mt_rand(48,57));
        }
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config['length'];$i++){
        imagestring($img,$this->config['size'],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)));
      }
    }
    return $str;
  }
  //获取验证码
  public function verify(){
    return $this->verifyCode;
  }
  //生成验证码
  public function entry(){
    header("content-type:image/png");
    imagepng($this->captchaImage());
  }
}
$ob = new Captcha;
$ob->entry();

最后,为了不误人子弟,还是再强调一遍:
这里必须先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法的方法captchaImage中生成的,所以必须先调用它才行 有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码

PHP 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
php 提速工具eAccelerator 配置参数详解
May 16 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
PHP生成随机用户名和密码的实现代码
Feb 27 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
PHP微信API接口类
Aug 22 PHP
php中str_pad()函数用法分析
Mar 28 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
php的单例模式及应用场景详解
Feb 27 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 #PHP
简单谈谈PHP中的trait
Feb 25 #PHP
laravel中命名路由的使用方法
Feb 24 #PHP
cakephp常见知识点汇总
Feb 24 #PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 #PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 #PHP
CakePHP框架Session设置方法分析
Feb 23 #PHP
You might like
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
python实现剪切功能
2019/01/23 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
学习心得体会
2014/01/01 职场文书
银行批评与自我批评
2014/02/10 职场文书
农村婚礼主持词
2014/03/13 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
个人授权委托书模板
2014/09/14 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
vue中data里面的数据相互使用方式
2022/06/05 Vue.js