使用Laravel实现简单验证码

传送门:使用Laravel实现知乎注册功能

2018年6月3日17:44:14 实习第五周 XXM

Begin

首先我们需要创建一个画布,我们通过imagecreatetruecolor函数创建,我们需要初始化一个宽和高

$image = imagecreatetruecolor($width , $height);

然后我们需要一些字符来作为我们的验证码的验证信息,我这里使用的是26个字母混合大小写及数字

$str = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";

因为0和O相似 1和I相似 我们便把它们排除掉.

然后通过str_shuffle()函数来打乱所有的字符,然后用substr来截取我们想要的验证码长度.

$string = substr(str_shuffle($str) , 0 , $num);

然后设置画布的背景颜色

imagefilledrectangle($image , 0 , 0 , $width , $height , imagecolorallocate($image , 251, 252, 253));

然后往画布上写入字符

for($i = 0; $i<$num; $i++) {  //因为我们设定的是输出4 个字符,所以$i是小于的$num
	        $x+=10;
	        $y = mt_rand(10 , $height - 20);
	        imagechar ($image , 5 , $x , 15 , $string[$i] , imagecolorallocate($image , 0,119,230));
	    }

然后把画布保存为图片

 ob_start(); //打开输出控制缓冲
	    imagepng($image);//生成图片
	    $content = ob_get_contents();//返回输出缓冲区的内容
	    imagedestroy($image);//销毁
     	ob_end_clean();//缓冲区并关闭输出缓冲
     	return response($content, 200, [
        'Content-Type' => 'image/png',
    	]);

完整代码:

public function verifyCode($width = 100 , $height = 40 , $num = 4 ,$x = 15,Request $request)
	{
		//1 创建画布
    	$image = imagecreatetruecolor($width , $height);	     
	    //2 创建字符 数字大小写字母的混合
	    $str = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
	    $string = substr(str_shuffle($str) , 0 , $num);
	    //3.创建Session
	    $request->session()->put('code',$string);
	    //4.设置验证码的背景色
	    imagefilledrectangle($image , 0 , 0 , $width , $height , imagecolorallocate($image , 251, 252, 253));
	    //5. 往画布上写入字符
	    for($i = 0; $i<$num; $i++) {  //因为我们设定的是输出4 个字符,所以$i是小于的$num
	        $x+=10;
	        $y = mt_rand(10 , $height - 20);
	        imagechar ($image , 5 , $x , 15 , $string[$i] , imagecolorallocate($image , 0,119,230));
	    }
	    ob_start(); //打开输出控制缓冲
	    imagepng($image);//生成图片
	    $content = ob_get_contents();//返回输出缓冲区的内容
	    imagedestroy($image);//销毁
     	ob_end_clean();//缓冲区并关闭输出缓冲
     	return response($content, 200, [
        'Content-Type' => 'image/png',
    	]);
	}

QQ截图20180603175636.png

在编写中出现的问题使用原生php代码向浏览器输出图片的时候回出现一堆乱码

header("Content-type: image/png");

通过查询资料发现

QQ截图20180603175949.png

把原生代码改为以下即可正常输出.

$content = ob_get_clean();
    return response($content, 200, [
        'Content-Type' => 'image/png',
    ]);

End

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容