在laravel框架中使用自定义PHP验证码工具类
本文代码地址 ,可以直接转到此地址下载代码https://github.com/zhupeixin/blog_demo/blob/master/201804/VerificationCode.php
关于代码使用,这里不介绍程序实现原理,原理可参见代码注释。
这里简单介绍在laravel框架中的使用,其他框架或者原生应用请参考此写法。
- 将下载好的VerificationCode.php文件已入laravel框架中App\Lib目录,若无Lib目录请自行创建,其中App\Lib为命名空间
- 在你想要加入验证码逻辑的控制器文件中,使用这个命名空间 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这种相似字符
- 在控制器类中加入此方法,用于获取验证码,并向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);
}
}
本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:http://zhupeixin.com/article/2018/04/verificationcode
( 本篇完 )
- 下一篇: JavaScript简介