\App\Http\HelpersClickCaptcha

点选验证码

职责:生成带中文字符与干扰元素的点选验证码图片,并将目标字符坐标 存入 Redis;校验时按容差比对用户点击坐标。生成与校验参数 均可经数据库配置覆盖(captcha.*),缺省回落内置常量。

┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 常量与字符池 验证码尺寸 / 容差 / 字号等内置常量 + 字符池 分区 2 · 生成与校验(公开) defaultCharset / generate / verify 分区 3 · 内部辅助 随机不重叠定位 / 字体路径 / 颜色解析 └────────────────────────────────────────────────────────────┘

Summary

Methods
Properties
Constants
defaultCharset()
generate()
verify()
No public properties found
KEY_PREFIX
TTL
CHAR_COUNT
DISTRACTOR_COUNT
TOLERANCE
IMG_WIDTH
IMG_HEIGHT
FONT_SIZE_MIN
FONT_SIZE_MAX
DISTRACTOR_FONT_SIZE_MIN
DISTRACTOR_FONT_SIZE_MAX
CHAR_MIN_SPACING
No protected methods found
No protected properties found
N/A
randomNonOverlapPosition()
fontPath()
parseHexColor()
$chars
N/A

Constants

KEY_PREFIX

KEY_PREFIX = 'click_captcha:'

Redis 键前缀

TTL

TTL = 300

验证码缓存有效期(秒)

CHAR_COUNT

CHAR_COUNT = 4

目标字符数量

DISTRACTOR_COUNT

DISTRACTOR_COUNT = 10

干扰字符数量

TOLERANCE

TOLERANCE = 28

点击坐标容差(像素)

IMG_WIDTH

IMG_WIDTH = 380

图片宽度(像素)

IMG_HEIGHT

IMG_HEIGHT = 170

图片高度(像素)

FONT_SIZE_MIN

FONT_SIZE_MIN = 22

目标字字号下限(磅)

FONT_SIZE_MAX

FONT_SIZE_MAX = 30

目标字字号上限(磅)

DISTRACTOR_FONT_SIZE_MIN

DISTRACTOR_FONT_SIZE_MIN = 16

干扰字字号下限(磅):与目标字区间(22-30)重叠,字号分离无法作为区分依据

DISTRACTOR_FONT_SIZE_MAX

DISTRACTOR_FONT_SIZE_MAX = 26

干扰字字号上限(磅)

CHAR_MIN_SPACING

CHAR_MIN_SPACING = 45

目标字符最小间距(像素)

Properties

$chars

$chars : array

内置字符池:约 480 常用汉字,目标字符与干扰字符共用

Type

array

Methods

defaultCharset()

defaultCharset() : string

内置默认字符池(约 480 常用汉字)。

配置 captcha.charset 的默认值来源(seeder 落库);运行时配置留空时回落同一份字库。

Returns

string —

generate()

generate(?string  $redisKey = null) : array

生成点选验证码。

流程:① 读取 DB 配置(captcha.*)归一各参数,缺省回落内置常量 ② 组装目标字符与干扰元素绘制 PNG(点选序列渲染进图片顶部指示条) ③ 目标字符坐标写入 Redis,返回 key / image / targetCount(不下发明文 tips)

Parameters

?string $redisKey

Returns

array —

verify()

verify(string  $key, array  $clicks) : bool

Parameters

string $key
array $clicks

Returns

bool —

randomNonOverlapPosition()

randomNonOverlapPosition(array  $existing, int  $width, int  $height, int  $fontSizeMax, int  $charSpacing) : array

在已有位置中找一个不重叠的随机位置。

Parameters

array $existing
int $width
int $height
int $fontSizeMax
int $charSpacing

Returns

array —

fontPath()

fontPath() : ?string

解析中文字体路径:仅认项目内置 simhei 黑体,部署自带、不依赖系统字体。

Returns

?string —

parseHexColor()

parseHexColor(string  $value) : ?array

解析十六进制颜色(#RRGGBB 或 RRGGBB);非法值返回 null(调用方回落随机)。

Parameters

string $value

Returns

?array —