需手动设置user-agent和referer头、严格按token+track+secretkey拼接sha256生成sign、验证响应中data.success和data.score≥80、token须redis存储并设120秒ttl。

滑动验证请求返回 403 Forbidden 怎么处理
直接用 PHP 的 file_get_contents() 或 curl 请求 AJ-Captcha 的 /api/get 接口却返回 403 Forbidden,大概率是服务端校验了 User-Agent 和 Referer。AJ-Captcha 前端 SDK 默认会携带浏览器上下文,而纯后端 PHP 请求缺少这些字段,被当成非法调用拦截。
实操建议:
- 必须手动设置
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36') - 显式添加
Referer头,值为你的业务域名(如https://yourdomain.com/),不能省略协议和尾部斜杠 - 若仍失败,检查是否漏传
originheader(部分版本需Origin: https://yourdomain.com) - 注意:AJ-Captcha 后端会比对请求头中的
Referer与你在控制台配置的「合法域名」是否完全匹配(含协议、端口、路径前缀)
verify 接口验签失败返回 "result":false,"msg":"invalid sign"
调用 /api/verify 时传了 token、track、sign,但始终提示签名无效,问题几乎都出在 sign 生成逻辑上。AJ-Captcha 要求 sign 是对 token + track + secretKey 拼接后做 sha256,且 track 必须是前端原始上报的 JSON 字符串(不能 json_encode 二次处理,也不能去空格或转义)。
实操建议:
- PHP 中拼接顺序严格为:
$sign = hash('sha256', $token . $track . $secretKey),三者不可调换 -
$track必须原样接收前端 POST 上来的字符串(例如{"x":[10,32,...],"y":[100,102,...]}),不要json_decode再json_encode - 确认
$secretKey是你在 AJ-Captcha 控制台「密钥管理」里看到的「服务端密钥」,不是前端 key - 若用
file_get_contents('php://input')读取 raw body,请确保没被框架自动解析干扰;推荐用$_POST['track'](前提是前端以application/x-www-form-urlencoded提交)
PHP 验证结果里 "result":true 但实际没过验证
接口返回成功,但用户明明没完成滑动或轨迹异常,这说明你只校验了接口返回值,没校验响应体里的关键字段。AJ-Captcha 的 /api/verify 成功响应中,"result":true 仅代表签名和格式合法,真正判定是否通过的是 "data.success" 字段(布尔值)和 "data.score"(数值,通常 ≥ 80 才算有效通过)。
实操建议:
- 必须解析 JSON 响应后,先判断
isset($resp['data']['success']) && $resp['data']['success'] === true - 同时检查
isset($resp['data']['score']) && $resp['data']['score'] >= 80,否则视为风控未通过 - 不要忽略
"data.msg",它可能包含"行为异常"、"设备风险高"等提示,这类情况即使success为 true 也不该放行 - 记录完整的响应体用于排查,尤其当
score在 50–79 区间时,大概率是轨迹太直、速度恒定或时间过短,需引导用户重试
如何安全存储和复用 token?
token 是单次有效的凭证,PHP 后端不能把它存在全局变量或静态属性里,也不能用 $_SESSION 跨请求共享(除非你确保用户只开一个标签页)。更常见的错误是把 token 存进数据库却不设过期,或用 Redis 但忘了配 TTL。
实操建议:
- 生成 token 后立即存入 Redis,key 为
'ajcap_' . md5(session_id() . microtime(true)),TTL 设为 120 秒(AJ-Captcha 默认有效期 2 分钟) - 前端提交验证时,把 token 作为隐藏字段或请求头带上,后端用它查 Redis;验证完成后立刻
del对应 key - 避免用
$_SESSION['ajcap_token']—— 用户新开标签页会覆盖旧值,导致第一个页面验证失败 - 如果不用 Redis,可用
apcu_store()(需 APCu 扩展),但注意它不跨进程,不适合多 PHP-FPM worker 场景
滑动验证真正的难点不在调通接口,而在头信息模拟、sign 构造、响应字段分级判断和 token 生命周期控制——四者任一环节松动,都会让风控形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











