### 简介 - 活体检测H5是通过引入H5页面实现人像活体检测的RESTful Web Service接口 - 本接口支持静默、动作、闪光 - 检测成功之后提取一张人像照片 演示(请在手机端打开):[https://api-h5.jumdata.com/lifecheck/v2-1/demo](https://api-h5.jumdata.com/lifecheck/v2/demo) ### 接入流程  1. 接入者服务端通过调用聚美智数活体检测初始化接口获取token,并把token返回给接入者页面; 2. 接入者页面带上token跳转至聚美智数活体检测H5页面进行活体检测;检测结束后,检测H5页面会自动跳转至初始化时指定的地址returnUrl,并返回token和检测结果; 3. 接入者服务端通过调用聚美智数获取检测结果接口获取结果; ### 接口调用说明 #### 请求方式 如接口没有单独说明,所有接口均为:**POST** #### 请求格式 如接口没有单独说明,所有接口均为:**application/x-www-form-urlencoded** #### 请求参数 请求参数均包括公共参数和业务参数(业务参数见具体接口说明) 如接口没有单独说明,所有接口调用时,均需要把**公共参数**和**业务参数**一并放在**请求参数**中提交 <a name="公共请求参数"></a> ##### 公共请求参数 | 名称 | 类型 | 必须 | <div style="width:420px;">说明</div> | | ------------ | ------------ | ------------ | ------------ | | appId| String | 是 | 服务商分配的唯一标识 | | timestamp | Long | 是 | 当前时间戳(毫秒) | | sign | String | 是 | 签名,详见签名算法说明 | | productCode | String | 是 | 固定值:life_check_v2 | ##### 签名算法说明 ``` sign = sha256(appId + appSecret + timestamp) ``` 用服务商分配的 **appId**、服务商分配的 **appSecret**,当前时间戳(毫秒) **timestamp**,按上述顺序拼接成字符串,再进行 **sha256** 哈希得到。如下: ``` java String appId = "xyzxy2121zxyz"; String timestamp = "1555378976238"; String appSecret = "efcefcef1121cefcefc1212121"; String str = appId + appSecret + timestamp; String sign = sha256(str); ``` #### 返回说明 ##### 公共返回字段说明 所有接口均返回以下公共字段: | 字段名 | <div style="width:420px">说明</div> | | --- | --- | | code | 返回码,详见:code返回码说明| | msg | code对应的描述 | | charge | 计费标志 true为计费,false为不计费| | taskNo | 本次请求号 | | data | 返回具体结果,object类型,详见data返回字段描述 | <a name="公共code返回码说明"></a> ##### 公共code返回码说明 所有接口公共返回码如下: | code | <div style="width:420px;">说明</div> | | - | - | | 200 | 成功| | 400 | 参数错误 | | 404 | 接口地址不正确 | | 500 | 系统维护,请稍候再试 | | 601 | 接口未开通 | | 602 | 账号停用 | | 604 | 接口停用 | | 606 | 调用超限,请稍候再试| | 607 | ip不在白名单| | 609 | 请求过于频繁,请稍候再试| | 610 | 请求超时| | 999 | 其他,以实际返回为准| ------------ ### 活体检测初始化 #### 请求地址 `https://api.jumdata.com/lifecheck/h5/v2-1/init` #### 业务参数 | 名称 | 类型 | 必须 | <div style="width:440px;">说明</div> | | ------------ | ------------ | ------------ | ------------ | | returnUrl | String | 是 | 检测完成后页面自动跳转地址,长度不超过256个字符。接入者可以在该地址的页面中去获取检测结果。<br>不用的使用场景,returnUrl的前缀要求不同,详见returnUrl前缀说 | | actionStyle | int | 否 | 动作选项,默认:1。详见actionStyle参数说明 | | actions | String | 否 | 动作序列,当actionStyle为3时,必须传入。详见actions参数说明| | actionMutex | int | 否 | 是否检查动作互斥,也就是动作不匹配立刻停止采集。<br>1 - 检查,0 - 不检查。默认:1| | antiCameraHack | int | 否 | 是否开启闪光防摄像头劫持检测,对光线环境会有一定要求。<br>1 - 开启,0 - 不开启。默认:1| | title | String | 否 | 采集页面的标题文本,最长32个字符 | #### returnUrl前缀说明 | 前缀 | <div style="width:500px;">说明</div> | | ------------ | ------------ | ------------ | ------------ | | 无 | 自适应跳转,`http://`或`https://开头` 如`http://www.aaa.com` 用于普通H5页面跳转 | | replace: | 指定使用window.location.replace进行跳转, 如`replace: http://xxx` | | wx.redirect | 微信小程序跳转,指定使用wx.miniProgram.redirectTo跳转,如`wx.redirect:/pages/result` | | wx.history | 微信小程序跳转,指定使用wx.miniProgram.navigateBack跳回原页面 | | app:functionName | 嵌入app的混合开发模式,functionName必填,如`app:notifyResult`,采集完成后通过JavaScript Bridge方式通知用户。自定义的方法(如notifyResult),传参为String型(token),用户自主跳转。注:安卓端接收数据时需定义注册的js名是handleLive(webView.addJavascriptInterface(this, “handleLive”)) | | scheme: | 浏览器打开的采集页面跳到小程序或者app指定页面,如`scheme:weixin://…` | #### actionStyle参数说明 | 值 | <div style="width:550px;">说明</div> | | ------------ | ------------ | ------------ | ------------ | | 1 | 随机从摇头、点头、左转头、右转头4个头部动作中选取一个动作,再随机从眨眼和张嘴2个局部动作中选取一个动作,然后随机组合这两个动作的顺序 | | 2 | 随机从眨眼和张嘴2个局部动作中选取一个动作 | | 3 | 自定义 | | -1 | 无动作(静默) | #### actions参数说明 | 值 | <div style="width:550px;">说明</div> | | ------------ | ------------ | ------------ | ------------ | | LookLeft | 向左转头,要求动作不要很快,幅度适宜(30度左右) | | LookRight | 向右转头,要求动作不要很快,幅度适宜(30度左右) | | OpenMouth | 张嘴,从闭嘴变为张开嘴巴,动作不要很快,幅度适宜(嘴唇距离双指以上) | | BlinkEye | 眨眼,由睁眼到闭眼,动作不要很快,眼睛睁开到紧闭 | | ShakeHead | 摇头,向左右转头,动作不要很快,幅度适宜(30度左右) | | NodHead | 点头,上下转头,动作不要很快,幅度适宜(30度左右) | #### 成功返回样例 ``` json { "code": 200, "msg": "成功", "taskNo": "043439882226367117195632", "charge": true, "data": { "token": "xxx", // 本次检测的token,有效期为2小时,用于后续获取结果 "checkUrl": "https://api-h5.jumdata.com/lifecheck/v2-1/check/capture.html?token=e146524ee4b8415e8bebc9f739ee67da" // 检测页面的地址 } } ``` #### code返回码说明 本接口没有特殊返回码,请参阅:<a href="#公共code返回码说明">公共code返回码说明</a> ------------ ### 获取活体检测结果 #### 请求地址 `https://api.jumdata.com/lifecheck/h5/v2-1/result` | 名称 | 类型 | 必须 | <div style="width:420px;">说明</div> | | ------------ | ------------ | ------------ | ------------ | | token | String | 是 | 初始化接口返回的token | 公共请求参数请参阅:<a href="#公共请求参数">公共请求参数</a> #### 检测通过返回样例 ``` json { "code": 200, "msg": "活体检测通过", "taskNo": "043439882226367117195632", "data": { "faceImageUrl": "xxx" // 检测通过时返回人像照片 } } ``` #### 检测不通过返回样例 ``` json { "code": 202, "msg": "活体检测未通过", "taskNo": "043439882226367117195632", } ``` #### 未查询到检测结果返回样例 ``` json { "code": 201, "msg": "未查询到检测结果", "taskNo": "043439882226367117195632", } ``` #### 检测失败样例 ``` json { "code": 203, "msg": "检测失败", "taskNo": "043439882226367117195632", } ``` #### code返回码说明 | code | <div style="width:120px;">说明</div> | <div style="width:420px;">原因说明</div> | | - | - |- | | 200 | 活体检测通过 | | | 202 | 活体检测未通过 | 1.用户做出不匹配指令的错误动作<br>2.用户未在等待时间内做出正确动作<br>3.未能采集到质量合格的活体人脸照片<br>4.未通过活体检测算法| | 201 | 未查询到检测结果 | | | 203 | 活体检测失败 |1.浏览器环境不支持活体检测<br>2.用户拒绝打开摄像头<br>3.未能检测到人脸或持续出现多人脸 <br>4.人脸移出视线或出现多人脸<br>5.检测到有可能摄像头被劫持| | 301 | token已过期| 指初始化之后未在两小时内获取结果| 公共返回码请参阅:<a href="#公共code返回码说明">公共code返回码说明</a> ### 前端(VUE)接入参考 #### 开始检测页面 ``` javascript // 接入者服务端先提供获取token接口,详见获取初始化接口 // 然后此处调用该接口获取活体检测token // myLifecheckService 指接入者自行封装的活体检测服务端 myLifecheckService.getToken().then(response=> { let token = response.token // 获取token之后跳转至初始化接口返回的活体检测H5页面 location.href = ${初始化接口返回的活体检测H5页面} }) ``` #### returnUrl页面 ``` javascript let query = this.$route.query let token = query.token // passed只表示简单的通过和未通过,如需更详细信息,可自行在接入者服务端封装获取结果接口,详见获取活体检测结果 myLifecheckService.getResult(token).then(response=> { if(200===response.code) { // 检测通过 } else { // 检测未通过、未查询到检测结果、活体检测失败、token已过期 } }) ``` ### 计费说明 - 调用初始化接口时预扣费用,当检测通过(查询结果接口返回200)或不通过(查询结果接口返回202)时实扣费用,其余情况系统会自动退回费用 - 查询结果接口不计费
演示(请在手机端打开):https://api-h5.jumdata.com/lifecheck/v2-1/demo
如接口没有单独说明,所有接口均为:POST
如接口没有单独说明,所有接口均为:application/x-www-form-urlencoded
请求参数均包括公共参数和业务参数(业务参数见具体接口说明)
如接口没有单独说明,所有接口调用时,均需要把公共参数和业务参数一并放在请求参数中提交
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
appId | String | 是 | 服务商分配的唯一标识 |
timestamp | Long | 是 | 当前时间戳(毫秒) |
sign | String | 是 | 签名,详见签名算法说明 |
productCode | String | 是 | 固定值:life_check_v2 |
sign = sha256(appId + appSecret + timestamp)
用服务商分配的 appId、服务商分配的 appSecret,当前时间戳(毫秒) timestamp,按上述顺序拼接成字符串,再进行 sha256 哈希得到。如下:
String appId = "xyzxy2121zxyz";
String timestamp = "1555378976238";
String appSecret = "efcefcef1121cefcefc1212121";
String str = appId + appSecret + timestamp;
String sign = sha256(str);
所有接口均返回以下公共字段:
字段名 | 说明 |
---|---|
code | 返回码,详见:code返回码说明 |
msg | code对应的描述 |
charge | 计费标志 true为计费,false为不计费 |
taskNo | 本次请求号 |
data | 返回具体结果,object类型,详见data返回字段描述 |
所有接口公共返回码如下:
code | 说明 |
---|---|
200 | 成功 |
400 | 参数错误 |
404 | 接口地址不正确 |
500 | 系统维护,请稍候再试 |
601 | 接口未开通 |
602 | 账号停用 |
604 | 接口停用 |
606 | 调用超限,请稍候再试 |
607 | ip不在白名单 |
609 | 请求过于频繁,请稍候再试 |
610 | 请求超时 |
999 | 其他,以实际返回为准 |
https://api.jumdata.com/lifecheck/h5/v2-1/init
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
returnUrl | String | 是 | 检测完成后页面自动跳转地址,长度不超过256个字符。接入者可以在该地址的页面中去获取检测结果。 不用的使用场景,returnUrl的前缀要求不同,详见returnUrl前缀说 |
actionStyle | int | 否 | 动作选项,默认:1。详见actionStyle参数说明 |
actions | String | 否 | 动作序列,当actionStyle为3时,必须传入。详见actions参数说明 |
actionMutex | int | 否 | 是否检查动作互斥,也就是动作不匹配立刻停止采集。 1 - 检查,0 - 不检查。默认:1 |
antiCameraHack | int | 否 | 是否开启闪光防摄像头劫持检测,对光线环境会有一定要求。 1 - 开启,0 - 不开启。默认:1 |
title | String | 否 | 采集页面的标题文本,最长32个字符 |
前缀 | 说明 |
---|---|
无 | 自适应跳转,http:// 或https://开头 如http://www.aaa.com 用于普通H5页面跳转 |
replace: | 指定使用window.location.replace进行跳转, 如replace: http://xxx |
wx.redirect | 微信小程序跳转,指定使用wx.miniProgram.redirectTo跳转,如wx.redirect:/pages/result |
wx.history | 微信小程序跳转,指定使用wx.miniProgram.navigateBack跳回原页面 |
app:functionName | 嵌入app的混合开发模式,functionName必填,如app:notifyResult ,采集完成后通过JavaScript Bridge方式通知用户。自定义的方法(如notifyResult),传参为String型(token),用户自主跳转。注:安卓端接收数据时需定义注册的js名是handleLive(webView.addJavascriptInterface(this, “handleLive”)) |
scheme: | 浏览器打开的采集页面跳到小程序或者app指定页面,如scheme:weixin://… |
值 | 说明 |
---|---|
1 | 随机从摇头、点头、左转头、右转头4个头部动作中选取一个动作,再随机从眨眼和张嘴2个局部动作中选取一个动作,然后随机组合这两个动作的顺序 |
2 | 随机从眨眼和张嘴2个局部动作中选取一个动作 |
3 | 自定义 |
-1 | 无动作(静默) |
值 | 说明 |
---|---|
LookLeft | 向左转头,要求动作不要很快,幅度适宜(30度左右) |
LookRight | 向右转头,要求动作不要很快,幅度适宜(30度左右) |
OpenMouth | 张嘴,从闭嘴变为张开嘴巴,动作不要很快,幅度适宜(嘴唇距离双指以上) |
BlinkEye | 眨眼,由睁眼到闭眼,动作不要很快,眼睛睁开到紧闭 |
ShakeHead | 摇头,向左右转头,动作不要很快,幅度适宜(30度左右) |
NodHead | 点头,上下转头,动作不要很快,幅度适宜(30度左右) |
{
"code": 200,
"msg": "成功",
"taskNo": "043439882226367117195632",
"charge": true,
"data": {
"token": "xxx", // 本次检测的token,有效期为2小时,用于后续获取结果
"checkUrl": "https://api-h5.jumdata.com/lifecheck/v2-1/check/capture.html?token=e146524ee4b8415e8bebc9f739ee67da" // 检测页面的地址
}
}
本接口没有特殊返回码,请参阅:公共code返回码说明
https://api.jumdata.com/lifecheck/h5/v2-1/result
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
token | String | 是 | 初始化接口返回的token |
公共请求参数请参阅:公共请求参数
{
"code": 200,
"msg": "活体检测通过",
"taskNo": "043439882226367117195632",
"data": {
"faceImageUrl": "xxx" // 检测通过时返回人像照片
}
}
{
"code": 202,
"msg": "活体检测未通过",
"taskNo": "043439882226367117195632",
}
{
"code": 201,
"msg": "未查询到检测结果",
"taskNo": "043439882226367117195632",
}
{
"code": 203,
"msg": "检测失败",
"taskNo": "043439882226367117195632",
}
code | 说明 |
原因说明 |
---|---|---|
200 | 活体检测通过 | |
202 | 活体检测未通过 | 1.用户做出不匹配指令的错误动作 2.用户未在等待时间内做出正确动作 3.未能采集到质量合格的活体人脸照片 4.未通过活体检测算法 |
201 | 未查询到检测结果 | |
203 | 活体检测失败 | 1.浏览器环境不支持活体检测 2.用户拒绝打开摄像头 3.未能检测到人脸或持续出现多人脸 4.人脸移出视线或出现多人脸 5.检测到有可能摄像头被劫持 |
301 | token已过期 | 指初始化之后未在两小时内获取结果 |
公共返回码请参阅:公共code返回码说明
// 接入者服务端先提供获取token接口,详见获取初始化接口
// 然后此处调用该接口获取活体检测token
// myLifecheckService 指接入者自行封装的活体检测服务端
myLifecheckService.getToken().then(response=> {
let token = response.token
// 获取token之后跳转至初始化接口返回的活体检测H5页面
location.href = ${初始化接口返回的活体检测H5页面}
})
let query = this.$route.query
let token = query.token
// passed只表示简单的通过和未通过,如需更详细信息,可自行在接入者服务端封装获取结果接口,详见获取活体检测结果
myLifecheckService.getResult(token).then(response=> {
if(200===response.code) {
// 检测通过
} else {
// 检测未通过、未查询到检测结果、活体检测失败、token已过期
}
})
演示(请在手机端打开):https://api-h5.jumdata.com/lifecheck/v2-1/demo
如接口没有单独说明,所有接口均为:POST
如接口没有单独说明,所有接口均为:application/x-www-form-urlencoded
请求参数均包括公共参数和业务参数(业务参数见具体接口说明)
如接口没有单独说明,所有接口调用时,均需要把公共参数和业务参数一并放在请求参数中提交
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
appId | String | 是 | 服务商分配的唯一标识 |
timestamp | Long | 是 | 当前时间戳(毫秒) |
sign | String | 是 | 签名,详见签名算法说明 |
productCode | String | 是 | 固定值:life_check_v2 |
sign = sha256(appId + appSecret + timestamp)
用服务商分配的 appId、服务商分配的 appSecret,当前时间戳(毫秒) timestamp,按上述顺序拼接成字符串,再进行 sha256 哈希得到。如下:
String appId = "xyzxy2121zxyz";
String timestamp = "1555378976238";
String appSecret = "efcefcef1121cefcefc1212121";
String str = appId + appSecret + timestamp;
String sign = sha256(str);
所有接口均返回以下公共字段:
字段名 | 说明 |
---|---|
code | 返回码,详见:code返回码说明 |
msg | code对应的描述 |
charge | 计费标志 true为计费,false为不计费 |
taskNo | 本次请求号 |
data | 返回具体结果,object类型,详见data返回字段描述 |
所有接口公共返回码如下:
code | 说明 |
---|---|
200 | 成功 |
400 | 参数错误 |
404 | 接口地址不正确 |
500 | 系统维护,请稍候再试 |
601 | 接口未开通 |
602 | 账号停用 |
604 | 接口停用 |
606 | 调用超限,请稍候再试 |
607 | ip不在白名单 |
609 | 请求过于频繁,请稍候再试 |
610 | 请求超时 |
999 | 其他,以实际返回为准 |
https://api.jumdata.com/lifecheck/h5/v2-1/init
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
returnUrl | String | 是 | 检测完成后页面自动跳转地址,长度不超过256个字符。接入者可以在该地址的页面中去获取检测结果。 不用的使用场景,returnUrl的前缀要求不同,详见returnUrl前缀说 |
actionStyle | int | 否 | 动作选项,默认:1。详见actionStyle参数说明 |
actions | String | 否 | 动作序列,当actionStyle为3时,必须传入。详见actions参数说明 |
actionMutex | int | 否 | 是否检查动作互斥,也就是动作不匹配立刻停止采集。 1 - 检查,0 - 不检查。默认:1 |
antiCameraHack | int | 否 | 是否开启闪光防摄像头劫持检测,对光线环境会有一定要求。 1 - 开启,0 - 不开启。默认:1 |
title | String | 否 | 采集页面的标题文本,最长32个字符 |
前缀 | 说明 |
---|---|
无 | 自适应跳转,http:// 或https://开头 如http://www.aaa.com 用于普通H5页面跳转 |
replace: | 指定使用window.location.replace进行跳转, 如replace: http://xxx |
wx.redirect | 微信小程序跳转,指定使用wx.miniProgram.redirectTo跳转,如wx.redirect:/pages/result |
wx.history | 微信小程序跳转,指定使用wx.miniProgram.navigateBack跳回原页面 |
app:functionName | 嵌入app的混合开发模式,functionName必填,如app:notifyResult ,采集完成后通过JavaScript Bridge方式通知用户。自定义的方法(如notifyResult),传参为String型(token),用户自主跳转。注:安卓端接收数据时需定义注册的js名是handleLive(webView.addJavascriptInterface(this, “handleLive”)) |
scheme: | 浏览器打开的采集页面跳到小程序或者app指定页面,如scheme:weixin://… |
值 | 说明 |
---|---|
1 | 随机从摇头、点头、左转头、右转头4个头部动作中选取一个动作,再随机从眨眼和张嘴2个局部动作中选取一个动作,然后随机组合这两个动作的顺序 |
2 | 随机从眨眼和张嘴2个局部动作中选取一个动作 |
3 | 自定义 |
-1 | 无动作(静默) |
值 | 说明 |
---|---|
LookLeft | 向左转头,要求动作不要很快,幅度适宜(30度左右) |
LookRight | 向右转头,要求动作不要很快,幅度适宜(30度左右) |
OpenMouth | 张嘴,从闭嘴变为张开嘴巴,动作不要很快,幅度适宜(嘴唇距离双指以上) |
BlinkEye | 眨眼,由睁眼到闭眼,动作不要很快,眼睛睁开到紧闭 |
ShakeHead | 摇头,向左右转头,动作不要很快,幅度适宜(30度左右) |
NodHead | 点头,上下转头,动作不要很快,幅度适宜(30度左右) |
{
"code": 200,
"msg": "成功",
"taskNo": "043439882226367117195632",
"charge": true,
"data": {
"token": "xxx", // 本次检测的token,有效期为2小时,用于后续获取结果
"checkUrl": "https://api-h5.jumdata.com/lifecheck/v2-1/check/capture.html?token=e146524ee4b8415e8bebc9f739ee67da" // 检测页面的地址
}
}
本接口没有特殊返回码,请参阅:公共code返回码说明
https://api.jumdata.com/lifecheck/h5/v2-1/result
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
token | String | 是 | 初始化接口返回的token |
公共请求参数请参阅:公共请求参数
{
"code": 200,
"msg": "活体检测通过",
"taskNo": "043439882226367117195632",
"data": {
"faceImageUrl": "xxx" // 检测通过时返回人像照片
}
}
{
"code": 202,
"msg": "活体检测未通过",
"taskNo": "043439882226367117195632",
}
{
"code": 201,
"msg": "未查询到检测结果",
"taskNo": "043439882226367117195632",
}
{
"code": 203,
"msg": "检测失败",
"taskNo": "043439882226367117195632",
}
code | 说明 |
原因说明 |
---|---|---|
200 | 活体检测通过 | |
202 | 活体检测未通过 | 1.用户做出不匹配指令的错误动作 2.用户未在等待时间内做出正确动作 3.未能采集到质量合格的活体人脸照片 4.未通过活体检测算法 |
201 | 未查询到检测结果 | |
203 | 活体检测失败 | 1.浏览器环境不支持活体检测 2.用户拒绝打开摄像头 3.未能检测到人脸或持续出现多人脸 4.人脸移出视线或出现多人脸 5.检测到有可能摄像头被劫持 |
301 | token已过期 | 指初始化之后未在两小时内获取结果 |
公共返回码请参阅:公共code返回码说明
// 接入者服务端先提供获取token接口,详见获取初始化接口
// 然后此处调用该接口获取活体检测token
// myLifecheckService 指接入者自行封装的活体检测服务端
myLifecheckService.getToken().then(response=> {
let token = response.token
// 获取token之后跳转至初始化接口返回的活体检测H5页面
location.href = ${初始化接口返回的活体检测H5页面}
})
let query = this.$route.query
let token = query.token
// passed只表示简单的通过和未通过,如需更详细信息,可自行在接入者服务端封装获取结果接口,详见获取活体检测结果
myLifecheckService.getResult(token).then(response=> {
if(200===response.code) {
// 检测通过
} else {
// 检测未通过、未查询到检测结果、活体检测失败、token已过期
}
})