tp6的验证码是通过password_hash加密,通过session存储的一个验证方式
1.开启session:
tp5的session是默认开启的,但是tp6却不是,如果我们上来直接使用验证码,那么无论如何是验证不成功的,所以我们首先需要开启session才能使用验证码这个功能。
1.打开app目录下的middleware.php
2.取消\think\middleware\SessionInit::class的注释
2.下载验证码:
tp6默认是没有think-captcha扩展的,需要我们手动下载使用
composer require topthink/think-captcha
默认会下载下来最新的版本,我用的验证码版本是v3.0.3
3.修改验证码配置:
使用composer下载下来的验证码扩展会自动在config文件夹下为我们生成captcha.php文件,我们只需要修改相应的配置即可:
return [
//验证码位数
'length' => 4,
// 验证码字符集合
'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',
// 验证码过期时间
'expire' => 1800,
// 是否使用中文验证码
'useZh' => false,
// 是否使用算术验证码
'math' => true,
// 是否使用背景图
'useImgBg' => true,
//验证码字符大小
'fontSize' => 25,
// 是否使用混淆曲线
'useCurve' => false,
//是否添加杂点
'useNoise' => false,
// 验证码字体 不设置则随机
'fontttf' => '',
//背景颜色
'bg' => [243, 251, 254],
// 验证码图片高度
'imageH' => 0,
// 验证码图片宽度
'imageW' => 0,
];
4.使用验证码:
配置完验证码之后我们就可以在页面中使用验证码,文档中验证码有两种使用方式:
1.直接生成验证码的图片html:
{:captcha_img()}
2.生成验证码的图片地址:
<img src="{:captcha_src()}" />
个人建议使用第二种,可以随意的更改验证码的样式,而第一种修改起来比较麻烦
5.验证验证码:
我们需要在控制器中接收页面传来的验证码
$captcha = input('captcha');
if( !captcha_check($captcha )){
return '验证码错误';
}else{
return '验证码正确';
}
6.页面点击刷新功能:
有的时候我们看不清验证码中的信息,就需要我们做一个点击刷新验证码的功能,其实captcha扩展中已经给了我们建议写法:
/**
* @param $config
* @return string
*/
function captcha_src($config = null): string{
return Route::buildUrl('/captcha' . ($config ? "/{$config}" : ''));
}
/**
* @param $id
* @return string
*/
function captcha_img($id = '', $domid = ''): string{
$src = captcha_src($id);
$domid = empty($domid) ? $domid : "id='" . $domid . "'";
return "<img src='{$src}' alt='captcha' " . $domid . " onclick='this.src=\"{$src}?\"+Math.random();' />";
}
我们只需要在页面中给验证码图片添加一个点击事件:
<img src="{:captcha_src()}" onclick="this.src = this.src + '?a='+Math.random()" />
7.验证码是怎么验证的:
我们在验证验证码是否正确的时候只需要在控制器中调用captcha_check方法,但是到底是怎么验证的呐?
1.captcha_check方法(think-captcha/src/helper.php)
function captcha_check($value){
return Captcha::check($value);
}
1.1.它只是静态调用了一下Captcha类中的check方法
2.check方法(think-captcha/src/Captcha.php)
public function check(string $code): bool{
if (!$this->session->has('captcha')) {
return false;
}
$key = $this->session->get('captcha.key');
$code = mb_strtolower($code, 'UTF-8');
$res = password_verify($code, $key);
if ($res) {
$this->session->delete('captcha');
}
return $res;
}
2.1首先判断session中是否有验证码信息,没有直接返回false
2.2如果存在获取缓存中的验证码信息
2.3将我们输入的验证码全部转化为小写
2.4使用password_verify函数校验验证码
2.5如果校验成功删除session中的验证码信息
网友评论