极验行为验证第四代 面向开发者快速集成指南
本文用于让开发者在不跳转多份文档的情况下完成极验行为验证第四代 的标准接入。除非需要自定义 UI、语言、风控模式或特殊端能力,按本文即可完成客户端初始化、业务触发、服务端二次校验、异常排查和联调验收。
参考来源:
- 服务端部署:https://docs.geetest.com/gt4/deploy/server
- Web 客户端部署:https://docs.geetest.com/gt4/deploy/client/web/
- Web API:https://docs.geetest.com/gt4/apirefer/api/web
- iOS 部署:https://docs.geetest.com/gt4/deploy/client/ios
- Android 部署:https://docs.geetest.com/gt4/deploy/client/android
- HarmonyOS 部署:https://docs.geetest.com/gt4/deploy/client/harmonyos
- 小程序部署:https://docs.geetest.com/gt4/deploy/client/miniprogram/wx
官方快捷入口:
1. 接入目标
极验行为验证第四代 适合保护这些高风险动作:
- 登录
- 注册
- 重置密码
- 提交表单
- 支付、提现、领券等权益动作
- 保存配置
- 敏感后台操作
推荐原则:
- 只拦高风险动作,不拦普通页面浏览。
- 客户端负责拉起验证和拿到验证结果。
- 服务端必须调用极验
/validate做二次校验。 - 服务端校验成功后才执行业务动作。
不能只做前端验证。客户端结果可以被伪造,安全闭环必须在服务端完成。
2. 标准交互流程
- 页面或客户端页面加载时初始化极验验证。
- 用户触发业务动作,例如点击“提交”“保存”“登录”。
- 客户端拉起验证码。
- 用户验证成功后,客户端拿到验证结果。
- 客户端把业务参数和验证结果一起提交到业务服务端。
- 业务服务端用
captcha_key生成sign_token。 - 业务服务端调用极验二次校验接口
/validate。 result=success时执行业务动作。result=fail或请求异常时按业务风险策略处理。
3. 必要参数
3.1 控制台参数
| 参数 | 来源 | 所在端 | 用途 |
|---|---|---|---|
captcha_id |
极验后台 | 客户端、服务端 | 验证 ID,客户端初始化和服务端二次校验都需要 |
captcha_key |
极验后台 | 只放服务端 | 生成 sign_token,严禁下发到客户端 |
3.2 客户端验证成功后返回给服务端的参数
| 参数 | 说明 |
|---|---|
lot_number |
验证流水号 |
captcha_output |
验证输出信息 |
pass_token |
验证通过标识 |
gen_time |
验证通过时间戳 |
3.3 服务端提交给极验的参数
| 参数 | 说明 |
|---|---|
captcha_id |
验证 ID,建议放在 URL query 中 |
lot_number |
客户端回传 |
captcha_output |
客户端回传 |
pass_token |
客户端回传 |
gen_time |
客户端回传 |
sign_token |
用 captcha_key 对 lot_number 做 HMAC-SHA256 后得到 |
4. Web / H5 快速接入
4.1 引入脚本
<script src="https://static.geetest.com/v4/gt4.js"></script> |
4.2 页面加载时初始化
<div id="captcha-box"></div> |
说明:
captchaId必填。product: "bind"适合“点击业务按钮后再拉起验证”。showCaptcha()只能在onReady()后可靠调用。getValidate()只应在onSuccess()后读取。getValidate()返回false时不要提交业务。captcha_key不能出现在前端代码、APP 包或小程序包中。
4.3 用户点击业务动作时触发验证
document.getElementById("saveButton").addEventListener("click", function (event) { |
4.4 提交业务接口
async function submitBusinessWithCaptcha(captchaResult) { |
5. 服务端快速接入
5.1 二次校验接口
| 项 | 值 |
|---|---|
| 接口地址 | https://gcaptcha4.geetest.com/validate |
| 请求方式 | GET 或 POST,推荐 POST |
| Content-Type | application/x-www-form-urlencoded |
| 返回格式 | json |
5.2 Node.js 示例
import { createHmac } from "node:crypto"; |
5.3 业务接口判定
app.post("/api/save-config", async (req, res) => { |
失败策略建议:
- 登录、注册、保存配置、支付等高风险动作:极验异常时拒绝业务。
- 低风险动作:可按业务需要做降级放行,但必须记录日志和监控。
6. 全客户端快捷部署
6.1 Web / H5
适用:PC Web、移动 H5、内嵌 WebView。
步骤:
- 引入
https://static.geetest.com/v4/gt4.js。 - 页面加载时调用
initGeetest4({ captchaId })。 popup/float模式使用appendTo()插入按钮。bind模式在业务按钮点击时调用showCaptcha()。onSuccess()后调用getValidate()。- 把
lot_number、captcha_output、pass_token、gen_time发给业务服务端。 - 服务端调用
/validate二次校验。
注意:
- 同一页面多个验证场景需要分别初始化。
- iframe 内使用时需要
sandbox="allow-scripts allow-popups"。 - 避免全局 CSS 污染极验组件,例如全局
button、弹层、通配选择器。
6.2 React / Vue / Angular
适用:SPA 项目。
步骤:
- 在入口 HTML 加载
gt4.js,或在组件挂载阶段动态加载一次脚本。 - 在业务页面组件
mounted/useEffect/ngOnInit阶段初始化。 - 将
captchaObj保存在组件状态或 ref 中。 - 组件卸载时调用
destroy()。 - 业务按钮点击时调用
showCaptcha()。 onSuccess()里将验证结果和业务数据提交给服务端。
注意:
- 路由切换后不要复用已销毁实例。
- React Strict Mode 开发环境可能触发双初始化,需用 ref 防重。
- 如果业务页面有多个按钮入口,每个场景应单独初始化。
6.3 React Native
适用:React Native 客户端。
快捷方式:
- 优先参考官方
react-nativedemo。 - 若使用 WebView 方式承载 H5 验证页,H5 页面仍按 Web / H5 流程接入。
- 验证成功后通过 WebView bridge 把结果传回 Native。
- Native 调业务后端,业务后端再调极验
/validate。
必须保证:
- Native 包内不包含
captcha_key。 - 二次校验只在服务端完成。
6.4 Flutter
适用:Flutter 客户端。
快捷方式:
- 使用官方
gt4_flutter_plugin。 - 初始化时传入
captchaId。 - 在业务动作触发时启动验证。
- 成功回调里拿到验证结果字符串或对象。
- 将结果透传给业务服务端做二次校验。
必须保证:
- 客户端只持有
captchaId。 captcha_key只在服务端环境变量或密钥系统中保存。
6.5 iOS 原生
环境要求:
- iOS 9+
- Xcode 13+
- 依赖
WebKit.framework
步骤:
- 导入
GTCaptcha4.framework或GTCaptcha4.xcframework。 - 在
Linked Frameworks and Libraries中确认已添加。 Other Linker Flags添加-ObjC。- 同时引入
GTCaptcha4.Bundle。 - 实现
<GTCaptcha4SessionTaskDelegate>。 - 初始化
GTCaptcha4Session,传入captchaID。 - 在页面加载时提前创建 session。
- 业务按钮点击时调用
verify。 - 在
didReceive:result:中判断code。 code == "1"时把result提交给业务后端二次校验。- 在
didReceiveError:中记录并展示错误码。
核心代码:
|
6.6 Android 原生
环境要求:
- Android 5.0+,minSdk 21
- Android Studio 2020.3.1+
- Android Gradle Plugin 7+
步骤:
- 下载 Android SDK,并把
.aar放入libs。 repositories添加flatDir { dirs 'libs' }。- 添加依赖
implementation(name: 'geetest_captcha_android_vx.y.z_date', ext: 'aar')。 - 非 Kotlin 工程按 SDK 要求补充 Kotlin 插件与标准库。
- 添加权限
INTERNET,低版本兼容场景添加ACCESS_NETWORK_STATE。 - 如需日志分析,按需添加存储权限。
- 使用
GTCaptcha4Client.getClient(activity).init(captchaId, config)初始化。 - 点击业务按钮时调用
verifyWithCaptcha()。 addOnSuccessListener中status == true时把response提交服务端。onDestroy()调用destroy()。- 横竖屏切换时调用
configurationChanged(newConfig)。
核心代码:
GTCaptcha4Config config = new GTCaptcha4Config.Builder() |
生命周期:
|
6.7 HarmonyOS Next
环境要求:
- HarmonyOS Next
- DevEco Studio 6.0.1 Release
- API Version 20 Release
步骤:
- 在极验后台下载 HarmonyOS Next SDK。
- 将 SDK 引入工程。
- 初始化时传入
captchaId。 - 在业务动作触发时启动验证。
- 成功回调中拿到验证结果。
- 将验证结果提交业务服务端。
- 服务端做
/validate二次校验。 - 错误回调中记录错误码,按错误类型处理。
注意:
Context需要符合 SDK 要求。- 网络、证书、WebView 类错误按错误码排查。
- 客户端不得保存
captcha_key。
6.8 微信小程序
环境要求:
- 微信开发者工具
- 基础库 2.10.4+
步骤:
- 在小程序后台“设置 - 第三方服务 - 插件管理”添加插件。
- 使用插件 appid:
wx1629d117cf9be937。 - 在
app.json声明插件。
{ |
- 在页面 JSON 引入组件。
{ |
- 在 WXML 插入组件。
<captcha4 |
- 页面加载时传入
captchaId。
onLoad() { |
- 成功回调中保存验证结果。
captchaSuccess(result) { |
- 提交业务时把
captchaResult发给业务服务端。
captchaValidate() { |
6.9 支付宝小程序
环境要求:
- 支付宝开发者工具
- v1.x 基础库 1.25.1+
- v2.x 基础库 2.7.2+
步骤:
- 在支付宝小程序后台“开发 - 插件服务 - 添加插件”或插件市场添加插件。
- 插件 provider:
2021002178617823。 app.json声明插件。
{ |
- 页面 JSON 引入:
{ |
- AXML 插入组件:
<captcha4 |
onLoad设置loadCaptcha和captchaId。captchaSuccess保存result.detail。- 调用
my.request将结果提交到业务服务端。
6.10 字节 / 百度 / QQ / 快手小程序
通用步骤:
- 在对应小程序平台添加极验行为验证第四代 插件或组件。
- 在全局配置中声明插件。
- 在页面配置中通过
plugin://captcha4/captcha4或平台文档指定路径引入组件。 - 在模板中传入
captchaId。 - 监听成功回调并保存
result.detail。 - 提交业务时把验证结果随业务参数提交到业务服务端。
- 服务端统一走
/validate二次校验。
差异点:
- 模板语法、事件名和请求 API 按平台分别使用,例如
tt.request、swan.request、qq.request、ks.request。 - 插件申请入口和 provider 以对应平台后台为准。
- 统一原则不变:客户端只拿验证结果,服务端做最终校验。
6.11 快应用
快捷方式:
- 按官方快应用部署文档引入极验组件。
- 初始化传入
captchaId。 - 监听成功回调获取验证结果。
- 使用快应用网络请求能力提交业务服务端。
- 服务端二次校验。
6.12 Uniapp
快捷方式:
- 使用官方 Uniapp demo 作为接入基线。
- H5 目标按 Web / H5 流程。
- 小程序目标按对应小程序平台流程。
- App 目标可按 WebView 或原生插件方案接入。
- 统一将验证结果提交业务服务端二次校验。
6.13 Taro
快捷方式:
- 使用官方 Taro demo 作为接入基线。
- Web 目标按 Web / H5 流程。
- 小程序目标按对应平台插件流程。
- 把
captchaId做成环境配置。 - 成功回调中统一调用业务服务端验证接口。
7. 必要错误码与处理办法
7.1 Web 错误码
| 错误码 | 含义 | 处理办法 |
|---|---|---|
60001 |
captcha_id 配置有误 |
检查初始化传入的 captchaId 是否来自正确业务 |
60002 |
appendTo 参数有误 |
只传 id 选择器或 DOM 元素;bind 模式不要依赖 appendTo |
60100 |
/load 请求报错 |
检查网络、域名访问、captchaId |
60101 |
/verify 请求报错 |
检查网络;仍失败联系极验支持 |
60200 |
皮肤加载失败 | 检查网络、资源域名是否被拦截 |
60201 |
语言包加载失败 | 检查网络和语言配置 |
60202 |
验证图片加载失败 | 检查网络、CDN、图片资源拦截 |
60204 |
gacptcha4 JS 资源加载超时 |
检查网络和静态资源域名 |
60205 |
gct4 JS 资源加载超时 |
检查网络和静态资源域名 |
60500 |
服务端 forbidden | 联系极验支持排查账号或服务状态 |
Web 端处理建议:
onError(error):提示用户刷新或稍后重试,并上报code、msg、desc。onFail(failObj):统计失败次数,必要时提示重新验证。onClose():提示用户需要完成验证后继续。- 业务后端返回验证失败:调用
captchaObj.reset()。 - 页面销毁或路由离开:调用
captchaObj.destroy()。
7.2 服务端错误码
| 错误码 | 含义 | 处理办法 |
|---|---|---|
-50000 |
未定义运行异常 | 记录完整请求上下文,稍后重试或联系支持 |
-50001 |
非法 risk_type |
检查是否传了未支持的风控模式 |
-50002 |
参数解密异常 | 检查客户端回传参数是否完整、未被篡改 |
-50003 |
重复验证 | 同一验证结果已使用,要求用户重新验证 |
-50004 |
JSONP XSS 异常 | 检查请求格式,不要拼接不可信 callback |
-50005 |
gen_time 异常 |
检查 gen_time、请求格式、表单编码 |
-50101 |
缺少 captcha_id |
服务端请求 URL 补上 captcha_id |
-50102 |
非法 captcha_id |
检查 ID 是否复制错误或环境不匹配 |
-50103 |
不存在的验证 ID | 检查极验后台业务配置 |
-50104 |
验证 ID 已删除 | 恢复或更换 captcha_id |
-50105 |
验证 ID 已暂停 | 到极验后台启用或更换业务 |
-50301 |
流水号不存在或缓存过期 | 要求用户重新验证 |
-50302 |
缺少 lot_number |
检查客户端是否提交完整字段 |
-50303 |
非法 lot_number |
检查字段是否被改写 |
-50304 |
lot_number 不匹配 |
检查 sign_token 是否由同一个 lot_number 生成 |
-50305 |
lot_number 已失效 |
要求用户重新验证 |
-50306 |
process_token 错误 |
要求重新验证,仍失败检查客户端 SDK 版本 |
-50307 |
payload 参数错误 |
检查客户端参数透传 |
-50308 |
payload 已失效 |
要求用户重新验证 |
服务端处理建议:
result === "success":执行业务。result === "fail":拒绝业务,前端重置验证码。status === "error":按错误码排查配置或参数。- HTTP 非 200 或请求超时:高风险业务拒绝,低风险业务按降级策略处理。
7.3 iOS 错误码
| 错误码 | 含义 | 处理办法 |
|---|---|---|
-20000 |
参数不合法 | 检查 captchaID、配置对象和调用时机 |
-20001 |
操作失败 | 记录描述,提示重试 |
-20002 |
资源缺失 | 检查 GTCaptcha4.Bundle 是否完整导入 |
-20100 |
用户取消验证 | 提示必须完成验证后继续 |
-20200 |
本地文件加载失败 | 检查 Bundle、资源文件是否被删除或改名 |
-20201 |
加载超时 | 检查网络,允许用户重试 |
-20210 |
执行 JavaScript 失败 | 检查 SDK 资源完整性,记录日志 |
-20211 |
JavaScript 返回错误 | 记录错误详情,必要时联系支持 |
-20290 |
WebView 内存警告 | 释放资源,重新进入验证流程 |
-20999 |
未知错误 | 记录完整日志和 SDK 版本 |
7.4 Android 错误码分类
| 错误码范围 / 示例 | 含义 | 处理办法 |
|---|---|---|
-10170 ~ -10174 |
参数不合法 | 检查 Context 是否为 Activity、captchaId 是否配置、回调是否为空 |
-13099 |
WebView 不支持 | 检查设备 WebView 可用性 |
-13175 |
H5 静态地址配置错误 | 检查 setResourcePath |
-13201 ~ -13221 |
网络错误 | 检查网络、代理、URL、超时、重定向 |
-13300 ~ -13305 |
证书错误 | 检查系统时间、证书链、HTTPS 中间人代理 |
-13580 ~ -13582 |
H5 回调数据异常 | 检查 SDK 版本、资源完整性和回调数据 |
-14460 |
用户取消验证 | 提示用户完成验证后继续 |
7.5 HarmonyOS 错误码分类
| 错误码范围 / 示例 | 含义 | 处理办法 |
|---|---|---|
-30170 ~ -30174 |
参数不合法 | 检查 UIContext、captchaId、回调 |
-33099 |
WebView 不支持 | 检查设备 WebView 能力 |
-33175 |
H5 静态地址错误 | 检查资源路径配置 |
-33201 ~ -332339 |
网络错误 | 检查网络、URL、超时、代理、HTTP/2 |
-33404 |
页面不存在 | 检查资源地址 |
-33300 ~ -33303 |
证书错误 | 检查证书、系统时间、Host 是否匹配 |
-33580 ~ -33582 |
H5 回调数据异常 | 检查 SDK 资源和回调数据 |
-34460 |
用户取消验证 | 提示用户完成验证后继续 |
8. 联调清单
客户端检查:
gt4.js或对应 SDK 是否成功加载。- 页面加载时是否已初始化,不是在点击时才初始化。
captchaId是否正确。onReady()是否触发。- 点击业务按钮是否能拉起验证码。
onSuccess()是否触发。getValidate()是否能拿到lot_number、captcha_output、pass_token、gen_time。- 失败或业务校验失败后是否调用
reset()。 - 页面卸载或实例不再使用时是否调用
destroy()。
服务端检查:
captcha_key是否只存在服务端。- 是否用
captcha_key对lot_number做 HMAC-SHA256。 sign_token是否为 hex 字符串。/validate请求是否使用application/x-www-form-urlencoded。captcha_id是否传给极验。result=success时才执行业务。result=fail时是否拒绝业务并返回可排查原因。- HTTP 超时、非 200、解析失败是否有明确降级策略。
上线检查:
- 生产环境关闭 Android
setDebug(true)等调试配置。 - 前端没有暴露
captcha_key。 - 日志记录
captcha_id、lot_number、错误码、reason,不要记录敏感业务数据。 - 全局 CSS 不影响极验组件。
- WebView、小程序、iframe 场景已检查域名、权限和 sandbox。
9. 常见异常处理
| 现象 | 优先检查 | 解决办法 |
|---|---|---|
| 点击按钮无反应 | 是否已 onReady |
等 onReady 后再允许点击;按钮上加 loading |
getValidate() 返回 false |
是否在 onSuccess 外调用 |
只在 onSuccess() 中读取 |
服务端返回 pass_token expire |
验证结果过期或重复使用 | 要求用户重新验证 |
-50304 lot_number not match |
sign_token 生成错误 |
确认用同一个 lot_number 和正确 captcha_key 签名 |
-50102 illegal captcha_id |
环境或 ID 错 | 检查测试/生产 captcha_id 是否混用 |
| Web 组件样式异常 | 全局 CSS 污染 | 收敛业务 CSS 选择器,不改极验内部 DOM |
| iframe 内无法完整弹出 | sandbox 权限不足 | 增加 allow-scripts allow-popups |
| Android/iOS 资源加载失败 | SDK 资源缺失 | 检查 Bundle、AAR、资源混淆配置 |