在laravel框架中使用自定义PHP验证码工具类


作者:朱培鑫

时间:2018-04-17

本文代码地址 ,可以直接转到此地址下载代码https://github.com/zhupeixin/blog_demo/blob/master/201804/VerificationCode.php

关于代码使用,这里不介绍程序实现原理,原理可参见代码注释。

这里简单介绍在laravel框架中的使用,其他框架或者原生应用请参考此写法。

  1. 将下载好的VerificationCode.php文件已入laravel框架中App\Lib目录,若无Lib目录请自行创建,其中App\Lib为命名空间
  2. 在你想要加入验证码逻辑的控制器文件中,使用这个命名空间 use App\Lib\VerificationCode;
public function __construct($width,$height,$point_num,$line_num,$num=4,$font_size=6,$model=1){
    //code
}

new VerificationCode(80,32,200,5,4,4,6);//实例化验证码类
参数① 指定验证码的宽度
参数② 指定验证码的高度
参数③ 验证码中干扰点的个数
参数④ 验证码中干扰线的个数
参数⑤ 验证码中数字或字母的数量,默认值为4
参数⑥ 验证码中文字的大小,默认为6
参数⑦ 验证码生成模式,共六种生成模式

生成模式
1 -> 纯数字模式
2 -> 纯小写字母模式
3 -> 大小写随机模式
4 -> 数字字母随机模式
5 -> 数字大小写字母随机模式
6 -> 数字字母安全识别模式,剔除如 i,1,l这种相似字符
  1. 在控制器类中加入此方法,用于获取验证码,并向session中写入验证码信息。
public function getVerCode(){
        $image = new VerificationCode(80,32,200,5,4,4,6);
        session(["code"=>$image->value()]);
        return $image->showImage();
    }

[code]

<?php
namespace App\Lib;
/**
 * 生成验证码
 * Class VerificationCode
 */
class VerificationCode {
    protected $image;
    protected $width;
    protected $height;
    protected $data;
    protected $num;
    protected $path;
    protected $strvalue="";

    /**
     * @param int $width
     * @param int $height
     * @param int $num
     * @param int $font_size
     * @param int $model
     * @param int $point_num
     * @param int $line_num
     */
    public function __construct($width,$height,$point_num,$line_num,$num=4,$font_size=6,$model=1){
        $this->width = $width;
        $this->height = $height;
        $this->num = $num;
        //创建白色底图
        $this->image = imagecreatetruecolor($this->width,$this->height);
        $bjcolor = imagecolorallocate($this->image,255,255,255);
        imagefill($this->image,0,0,$bjcolor);
        //填入验证码
        for($i = 0;$i<$this->num;$i++){
            $content = $this->CreateRandData($this->DataModel($model));
            $fontcolor = imagecolorallocate($this->image,rand(0,120),rand(0,120),rand(0,120));
            $x = rand(5,10)+$i*$this->width/$this->num;
            $y = rand(5,10);
            imagestring($this->image,$font_size,$x,$y,$content,$fontcolor);
        }
        //产生干扰
        $this->point($point_num);
        $this->line($line_num);
    }

    /**
     * 验证码产生数据模式
     * @param int $model
     * @return string
     */
    protected function dataModel($model){
        $str = "";
        switch ($model){
            //纯数字模式
            case 1:$str = "0123456789";
                break;
            //纯小写字母模式
            case 2:$str = "qwertyuiopasdfghjklzxcvbnm";
                break;
            //大小写随机模式
            case 3:$str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
                break;
            //数字字母随机模式
            case 4:$str = "0123456789qwertyuiopasdfghjklzxcvbnm";
                break;
            //数字大小写字母随机模式
            case 5:$str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
                break;
            //数字字母安全识别模式
            case 6:$str = "23456789qwertyupasdfghjkzxcvbnm";
                break;
        }
        return $str;
    }
    protected function createRandData($str){
        $s = substr($str,rand(0,strlen($str))-1,1);
        $this->strvalue.=$s;
        return $s;
    }
    /**
     * 用于输出图片
     */
    public function showImage(){
        $newName = md5(time().$this->strvalue).".png";
        $this->path = 'temp/'.$newName;
        header('content-type:image/jpeg');
        imagejpeg($this->image,$this->path);
        return url($this->path);//在laravel框架中才有url这个方法,其他框架请替换这部分
    }

    /**
     * 用于
     * @return string
     */
    public function value(){
        return $this->strvalue;
    }

    /**
     * 产生点干扰
     * @param int $point_num 干扰点数目
     */
    protected function point($point_num=0){
        for($i=0;$i<$point_num;$i++){
            $pointcolor = imagecolorallocate($this->image,rand(50,200),rand(50,200),rand(50,200));
            imagesetpixel($this->image,rand(1,$this->width-1),rand(1,$this->height),$pointcolor);
        }
    }

    /**
     * 产生线干扰
     * @param int $line_num 干扰线数目
     */
    protected function line($line_num=0){
        for($i=0;$i<$line_num;$i++){
            $linecolor = imagecolorallocate($this->image,rand(80,220),rand(80,220),rand(80,220));
            imageline($this->image,rand(1,$this->width-1),rand(1,$this->height-1),rand(1,$this->width-1),rand(1,$this->height-1),$linecolor);
        }
    }

    /**
     * 析构函数,销毁图片
     */
    public function __destruct(){
        imagedestroy($this->image);
    }
}

( 本篇完 )