懒得写验证码类,直接用ThinkPHP的
composer require topthink/think-captcha=2.0.*
找到vendor/topthink/think-captcha/src/Captcha.php function entry
line:198
1
|
$code = $this ->authcode( strtoupper (implode( '' , $code )));
|
修改为以下代码:
1
|
$code = md5( strtoupper (implode( '' , $code )));
|
line:203
1
2
3
4
5
6
7
8
9
|
Session::set( $key . $id , $secode , '' );
ob_start();
// 输出图像
imagepng( $this ->im);
$content = ob_get_clean();
imagedestroy( $this ->im);
return response( $content , 200, [ 'Content-Length' => strlen ( $content )])->contentType( 'image/png' );
|
修改为以下代码
1
2
3
4
5
6
7
8
9
10
|
$randomKey = $this ::randomCode();
Cache::set( $randomKey , $secode , 3600);
ob_start();
// 输出图像
imagepng( $this ->im);
$content = ob_get_clean();
imagedestroy( $this ->im);
return [ 'content' => "data:image/png;base64," . base64_encode ( $content ), 'key' => $randomKey ];
|
Captcha.php新增function randomCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 生成随机码
* @access private
* @author super
* @time 2020-08-12
* @return string
* */
private function randomCode()
{
$randomCode = md5(time() . rand(1000, 9999) . rand(10, 99));
if (Cache::get( $randomCode )) {
$this ->randomCode();
}
return $randomCode ;
}
|
验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/**
* 验证
* @access private
* @author super
* @time 2020-08-12
* @param string $code 用户输入的验证码
* @param string $key 验证码key(生成验证码时返回)
* @return array
* */
private function checkCode( $code , $key )
{
$data = Cache::pull( $key );
if (!isset( $data [ 'verify_time' ]) || !isset( $data [ 'verify_code' ])) return [ 'code' => 501, 'msg' => '验证码已过期' ];
if (time() > $data [ 'verify_time' ] + 1800) return [ 'code' => 501, 'msg' => '验证码已过期' ];
$code = md5( strtoupper ( $code ));
if ( $code != $data [ 'verify_code' ]) {
return [ 'code' => 501, 'msg' => '验证码错误' ];
} else {
return [ 'code' => 200];
}
}
|
注意:
-
需修改代码行数可能与上文标注不一致,以实际代码为准
-
use think\facade\Cache;
-
文件保存失败问题,请检查服务器文件夹www权限是否可写