快速开始

前端 SDK

引入 SDK

初始化

实例化 CaptchaSDK 时传入的配置项。除 captchaId(标记 *)必填外,其余均为可选项,按需传入即可。

参数类型说明
captchaIdstring *必填。在控制台创建应用时获取的 Captcha ID,用于标识你的租户和加载对应的风控策略。
langstring弹层与错误提示的语言:'auto'(按浏览器 navigator.language 推断,默认)或显式指定。支持:'zh-CN'(简体中文)、'zh-TW'(繁体中文,台港澳自动走此)、'en'(英文,新加坡自动走此)、'ja'(日语)、'ko'(韩语)、'id'(印尼语)、'th'(泰语)、'my'(缅甸语)、'vi'(越南语)、'km'(高棉语)、'ms'(马来语)、'pt-PT'(欧陆葡语,葡萄牙/安哥拉/莫桑比克自动走此)、'pt-BR'(巴西葡语)、'fil'(菲律宾语)。未匹配的语言回退到英文。
targetstring | Element内嵌 checkbox 模式的容器,传入 CSS 选择器或 DOM 元素;不传则使用默认弹窗模式。内嵌模式下 verify() 会在容器内渲染「我不是机器人」复选框。
placementstring'top'(参考元素上方)
anchorstring | Element锚点元素(CSS 选择器或 DOM 元素),仅在弹窗模式下作为 placement 参考,通常设为「提交」按钮。checkbox 模式(设置了 target)下该参数会被忽略,弹窗始终以 target 容器为参考。
themestring | object主题配置:传字符串 'light' / 'dark' 使用预设,或传对象做细粒度自定义。详见下方「主题定制」章节。
brandobject企业版品牌定制(logo / 文案 / 链接),仅对开通企业版的租户生效;非企业版传入会被忽略。

弹窗位置 (placement)

placement 决定验证弹窗相对参考元素的出现位置。参考元素优先取 target(checkbox 模式的容器),其次 anchor;都没有时回退为视口中心。两种模式(弹窗 / checkbox)下均生效。

取值说明
'auto' (default)自动判断:比较参考元素上下两侧的剩余空间,选较大一侧弹出(同 top / bottom 锚定方式)。推荐默认值。
'top'紧贴参考元素上方,水平与参考元素中心对齐,带向下的小三角箭头。
'bottom'紧贴参考元素下方,水平与参考元素中心对齐,带向上的小三角箭头。
'left'紧贴参考元素左侧,垂直与参考元素中心对齐,带向右的小三角箭头。
'right'紧贴参考元素右侧,垂直与参考元素中心对齐,带向左的小三角箭头。
'center'弹窗几何中心对齐参考元素的几何中心(弹窗叠在参考元素上方)。参考元素缺失时退化为 windowCenter。
'windowCenter'弹窗居中于浏览器视口,不依赖参考元素。

主题定制

支持两种传法:字符串预设('light' / 'dark')快速切换;或对象形式按需覆盖颜色,未指定的字段沿用 preset 基底。所有颜色均接受 6 位十六进制字符串,SDK 会自动生成半透明变体用于渐变和 hover 态。

参数类型说明
preset'light' | 'dark'基底预设,作为其余字段的默认值。未指定时使用 'light'。
primarystring主要色:高亮边框、加载动画、滑块轨道填充、主按钮背景。默认 '#4facfe'。
secondarystring次要色:与 primary 组成渐变的尾色。默认 '#00f2fe'。
successstring成功态颜色:验证通过时的对勾和成功背景。默认 '#43e97b'。
errorstring失败态颜色:错误提示、失败图标。默认 '#f5576c'。
backgroundstring弹层背景色。light 预设 '#fff',dark 预设 '#1e1e2e'。
borderstring弹层边框色。light 预设 '#d9d9d9',dark 预设 '#444'。
textstring主要文字颜色。light 预设 '#555',dark 预设 '#ccc'。
hoverstringhover 背景色,用于按钮和交互元素的悬停反馈。light 预设 '#f7f7f7',dark 预设 '#2a2a3e'。
btnBgstring滑块拖拽按钮主色(单一基色,自动派生渐变、阴影、图标对比色)。light 预设 '#ffffff',dark 预设 '#3a3a4e'。
btnIconstring(可选)覆盖按钮内图标颜色。不传时按 btnBg 亮度自动选黑/白,确保对比度。

触发验证

参数类型说明
businessTypestring业务类型,如 login、sms、comment
businessIdstring业务 ID,如用户名、手机号(前端 SDK 会自动 SHA-256 哈希)

