48 lines
1.2 KiB
PHP
48 lines
1.2 KiB
PHP
|
<?php
|
||
|
declare (strict_types=1);
|
||
|
|
||
|
namespace app\service\util;
|
||
|
|
||
|
use think\captcha\facade\Captcha;
|
||
|
|
||
|
/**
|
||
|
* @author canny
|
||
|
* @date 2024/1/3 16:06
|
||
|
**/
|
||
|
class CaptchaUtil
|
||
|
{
|
||
|
const CAPTCHA_CACHE_KEY = 'captcha:';
|
||
|
const CACHE_TTL = 1800;
|
||
|
|
||
|
public static function create($sceneConfig = ''): array
|
||
|
{
|
||
|
$res = Captcha::create($sceneConfig);
|
||
|
$base64Image = 'data:image/png;base64,' . base64_encode($res->getData());
|
||
|
$key = session('captcha.key');
|
||
|
$uuid = uniqid();
|
||
|
RedisService::getRedisInstance()->set(self::getKey($uuid), $key, 'ex', self::CACHE_TTL);
|
||
|
return ['uuid' => $uuid, 'img' => $base64Image];
|
||
|
}
|
||
|
|
||
|
public static function check($uuid, $code): bool
|
||
|
{
|
||
|
$redis = RedisService::getRedisInstance();
|
||
|
$key = $redis->get(self::getKey($uuid));
|
||
|
if (empty($key)) {
|
||
|
return false;
|
||
|
}
|
||
|
$code = mb_strtolower($code, 'UTF-8');
|
||
|
|
||
|
$res = password_verify($code, $key);
|
||
|
if ($res) {
|
||
|
$redis->del(self::getKey($uuid));
|
||
|
}
|
||
|
|
||
|
return $res;
|
||
|
}
|
||
|
|
||
|
private static function getKey($uuid): string
|
||
|
{
|
||
|
return self::CAPTCHA_CACHE_KEY . $uuid;
|
||
|
}
|
||
|
}
|