PHP项目无法使用AJ-Captcha官方Java Starter,因它是SpringBoot专用组件;社区PHP类库为第三方仿写,需自行验证可靠性,且前后端坐标系、加密协议、字符渲染须严格对齐。

PHP 项目直接用不了 AJ-Captcha 官方 Java Starter —— 它是 SpringBoot 专用的 Java 组件,没有官方 PHP 版本。但你看到的“AJ-Captcha PHP 类库”是社区第三方实现,非 anji-plus 官方维护,需自行甄别可靠性。
为什么找不到 aj-captcha-spring-boot-starter 对应的 PHP 包
官方 GitHub(gh_mirrors/captc/captcha)和 Maven 仓库中所有 com.anji-plus 命名空间的依赖,全部面向 JVM 生态。PHP 项目无法通过 composer require 拉取这些 artifact。
所谓“PHP 实现 AJ-Captcha”,实际是开发者仿照其行为逻辑(如图片生成、坐标加密、校验规则)用 GD 库重写的独立类库,比如:
- 不依赖 Redis 或 Spring 容器,靠文件或 APCu 缓存 session-id → 图片答案映射
- 点选文字的“答案”通常是预设的汉字位置数组,而非动态 OCR 分析
- 前端交互流程类似(加载图片 → 用户点击 → 提交坐标 → 后端比对偏移容差),但加解密方式、参数字段名、返回结构均不兼容 Java 版
PHP 点选文字验证码可落地的配置路径
如果你已拿到某个 PHP 版本的 AJ-Captcha 类(例如名为 AjCaptchaPHP 的封装),关键配置项通常集中在初始化参数里,而非 YAML 文件:
立即学习“PHP免费学习笔记(深入)”;
-
font_path:必须指定真实存在的中文字体文件路径(如/var/www/fonts/simhei.ttf),否则文字渲染为空白或方块 -
word_list:点选目标词库,建议用 Unicode 数组(["\u4f60", "\u597d", "\u738b"]),避免 GBK 编码乱码 -
click_count:要求用户点击的文字数量(如 3),该值必须与前端 JS 提交的坐标数组长度一致,否则check()直接失败 -
cache_driver:推荐用redis(需扩展)或apcu;禁用file缓存在高并发下易冲突 -
timeout:验证码有效期,单位秒,默认 120,超过后check()返回 “expired”
captcha/check 接口在 PHP 中容易校验失败的三个原因
PHP 端点选验证失败,90% 出现在以下环节:
- 前端传来的坐标是相对图片左上角的像素值,但 PHP 后端没做归一化处理,直接拿原始
$_POST['x']和$_POST['y']去比对预生成的汉字中心点 —— 必须按图片缩放比例反算(如前端显示为 300×150,实际图像是 600×300,则坐标要 ×2) - 加密混淆未对齐:
crypto-js前端 AES 加密的 token,PHP 若用openssl_encrypt但没设对OPENSSL_ZERO_PADDING和 IV,解密结果错位 - 答案顺序严格匹配:点选模式要求用户按提示文字顺序点击(如提示“点击‘北’‘京’‘欢’”,则坐标数组第 0 个必须对应‘北’字区域),PHP 校验时若只判存在、不判索引顺序,会漏放恶意请求
真正麻烦的不是配参数,而是前后端坐标系、字符渲染、加密协议三者对齐。Java 版靠 Starter 自动搞定,PHP 得一行行抠——尤其是字体渲染差异导致文字宽度变化,会让预设的“可点击热区”整体偏移。



