返回值:

参数类型说明
seccodestring验证凭证,发送给业务后端核销

前端集成示例

后端核销

用户完成验证后,前端获得 seccode,业务后端调用此接口核销确认。

POST/api/validate需签名认证

请求头

Header说明
X-Captcha-Id应用的 Captcha ID
X-Timestamp当前 Unix 时间戳(秒)
X-SignatureHMAC-SHA256(appSecret, captchaId:timestamp:sha256Hex(body))

请求体

参数类型说明
seccodestring前端验证通过后获得的凭证
business_typestring业务类型,需与前端传入一致
business_idstring业务 ID 原文(服务端会 SHA-256 后与 seccode 内的哈希比对)

响应

签名算法

使用 App Secret 对 captchaId、时间戳、请求体 SHA-256 hash 三者拼接串进行 HMAC-SHA256 签名,时间戳误差不超过 300 秒。签名覆盖请求体,防止攻击者用同一签名重放不同 body。

后端完整示例

下面是一个完整的登录接口实现,演示如何在业务请求中核销前端提交的 seccode,并根据核销结果决定是否继续业务逻辑。

响应说明

核销接口返回 JSON,业务端必须检查 valid 字段:只有为 true 时才算验证通过,否则应直接拒绝本次业务请求。

参数类型说明
validboolean是否通过。true 表示 seccode 核销成功,但业务后端仍需检查 bypass 字段区分真实通过与静默放行;false 表示核销失败,必须拒绝本次请求。
reasonstring核销失败时的原因描述(例如:seccode 无效、已过期、业务上下文不匹配等),valid=true 时为 null。
bypassboolean是否为系统静默放行。true 表示 seccode 并非真实人机校验通过,仅因系统兜底(如套餐配额耗尽)放行。敏感操作(登录、支付、改密)应拒绝此类 seccode。
bypass_reasonstringbypass 原因的机器可读代码,bypass=false 时为 null。当前取值:quota_exceeded。
messagestring人类可读提示,通常在 bypass=true 时用于运营告警或前端展示,正常路径为 null。
异常场景处理建议
当 valid 为 false、HTTP 返回非 200(如签名错误、服务不可用)或网络异常时,都应视为「未通过」并拒绝本次业务请求。不要因为核销接口故障就默认放行,否则验证码形同虚设。同一个 seccode 只能核销一次,核销失败后需要让用户重新触发验证。

验证流程

用户浏览器验证码 SDK验证服务业务后端用户浏览器验证码 SDK验证服务业务后端1. 打开业务页面,初始化 SDK2. GET /load(设备指纹 + 业务类型)3. 返回验证挑战(风险自适应)4. 完成滑动 / 点选5. POST /verify(加密答案)6. 颁发 lotNumber + seccode7. 提交业务表单(携带 seccode)8. POST /api/validate(HMAC 签名)9. 返回核销结果 'valid: true'10. 业务响应(登录 / 发送短信 / …)

业务策略配置

你可以为每一个业务场景(比如登录、注册、发短信、发评论)单独设置一套风控规则。前端在调用验证时声明自己属于哪种业务类型,系统就会自动应用对应的配置;没有显式声明的业务类型会沿用应用级默认策略。留空的字段表示不启用该项规则。

配置思路
不同业务的风险画像并不一样——短信验证码需要防轰炸,注册要防薅羊毛,评论要防刷屏。建议你在「新建业务类型」里为每个敏感入口单独加一条,按业务量和攻击面独立调参。

操作频次

从整体流量角度判断业务是否异常。在同一个时间窗口内,对这个业务类型触发的所有请求做计数,不区分用户和设备。达到设定的阈值后,后续请求会进入更严格的验证模式,再高就会被直接拦截。

时间窗口
频次统计的滚动时间范围。所有基于频次的判断都用这个窗口。建议:登录/注册这类低频操作用 1 小时以上,评论/签到等高频操作用 10 分钟左右。
可疑阈值(次)
窗口内累计请求数一旦越过此值,说明流量明显高于平时,系统会强制弹出「点选文字」这种更难的人机验证,挡掉脚本刷量。
封锁阈值(次)
窗口内请求数达到这个级别通常意味着正在被刷,系统会直接拦截,不再给出通过的可能,直到窗口过去。

风险模型

在上面「看流量整体」的基础上,进一步从「账号集中度」角度识别风险。适用于注册、绑定手机号等「一个真人原则上不会重复做」的场景。

