全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php封装的验证码类分享

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

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

  这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前啰嗦一下。

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

  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封装  # 验证码类  # php  # 验证码  # php验证码类  # php封装验证码  # 一个漂亮的php验证码类(分享)  # PHP验证码类代码( 最新修改  # 完全定制化! )  # 一个经典的PHP验证码类分享  # 一个好用的PHP验证码类实例分享  # PHP 动态随机生成验证码类代码  # 一个PHP验证码类代码分享(已封装成类)  # PHP学习笔记 用户注册模块用户类以及验证码类  # php实现的Captcha验证码类实例  # 必须先  # 是在  # 在此  # 较高  # 噪点  # 不支持  # 才行  # 再用  # 才能够  # 配置文件  # 都是  # 婚姻关系  # 有什么  # 几个  # 善始善终  # 一遍  # 再加上  # 就行  # 英文 


相关文章: 建站之星如何实现PC+手机+微信网站五合一建站?  网站网页制作专业公司,怎样制作自己的网页?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  建站之家VIP精选网站模板与SEO优化教程整合指南  Android自定义控件实现温度旋转按钮效果  已有域名如何免费搭建网站?  建站主机数据库如何配置才能提升网站性能?  制作网页的网站有哪些,电脑上怎么做网页?  北京网站制作的公司有哪些,北京白云观官方网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  外贸公司网站制作哪家好,maersk船公司官网?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何快速启动建站代理加盟业务?  为什么Go需要go mod文件_Go go mod文件作用说明  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何选购建站域名与空间?自助平台全解析  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  黑客如何通过漏洞一步步攻陷网站服务器?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  网站制作企业,网站的banner和导航栏是指什么?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何快速重置建站主机并恢复默认配置?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何用VPS主机快速搭建个人网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  建站主机选哪家性价比最高?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何在腾讯云服务器快速搭建个人网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  建站主机是否等同于虚拟主机?  建站之星2.7模板快速切换与批量管理功能操作指南  网站制作公司,橙子建站是合法的吗?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何在阿里云服务器自主搭建网站?  广平建站公司哪家专业可靠?如何选择?  内网网站制作软件,内网的网站如何发布到外网?  学校为何禁止电信移动建设网站?  大同网页,大同瑞慈医院官网?  如何在万网开始建站?分步指南解析  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  高防服务器租用首荐平台,企业级优惠套餐快速部署  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  如何在Windows虚拟主机上快速搭建网站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  魔方云NAT建站如何实现端口转发? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。