产品适用于金融、保险、电商、直播、社交、金融、运营商、共享出行等行业的实名注册、密码修改、交易提现等高安全性场景。
实名取/寄件场景,快递员实名场景,可实现取/寄件人和快递员活体实名核验,确保安全。
线上实名注册、订车、线下实名取车,实现用户信息真实性与用车订单的安全性。
各类应用可以使用接口进行视频活体核验,用于验证用户身份和权限,提供更安全的用户体验。
核验
请求Header:
名称 | 值 | |
---|---|---|
Content-Type | application/x-www-form-urlencoded |
请求参数说明:
名称 | 必填 | 类型 | 说明 | |
---|---|---|---|---|
key | 是 | string | 在个人中心->我的数据,接口名称上方查看 | |
idcard | 是 | string | 身份证号 | |
realname | 是 | string | 姓名 | |
videoBase64 | 否 | string | 用于活体检测的视频,视频的BASE64值;BASE64编码后的大小不超过8M,支持mp4、avi、flv格式。 | |
videoUrl | 否 | string | 用于活体检测的视频Url 地址。视频下载后经Base64编码不超过 8M,视频下载耗时不超过4S,支持mp4、avi、flv格式。视频的 videoUrl、videoBase64必须提供一个,如果都提供,只使用 videoBase64。 | |
livenessType | 否 | string | 活体检测类型,取值:0/1/2。 说明 0为静默模式 1为数字模式 2为动作模式 三种模式选择一种传入,不传默认为静默模式 |
|
validateData | 否 | string | 说明 livenessType为1数字模式传参:传4位数字验证码 livenessType为2动作模式传参:传动作顺序(1,2或2,1),1代表张嘴,2代表闭眼 静默模式不用传 |
|
bestBase64 | 否 | int | 是否需要返回视频最佳截图 说明 1:需要 其他或不传不返回 |
|
bestFrameNum | 否 | int | 需要返回多张最佳截图,取值范围2-10,不传不返回 |
请求代码示例:
curl -k -i -d "key=key&idcard=370121xxxxxxxx1040&realname=%E6%9D%8E%E8%81%9A%E5%90%88&videoBase64=&videoUrl=&livenessType=&validateData=&bestBase64=&bestFrameNum=" "http://apis.juhe.cn/antiFaceId/query"
<?php
/**
* 1693-核验 - 代码参考(根据实际业务情况修改)
*/
// 基本参数配置
$apiUrl = "http://apis.juhe.cn/antiFaceId/query"; // 接口请求URL
$method = "POST"; // 接口请求方式
$headers = ["Content-Type: application/x-www-form-urlencoded"]; // 接口请求header
$apiKey = "您申请的调用APIkey"; // 在个人中心->我的数据,接口名称上方查看
// 接口请求入参配置
$requestParams = [
'key' => $apiKey,
'idcard'=> '370121xxxxxxxx1040',
'realname'=> '李聚合',
'videoBase64'=> '',
'videoUrl'=> '',
'livenessType'=> '',
'validateData'=> '',
'bestBase64'=> '',
'bestFrameNum'=> '',
];
$requestParamsStr = http_build_query($requestParams);
// 发起接口网络请求
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $apiUrl);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
if (1 == strpos("$" . $apiUrl, "https://")) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($curl, CURLOPT_POSTFIELDS, $requestParamsStr);
$response = curl_exec($curl);
$httpInfo = curl_getinfo($curl);
curl_close($curl);
// 解析响应结果
$responseResult = json_decode($response, true);
if ($responseResult) {
// 网络请求成功。可依据业务逻辑和接口文档说明自行处理。
var_dump($responseResult);
} else {
// 网络异常等因素,解析结果异常。可依据业务逻辑自行处理。
// var_dump($httpInfo);
var_dump("请求异常");
}
import requests
# 1693-核验 - 代码参考(根据实际业务情况修改)
# 基本参数配置
apiUrl = 'http://apis.juhe.cn/antiFaceId/query' # 接口请求URL
apiKey = '您申请的调用APIkey' # 在个人中心->我的数据,接口名称上方查看
# 接口请求入参配置
requestParams = {
'key': apiKey,
'idcard': '370121xxxxxxxx1040',
'realname': '李聚合',
'videoBase64': '',
'videoUrl': '',
'livenessType': '',
'validateData': '',
'bestBase64': '',
'bestFrameNum': '',
}
# 发起接口网络请求
response = requests.post(apiUrl, requestParams)
# 解析响应结果
if response.status_code == 200:
responseResult = response.json()
# 网络请求成功。可依据业务逻辑和接口文档说明自行处理。
print(responseResult)
else:
# 网络异常等因素,解析结果异常。可依据业务逻辑自行处理。
print('请求异常')
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"strings"
)
func main() {
// 基本参数配置
apiUrl := "http://apis.juhe.cn/antiFaceId/query"
apiKey := "您申请的调用APIkey"
// 接口请求入参配置
requestParams := url.Values{}
requestParams.Set("key", apiKey)
requestParams.Set("idcard", "370121xxxxxxxx1040")
requestParams.Set("realname", "李聚合")
requestParams.Set("videoBase64", "")
requestParams.Set("videoUrl", "")
requestParams.Set("livenessType", "")
requestParams.Set("validateData", "")
requestParams.Set("bestBase64", "")
requestParams.Set("bestFrameNum", "")
// 发起接口网络请求
resp, err := http.Post(apiUrl, "application/x-www-form-urlencoded", strings.NewReader(requestParams.Encode()))
if err != nil {
fmt.Println("网络请求异常:", err)
return
}
defer resp.Body.Close()
var responseResult map[string]interface{}
err = json.NewDecoder(resp.Body).Decode(&responseResult)
if err != nil {
fmt.Println("解析响应结果异常:", err)
return
}
fmt.Println(responseResult)
}
using System;
using System.Text;
using System.Net;
using Newtonsoft.Json;
using System.Collections.Specialized;
namespace Common_API_Test.Test_Demo
{
class Csharp_post
{
static void Main(string[] args)
{
string url = "http://apis.juhe.cn/antiFaceId/query";
string apiKey = "您申请的调用APIkey";
using (WebClient client = new WebClient())
{
var data = new NameValueCollection();
// 添加元素到 NameValueCollection
data.Add("key", apiKey);
data.Add( "idcard", "370121xxxxxxxx1040");
data.Add( "realname", "李聚合");
data.Add( "videoBase64", "");
data.Add( "videoUrl", "");
data.Add( "livenessType", "");
data.Add( "validateData", "");
data.Add( "bestBase64", "");
data.Add( "bestFrameNum", "");
try
{
byte[] response = client.UploadValues(url, "POST", data);
string responseContent = Encoding.UTF8.GetString(response);
dynamic responseData = JsonConvert.DeserializeObject(responseContent);
if (responseData != null)
{
Console.WriteLine("Return Code: " + responseData["error_code"]);
Console.WriteLine("Return Message: " + responseData["reason"]);
}
else
{
Console.WriteLine("json解析异常!");
}
}
catch (Exception)
{
Console.WriteLine("请检查其它错误");
}
}
}
}
}
const axios = require('axios'); // npm install axios
// 基本参数配置
const apiUrl = 'http://apis.juhe.cn/antiFaceId/query'; // 接口请求URL
const apiKey = '您申请的调用APIkey'; // 在个人中心->我的数据,接口名称上方查看
// 接口请求入参配置
const requestParams = {
key: apiKey,
idcard: '370121xxxxxxxx1040',
realname: '李聚合',
videoBase64: '',
videoUrl: '',
livenessType: '',
validateData: '',
bestBase64: '',
bestFrameNum: '',
};
// 发起接口网络请求
axios.post(apiUrl, requestParams, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
.then(response => {
// 解析响应结果
if (response.status === 200) {
const responseResult = response.data;
// 网络请求成功。可依据业务逻辑和接口文档说明自行处理。
console.log(responseResult);
} else {
// 网络异常等因素,解析结果异常。可依据业务逻辑自行处理。
console.log('请求异常');
}
})
.catch(error => {
// 网络请求失败,可以根据实际情况进行处理
console.log('网络请求失败:', error);
});
package cn.juhe.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class JavaPost {
public static void main(String[] args) throws Exception {
String apiKey = "你申请的key";
String apiUrl = "http://apis.juhe.cn/antiFaceId/query";
HashMap<String, String> map = new HashMap<>();
map.put("key", apiKey);
map.put("idcard", "370121xxxxxxxx1040");
map.put("realname", "李聚合");
map.put("videoBase64", "");
map.put("videoUrl", "");
map.put("livenessType", "");
map.put("validateData", "");
map.put("bestBase64", "");
map.put("bestFrameNum", "");
URL url = new URL(apiUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
String urlParameters = params(map);
try (OutputStream os = connection.getOutputStream()) {
byte[] input = urlParameters.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// 打印响应
System.out.println(response);
}
public static String params(Map<String, String> map) {
return map.entrySet().stream()
.map(entry -> {
try {
return entry.getKey() + "=" + URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.toString());
} catch (Exception e) {
e.printStackTrace();
return entry.getKey() + "=" + entry.getValue();
}
})
.collect(Collectors.joining("&"));
}
}
// 基本参数配置
NSString *apiUrl = @"http://apis.juhe.cn/antiFaceId/query"; // 接口请求URL
NSString *apiKey = @"您申请的调用APIkey"; // 在个人中心->我的数据,接口名称上方查看
// 接口请求入参配置
NSDictionary *requestParams = @{
@"key": apiKey,
@"idcard": @"370121xxxxxxxx1040",
@"realname": @"李聚合",
@"videoBase64": @"",
@"videoUrl": @"",
@"livenessType": @"",
@"validateData": @"",
@"bestBase64": @"",
@"bestFrameNum": @"",
};
// 将请求参数转换成字符串形式
NSMutableString *postString = [NSMutableString string];
[requestParams enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
[postString appendFormat:@"%@=%@&", key, value];
}];
[postString deleteCharactersInRange:NSMakeRange(postString.length - 1, 1)]; // 删除最后一个"&"
// 发起接口网络请求
NSURL *url = [NSURL URLWithString:apiUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
request.HTTPBody = [postString dataUsingEncoding:NSUTF8StringEncoding]; // 设置HTTPBody为转换后的参数字符串
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
// 网络请求异常处理
NSLog(@"请求异常");
} else {
NSError *jsonError;
NSDictionary *responseResult = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (!jsonError) {
// 网络请求成功处理
NSLog(@"%@", [responseResult objectForKey:@"error_code"]);
NSLog(@"%@", [responseResult objectForKey:@"reason"]);
NSLog(@"%@", responseResult);
} else {
// 解析结果异常处理
NSLog(@"解析结果异常");
}
}
}];
[task resume];
返回参数说明:
名称 | 类型 | 说明 | |
---|---|---|---|
error_code | int | 返回码(0,267509收费,其余不收费) | |
reason | string | 返回说明 | |
result | jsonObject | 返回结果集 | |
orderid | string | 属result,聚合订单号 | |
res | jsonObject | 属result | |
score | Float | 属res,相似度,取值范围 [0.00, 100.00]。推荐相似度大于等于70时可判断为同一人,可根据具体场景自行调整阈值(阈值70的误通过率为千分之一,阈值80的误通过率是万分之一) | |
bestBase64 | string | 属res,只有传入参数bestBase64为1时返回,验证通过后的视频最佳截图照片,照片为BASE64编码后的值,jpg格。注意:此字段可能返回 null,表示取不到有效值。 | |
bestList | array of string | 属res,最佳截图列表,仅在传入bestFrameNum时返回结果,否则不返回。 |
JSON返回示例:JSON在线格式化工具 >
尽量保证用户在活体核验的时候尽量不要在窗边、 车门边、 头顶强光、 摄像头不要模糊、晃动幅度不要过大
忽近忽远, 人脸在屏幕中占大部分且保持完整, 以保证视频中人脸特征明显,
压缩视频方式:
视频格式:H264编码标准的视频格式(如mp4,mov,avi,webm),
分辨率支持270p~1080p, (推荐wxh=320x*), 视频大小不超过8M ,
如果前端手机录制H5视频过大,推荐使用ffmpeg先进行压缩再传到核身服务中;
推荐压缩命令:./ffmpeg -y -v error -i SRC_VIDEO_FILE_PATH -preset veryfast -b:v 1048576 -vf
format=pix_fmts=yuv420p,fps=25,scale=640:-16 DEST_VIDEO_FILE_NAME
(只需要调整SRC_VIDEO_FILE_PATH, DEST_VIDEO_FILE_NAME两个参数)
{
"reason": "成功",
"result":{
"res":{
"score": 100
},
"orderid": "J675202203211119151305"
},
"error_code": 0
}
服务级错误码参照(error_code):
错误码 | 说明 | |
---|---|---|
267501 | 网络错误 | |
267502 | videoBase64和videoUrl不可同时为空 | |
267503 | livenessType错误 | |
267504 | 身份证格式错误 | |
267505 | 姓名格式错误 | |
267506 | 请输入4位数字的数字验证码 | |
267507 | 请传入正确的动作顺序参数 | |
267508 | 其他错误 | |
267509 | 姓名和身份证号不一致,请核实后重试。(收费) | |
267510 | bestFrameNum取值在2-10范围内 | |
267511 | 未检测到闭眼动作 | |
267512 | 脸离屏幕太近 | |
267513 | 脸离屏幕太远 | |
267514 | 脸离屏幕太左 | |
267515 | 脸离屏幕太右 | |
267516 | 未检测到第一个动作 | |
267517 | 光线太暗 | |
267518 | 光线太强 | |
267519 | 未能检测到完整人脸 | |
267520 | 未检测到张嘴动作 | |
267521 | 比对失败 | |
267522 | 调用比对引擎接口出错 | |
267523 | 解密失败 | |
267524 | 文件下载失败 | |
267525 | 文件下载超时 | |
267526 | 库中无此号,请到户籍所在地进行核实 | |
267527 | 库中无此号照片,请到户籍所在地进行核实。 | |
267528 | 证件图片分辨率太低,请重新上传 | |
267529 | 检测到多张人脸 | |
267530 | 实人比对没通过 | |
267531 | 未能检测到完整人脸 | |
267532 | 传入图片过大或过小 | |
267533 | 脸部未完整露出 | |
267534 | 嘴唇动作幅度过小 | |
267535 | 视频拉取失败,请重试 | |
267536 | 视频为空,或大小不合适,请控制录制时长在6s左右 | |
267537 | 视频格式有误 | |
267538 | 视频像素太低 | |
267539 | 未检测到声音 | |
267540 | 视频声音太小 | |
267541 | 声音识别失败 | |
267542 | 人脸检测失败,无法提取比对照 | |
267543 | 活体检测没通过 | |
267544 | 疑似非真人录制 | |
267545 | 调用活体引擎接口出错 | |
267546 | 视频实人检测没通过 | |
267547 | 实人检测失败 | |
267548 | 实人检测未达到通过标准 | |
267549 | 视频录制时间过短,请录制2秒以上的视频 |
系统级错误码参照:
错误码 | 说明 | 旧版本(resultcode) | |
---|---|---|---|
10001 | 错误的请求KEY | 101 | |
10002 | 该KEY无请求权限 | 102 | |
10003 | KEY过期 | 103 | |
10004 | 错误的OPENID | 104 | |
10005 | 应用未审核超时,请提交认证 | 105 | |
10007 | 未知的请求源 | 107 | |
10008 | 被禁止的IP | 108 | |
10009 | 被禁止的KEY | 109 | |
10011 | 当前IP请求超过限制 | 111 | |
10012 | 请求超过次数限制 | 112 | |
10013 | 测试KEY超过请求限制 | 113 | |
10014 | 系统内部异常(调用充值类业务时,请务必联系客服或通过订单查询接口检测订单,避免造成损失) | 114 | |
10020 | 接口维护 | 120 | |
10021 | 接口停用 | 121 |
错误码格式说明(示例:200201):
2 | 002 | 01 | |
---|---|---|---|
服务级错误(1为系统级错误) | 服务模块代码(即数据ID) | 具体错误代码 |