1、目标:通过api ajax获取图片验证码,然后判断验证码
因为thinkphp 官方的think-captcha扩展 不支持通过api调用的方式
我们选用了Gregwar/Captcha 作为 图片验证码插件
2、流程
前端调用api接口 ——> 后台生成 base64验证码图片、key、验证码文字 ——>返回给前端 base64图片和key
前端登录携带 key 和 验证码文字 ——> 后台通过key 找到验证码 和 前端发送的验证码比对判断
3、代码
// 1、composer 安装 gregwar/captcha: "^1.1"
composer require gregwar/captcha
//2、在controller 里面写一个 创建验证码函数
public function getVerificationCode()
{
// 创建随机字符串函数
function creatKey($length){
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
$randStr = str_shuffle($str);//打乱字符串
$rands= substr($randStr,0,$length); //substr(string,start,length);返回字符串的一部分
return 'captcha'.$rands;
}
// 创建随机字符串key
$key = creatKey(15);
// new 一个captcha
$captcha = new CaptchaBuilder;
$captcha->build();
$result = [
'key' => $key, // key
'img' => $captcha->inline(), //验证码 base64图片
];
// thinkphp缓存存入 $captcha->getPhrase() 验证码文字 时间是180秒 (注意这里字段名是key!!!)
Cache::set($key, $captcha->getPhrase(), 180);
return $result;
}
// 3、登录 判断验证码
// $param['key'] 用户携带的 key
// $param['captcha'] 用户携带 的验证码文字
// Cache::get($param['key']) 从cache 中根据 key 获取 正确的验证码
// strcasecmp() 是php函数 可以忽略大小写 判断相等
$isEqual = strcasecmp($param['captcha'],Cache::get($param['key']));
if(!Cache::get($param['key'])){
return '验证码已过期'; // cache存入 有180秒过期
}
if($isEqual != 0){
return '验证码错误';
}