行为式验证码是一种全新人机验证方式,能够高效拦截机器行为,构筑业务安全第一道防线。 目前行为式验证码支持的类型有:智能无感知 (https://dun.163.com/trial/sense)、滑动拼图 (https://dun.163.com/trial/jigsaw)、文字点选 (https://dun.163.com/trial/picture-click)、图标点选 (https://dun.163.com/trial/icon-click)、推理拼图 (https://dun.163.com/trial/inference)、短信上行 (https://dun.163.com/trial/sms)、语序点选 (https://dun.163.com/trial/word-order)、空间推理 (https://dun.163.com/trial/space-inference)、障碍躲避 (https://dun.163.com/trial/avoid)、 语序选词 (https://dun.163.com/trial/word-group)、语音验证码。 验证码类型和验证码ID(captchaId)绑定,可以登录管理后台 (https://dun.163.com/dashboard#/login/)灵活切换。 验证码类型 (https://nos.netease.com/yidun/4479496b96530a851f485eb99b7e93ae.png) ## 平台支持 行为式验证码兼容市场主流浏览器,具体版本见下表: 浏览器 | 最低支持版本 IE | 7 Edge | 44 Chrome | 44 Firefox | 71 Mac Safari | 13 UC | 9 Android Chrome | 7 微信浏览器 | 7.1 Opera | 8 iOS Safari | 12 ## SDK 接入 ### 包含降级方案接入(强烈推荐) 如果对稳定性有更高的要求,推荐使用降级方案中自定义降级逻辑,降级方案有如下优势: 多域名冗余:多个域名备份,主域名请求失败会切换其他域名重试。 服务故障兜底:若易盾整体服务故障,会有兜底方案通过请求。 降级回调:降级脚本内部达到一定重试次数失败后有回调通知,建议其他方式降级验证处理。 详细用法可以进一步咨询技术支持。 - 将降级脚本 (https://github.com/yidun/captcha-java-demo/blob/master/src/main/webapp/index.js)下载至本地项目中; - 在页面中引入上面的脚本,示例如下: - Script 引入 Code (html): - 模块引入 Code (js): import initNECaptchaWithFallback from '/path/yidun-captcha' 注释: 当行为验证码所需静态资源或者接口不可用时,且请求验证码失败次数达到阈值(默认为 3 次,可根据需求配置),最后一次会触发降级逻辑,降级表现为: Web 端提示 前方拥堵,已自动跳过验证(智能无感知无该提示),验证码直接验证通过,用户可进行后续业务操作,免受行为验证码的影响。 页面接入示例 Code (html): 验证码接入示例
更多使用场景,请参见DEMO (https://support.dun.163.com/captcha-demo/float)。 查看主流框架的示例,请参见DEMO (https://github.com/yidun/captcha-demos)。 ### 不含宕机方案接入 通过 ps:建议业务侧直接使用远程 load.min.js 文件(可以确保使用最新版本),避免下载到项目本地。这将有助于我们后续更新策略的顺利执行。 页面接入示例 Code (html): 验证码接入示例
## 方法说明 以下示例都是以不含宕机方案接入,若接入方式为含宕机方案,只需将 initNECaptcha 替换成 initNECaptchaWithFallback 即可。 ### 初始化 #### 示例代码 Code (js): initNECaptcha(options, function onload (instance) {}, function onerror (error) {}) #### 参数说明: 参数 | 类型 | 是否必填 | 默认值 | 描述 captchaId | String | 是 | 无 | 验证码业务ID mode | String | 否 | PC 端默认 "float",移动端默认 "popup" | 验证码模式,有三种模式可选:"float"(触发式)、"embed"(嵌入式)、"popup"(弹出式),其中智能无感知类型不支持 "embed" 模式。示例demo (http://support.dun.163.com/captcha-demo/float) element | String/HTMLElement | 是 | 无 | 容器元素或容器元素选择器,popup 模式下,element 可以为空或者document.body width | Number/String | 否 | 'auto' | 验证按钮宽度,推荐使用宽度 260px-400px。类型为 String 时,支持后缀 px、rem、%,类型为 Number 时,内部会将其转换成 px 单位的值。当值为 "auto" 时,其宽度与容器元素宽度一致。mode 为 "popup" 时,百分比单位无效 apiVersion | Number | 是 | 无 | SDK 版本,推荐设置为 2 protocol | String | 否 | 与用户网站的网络协议一致 | 验证码传输数据使用的网络协议,可选:"http"、"https" lang | String | 否 | 'zh-CN' | 验证码语言选项。支持 "zh-CN"、"zh-TW"、"en"等具体参考文档下方附录-lang枚举 (#2.2) timeout | Number | 否 | 6000ms | 内部每个请求的超时时间 closeEnable | Boolean | 否 | false | 是否由产品方控制验证码弹框关闭 feedbackEnable | Boolean | 否 | true | 是否开显示用户反馈入口(底图右上角问号图标) feedbackUrl | String | 否 | 无 | 用户自定义反馈链接url ipv6 | Boolean | 否 | false | 是否支持 ipv6 网络,如果设置为 true ,验证码内部的所有请求都首先使用 ipv6 域名进行 extraData | String/Function | 否 | 无 | 如果需要在 check 阶段透传业务数据,可以使用 extraData 配置,支持字符串和函数,函数可以解决动态数据问题。当调用二次校验结果接口时,会原样返回该字段,详见后端响应参数 (http://support.dun.163.com/documents/15588062143475712?docId=69218161355051008) maxVerification | Number | 否 | 5 | 最大验证码失败次数,到达上限后会重置验证码,开始新的验证流程 defaultFallback | Boolean | 否 | true | 使用含宕机方案接入有效。是否启用默认降级方案,若设置 false,可搭配onFallback自定义降级方案 errorFallbackCount | Number | 否 | 3 | 使用含宕机方案接入有效。触发降级的最大错误次数,当超过这个错误次数时,触发降级;降级产生的二次验证信息默认无法通过二次验证。大面积发生降级时,请联系客服 enableAutoFocus | Boolean | 否 | 无 | 验证码弹框弹起时是否自动聚焦至弹框元素 onFallback | Function | 否 | 无 | 使用含宕机方案接入有效。验证码触发降级的回调,仅 defaultFallback 为 false 时有效 onReady | Function | 否 | 无 | 验证码所有工作准备就绪的回调函数 onVerify | Function | 否 | 无 | 验证码一次验证结束回调函数 onOpen | Function | 否 | 无 | 验证码弹框弹出前的回调 onClose | Function | 否 | 无 | 验证码弹框关闭后的回调 apiServer | string/string[] | 否 | 易盾默认域名 | 用于指定验证码接口域名,私有化部署、域名转发方式接入需要使用,常规接入不需要设置 staticServer | string/string[] | 否 | 易盾默认域名 | 用于指定验证码静态资源域名,私有化部署、域名转发方式接入需要使用,常规接入不需要设置 customStyles | Object | 否 | 无 | 高级定义功能-主界面自定义样式,请咨询客服 (https://dun.163.com/kefu) popupStyles | Object | 否 | 无 | 高级定义功能-弹框界面自定义样式,请咨询客服 (https://dun.163.com/kefu) customTexts | Object | 否 | 无 | 高级定义功能-文案自定义,请咨询客服 (https://dun.163.com/kefu) #### 回调参数说明: - onload(instance) 回调参数说明 参数 | 类型 | 描述 instance | Object | 初始化成功后的验证码实例 - onerror(error) 回调参数说明 参数 | 类型 | 描述 error | Error | 初始化失败的错误信息,详细错误码请参考附录-错误码 (#2.1) - onVerify(err, data) 回调参数说明 参数 | 类型 | 描述 err | Error | 验证失败的错误信息 data | Object | 验证成功后的信息,格式为{ validate: '' },其中 validate 为二次验证信息 ### 显示验证码(可选) 当 mode 配置成 popup 时,需要调用 verify 显示验证码;否则无需调用,用户直接操作界面进行验证 #### 代码说明 Code (js): instance.verify() // instance 为行为式验证码实例 ### 关闭验证码(可选) 当 closeEnable 设置为 true 时,产品方可获得主动关闭验证码弹框的权限。若需要关闭验证码弹框,可以调用 close 方法。 #### 代码说明 Code (js): instance.close() // instance 为行为式验证码实例 ### 刷新验证码(可选) 当验证成功后,若产品方有场景需要刷新验证码,重新进行验证时,可以调用 refresh 方法: #### 代码说明 Code (js): instance.refresh() // instance 为行为式验证码实例 注意:请不要在验证失败时调用,失败时验证码会自动刷新。 ### 销毁验证码(可选) 当业务不再需要验证码,需要销毁验证码时,可以调用 destroy 方法: #### 代码说明 Code (js): instance.destroy() // instance 为行为式验证码实例 #### 特别说明 onload 和 onReady 的区别: onload 和 onReady 触发时,均会返回验证码的实例,即传入的第一个参数;二者触发时机有所不同: onload 触发时,初始化函数结束和完成实例的生成,注意这并不代表验证码是可用的(比如验证码相关背景图片和信息并没有加载),此方法只触发一次; onReady 触发时,说明验证码准备就绪(比如背景图片等信息均已加载),onReady只触发一次; #### mode 模式演示 - popup,验证码交互模式为弹出式,效果见 popup演示DEMO (https://support.dun.163.com/captcha-demo/popup) - float,验证码交互模式为触发式,效果见 float演示DEMO (https://support.dun.163.com/captcha-demo/float) - embed,验证码交互模式为嵌入式,效果见 embed演示DEMO (https://support.dun.163.com/captcha-demo/embed) #### closeEnable 当 closeEnable 为 true 时,将由产品方控制验证码弹框的关闭时机,验证码不会主动关闭弹框,且弹框右上角的关闭按钮隐藏。当业务方需要关闭验证码弹框时,可以调用 close 方法。使用示例如下: Code (html): 验证码示例-closeEnable
#### form 表单进行二次验证 通常业务方可以在 onVerify 中获取到二次校验信息后进行二次验证;但若产品方是使用表单提交的方式进行请求,可以参考如下示例: Code (html): 验证码示例
## 附录 #### 错误码 code | 含义 501 | 请求失败,包括网络原因等,加载阶段频繁触发qps超限也会返回此code 502 | 请求脚本资源失败 432 | 非法业务ID,包含业务到期等 1000 | 未知错误 300 | 校验未通过,包含轨迹错误等 200 | 校验未通过,是因为业务错误,包含qps超限等 #### lang 可选项 验证码支持以下语言: 语言标识 | 语种 zh-CN | 简体中文 zh-TW | 台湾繁体中文 zh-HK | 香港繁体中文 en-US | 美式英文 en-GB | 英式英文 es | 西班牙语(欧洲) pt | 葡萄牙语(欧洲) fr | 法语 de | 德语 ru | 俄语 it | 意大利语 ja | 日语 es-la | 拉美西语 pt-br | 巴西葡语 sv | 瑞典语 no | 挪威语 da | 丹麦语 cs | 捷克语 hu | 匈牙利语 sk | 斯洛伐克语 pl | 波兰语 ro | 罗马尼亚语 el | 希腊语 sr | 塞尔维亚语(拉丁文) bs | 波斯尼亚语 mk | 马其顿语 bg | 保加利亚语 fi | 芬兰语 et | 爱沙尼亚语 lv | 拉脱维亚语 lt | 立陶宛语 sl | 斯洛文尼亚语 hr | 克罗地亚语 uk | 乌克兰语 tr | 土耳其语 vi | 越南语 id | 印尼语 ar | 阿拉伯语 fa | 波斯语 nl | 荷兰语 th | 泰语 ms | 马来西亚语 ca | 加泰罗尼亚语 hi | 印地语 my | 缅甸语 ko | 韩语 he | 希伯来语 gl | 加利西亚语 eu | 巴斯克语 ka | 格鲁吉亚语 az | 阿塞拜疆语 uz | 乌孜别克语 km | 高棉语 si | 僧伽罗语 ur | 乌尔都语 bo | 藏语 be | 白俄罗斯语 kk | 哈萨克语(西里尔文) bn | 孟加拉语 lo | 老挝语 fil | 菲律宾语 jv | 爪哇语 ne | 尼泊尔语 sw | 斯瓦西里语 mi | 毛利语 am | 阿姆哈拉语 te | 泰卢固语 mr | 马拉地语 ta | 泰米尔语 gu | 古吉拉特语 kn | 卡纳达语 ml | 马来亚拉姆语 or | 欧里亚语 pa | 旁遮普语 as | 阿萨姆语 mai | 迈蒂利语 mn | 蒙古语(西里尔文) ug | 维吾尔语