验证码样式
决定该业务展示哪种验证方式:选「风险自适应」会根据检测到的风险高低自动在滑块 / 点选之间切换;选「始终滑块」或「始终点选」则固定用一种样式,便于统一 UI。
统计窗口(秒)
专门服务于下面两个阈值的统计时间范围。留空就复用上面「操作频次」里的时间窗口,一般不需要单独设。
同源通过可疑阈值
在同一个出口 IP 或同一台浏览器下,同一业务的通过次数越过此值时,系统会认为「一个人在不同账号之间来回切换」,后续这类请求会被当作可疑流量处理,触发更严格的验证。
同源通过危险阈值
危险级阈值。超过这个值通常意味着有人在用脚本批量注册或刷账号,系统会把这类请求视为正在攻击,直接拦截。

信任策略

信任策略决定「老用户能不能不用做验证码直接过」。满足信任条件的设备,在同一业务类型、同一业务对象上可以静默通过,用户完全感知不到弹窗。不配置任何策略时,该业务永远不会出现静默通过,最高也只会给到最简单的滑块。

常用设备

适合登录、短信等重复使用的入口

适合重复使用的场景。系统会统计这台设备在过去一段时间里有多少个「不同的自然日」成功通过过,当跨天次数足够多时就认为它是自己人,后续同账号同业务直接放行。

统计窗口
回看多久内的历史记录。默认一个月:例如把它设为 30 天,系统只看最近一个月里的活跃情况,更早的记录不计入。
最少天数
被信任前至少要在多少个「不同的日历天」出现过成功验证。建议 3 到 7 天,低于 3 天太容易伪造,高于 7 天会让新用户等太久。
可疑阈值业务数量
一个设备如果在很多不同业务上都被信任了(例如同时是评论、点赞、签到的老用户),反而值得警惕。达到这个数量时系统会降低它的信任级别,强制做一次验证码兜底。
封锁阈值业务数量
上一项的加强版:如果被信任的业务数量进一步超过此值,基本可以判定为共享设备或脚本池,这类请求会被直接拦截。

稳定设备

适合评论、下载等低频或偶发操作

不看跨天次数,只看两个条件:这台设备「来得够早」并且「最近动得不多」。一旦用户活跃度回升,下一次请求就会重新要求做验证码。

最小设备龄(天)
设备第一次出现到现在必须经过多少天才有资格被信任。太短的值容易被新注册的自动化流量绕过,建议至少一周。
最大频次
在下面那个频率窗口里,该设备的成功通过次数不能超过这个数。超出就说明它不再是「偶尔用一次」,需要重新做验证。
频次窗口(秒)
配合上一项使用的时间窗口。例如设为 1 天,就是「每天最多允许多少次静默通过」。
可疑阈值业务数量
一个设备如果在很多不同业务上都被信任了(例如同时是评论、点赞、签到的老用户),反而值得警惕。达到这个数量时系统会降低它的信任级别,强制做一次验证码兜底。
封锁阈值业务数量
上一项的加强版:如果被信任的业务数量进一步超过此值,基本可以判定为共享设备或脚本池,这类请求会被直接拦截。
为什么要设滥用阈值
信任策略的本意是让真实老用户免打扰,但攻击者也可能养一台「什么都通过」的设备四处刷。通过限制「同一设备能被信任的业务种类数」,我们在保留体验的同时避免一台设备被反复复用。

品牌定制

每个验证码弹窗的底部都会展示一条品牌条,默认是「Protected by ArcCaptcha」。如果你希望换成自己的 logo 和文案,或者完全去掉品牌条,升级到企业版即可。

各套餐的权限矩阵
套餐默认 ArcCaptcha 品牌替换为自有品牌完全隐藏品牌条
免费版
高级版
企业版

如何配置(企业版)

在初始化 SDK 的地方多传一个 brand 参数即可,不需要登录控制台、也不需要部署额外的后端逻辑。下方是一段完整示例:

可配置字段

  • logoUrl — 你自己的 logo 图片 URL(支持 https 外链、站内相对路径,或内联 data URI)。
  • text — 品牌文案,最多 40 字,例如「Secured by 你的公司」。
  • link — 用户点击品牌文字后跳转的链接,必须是 https 完整 URL。
  • hideDefault — 设为 true 时不显示任何品牌内容,弹窗底部完全空白。
订阅到期后会怎样?
企业版订阅到期后,自定义品牌会自动失效,弹窗回到默认的 ArcCaptcha 品牌条。你无需删除代码,续费后自定义品牌会立即重新生效。