找了很多扩展包,要嘛是拿不到验证码文字,要嘛就是拿不到图片路径。
试了很多,最后决定使用这个 lifei6671/php-captcha 扩展包,步骤如下:
1.安装
使用 Composer
在composer.json中的require中加入 "lifei6671/php-captcha": "0.1.*"
然后执行 composer update
2.在控制器中写获取图形验证码的代码
$captch=newCaptchaBuilder();
$captch->initialize([
'width'=>150,//宽度
'height'=>50,//高度
'line'=>false,//直线
'curve'=>true,//曲线
'noise'=>1,//噪点背景
'fonts'=>[]//字体
]);
$captch->create();
$captchaCode = $captch->getText();//获取验证码文字
然后呢,用 $captch->output(1); 来显示图片,显示出来如下图:
发现出现了乱码的现象,记得以前也遇到过这个情况,是百度出的结果,在代码最下面加上句 exit();就可以显示图片了。结果是我的记忆还是不错的,真的有用,可是至于为什么,就记不清了,需要在研究研究。
但是这种情况的话,不适用与前后端分离,我是把验证码的文字,存在了cache里,并带着个uuid来识别用户。所以需要把uuid传给前端,这样的话就传不了。需要传给前端url和uuid,于是乎就想着把图片格式改成base64格式。
代码如下:
执行结果:
现在可以看到这貌似是一个base64格式的图片的,就是前面少了头 'data:image/png;base64,' ,没关系,我们可以自己拼上。来测试一下,把这段代码加上头复制到url上如果显示出的是图片,我们就成功了。
成功!!
然后我们完善一下,给前端一个友好的返回数据格式,完整代码如下:
public function getCaptcha()
{
$captch = new \Minho\Captcha\CaptchaBuilder();
$captch->initialize([
'width' => 150, // 宽度
'height' => 50, // 高度
'line' => false, // 直线
'curve' => true, // 曲线
'noise' => 1, // 噪点背景
'fonts' => [] // 字体
]);
$captch->create();
$uuid = uniqid();
//生成并返回图片流base64编码
ob_start ();
$captch->output(1);
$captchaCode = $captch->getText();
$image_data = ob_get_contents ();
ob_end_clean ();
$captchaDataUrl = base64_encode ($image_data);
$array = [
'captchaDataUrl' => 'data:image/png;base64,'.$captchaDataUrl,
'captcha_uuid' => $uuid
];
Cache::tags(['captcha'])->put($uuid,$captchaCode,5);
return $this->result('成功',$array);
}
返回格式如下:
完成!