创建应用需先绑定您的手机, 以便出现任何产品或技术问题时我们能够及时联系 开发者云扣将严格保护开发者的隐私 |
本文档主要对recog 云平台API接口进行说明,方便SDK的接入, 目前API暂时只支持可见光人脸识别,其它识别会在后续版本中支持
1、特征结构
一个能够描述生物特征的特征组合体,此特征结构会在客户不断的身份认证中发生内容更新,但是结构不会变化。
2、认证
比较提交的生物特征样本和引用对象总体的一对多的过程,确定提交的生物特征样本和引用对象总体中的参考模板是否匹配,
来确定所匹配的模板的注册者的身份。
3、验证
比较一个提交的生物特征样本和一个生物特征参考模板,来确定提交的生物特征样本和参考模板是否匹配的一比一的过程。
4、活体识别
通过人机交互识别技术、频阈技术来对个体进行分析,从而能够给出当前个体是照片、
视频流、三维模型、真皮面具和真人的过程;针对的仅是人脸识别。
5、阈值
建立相似度或相关性(即分数)的预定义值,用于认定一个生物特征样本和一个生物特征参考模板是否匹配。
6、 生物特征
基于行为和生物特征的自动个体识别。
7、生物特征传感器
用来从个体采集原始生物特征样本的设备。
8、生物特征模板
适合于存储的生物特征样本或者生物特征样本的集合,作为后续匹配的参考。
缩写、术语 | 解 释 |
---|---|
Recog | 云扣生物识别认证云平台 |
FMR | 认假率/错误匹配率(False Match Rate) |
FNMR | 拒真率(False Non-Match Rate) |
EER | 相等错误率(Equal Error Rate) |
BSP | 生物特征服务提供者(Biometric Service Provider) |
AE | 认证的加密(Authenticated Encryption) |
DSA | 数据签名算法 |
HMAC | 基于哈希的消息认证码 |
IV | 初始向量(Initialization Vector) |
MD5 | 消息摘要5(Message Digest 5) |
PKCS | 公钥密钥标准(Public Key Cryptography Standards) |
SHA | 安全哈希算法(Secure Hash Algorithm) |
UUID | 通用唯一标识符,(Universally Unique Identifier (UUID)) |
提供开放式rest风格的http web调用。每个调用都要首先获取一个云平台API key的许可及对应的secret key 签名调用示例,比如要创建一个组,则如下方式(示例为get方式 ,post方式同样适用)
http调用如下: /Group/create?apiKey=test111&groupName=df&groupDesc=888&apiSign=4B3D74FA5D19CF36B5576C697A157F8D4FD91576
其中apiKey是为你在云平台申请的key(上边示例中对应的密码key 为11111111111111 ),每次调用必填。
apiSign为对每个调用请求参数按字母升序排序后将参数名与参数值拼接在一起加上apiKey申请时获得的私密Key,
再进行SHA1 签名生成并转换成16进制大写字母,再将该参数加入到请求参数中去.服务端java签名生成算法示例代码如下:
说明:paramMap 为存放上传参数映射 (对于http二进制上传时的文件型表单参数目前不计算在内的)
原型: Map
对于数组类型参数,需要将参数行归并到一个Key下,比如:
http参数有:a=1&a=2&a=3则 需签名时 转换为 a=[1,2,3]
(java的话就是Arrays.toString()方法,云平台端服进行参数签名时的预处理java代码如下:
/********************获取所有参数列表(注意,http二进制文件上传时文件参数是不会在其中的**************/
Enumeration pNames = request.getParameterNames();
while (pNames.hasMoreElements()) {
String name = (String) pNames.nextElement();
String[] values = request.getParameterValues(name);
if (values != null && values.length > 1) { // 数组型
paramMap.put(name, Arrays.toString(values)); //数组型的参数将参数内容合
} else if (values != null) {
paramMap.put(name, values[0]);
}
// System.out.println(name+"="+paramMap.get(name));
}
/****************************以上为参数预处理部分*******************/
/**********************签名生成部分************************/
//参数取参数名再按照字母升序重新排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray);
// 拼接有序的参数名-值串
StringBuilder stringBuilder = new StringBuilder("");
for (String key : keyArray)
{
stringBuilder.append(key).append(paramMap.get(key)); //拼接
}
stringBuilder.append(secretKey);//加上私密Key
String codes = stringBuilder.toString();
System.out.println(codes); //
String sign = DigestUtils.sha1Hex(codes).toUpperCase(); //SHA1签名
RETURNID | 描述 | 备注 |
---|---|---|
0 | 成功 | |
100 | 输入参数非法 | 多半是要求是数字却输入字符之类的 |
101 | API Key验证错误 | APIkey非法,系统中不存在或它的签名不对 |
102 | 数据库更新操作异常 | E.g. 主外键,唯一性等.. |
103 | 上传文件图片总大小超限 | |
104 | 请求操作不允许或找不到对应信息 | E.g. 人员ID不存在或不属于当前APIKey |
105 | 超过最大允许图片 | 每个人员模板对应的图片数量有限 |
106 | 未找到人员对应的特征模板信息 | |
201 | 当前无可用socket计算单元节点 | |
202 | 不支持的算法类型 | 目前暂时只支持人脸部分(即可见光照片) |
-999 | 目前未能定义的错误 | 多半系统非正常状态(如数据库连接),数据结构不全导致,多数情况下表现为Null异常 |
后续其它 | 需着接口功能增加,业务增加再定义 |
RETURNID | 描述 | 备注 |
---|---|---|
0 | 成功 | |
1 | 算法类型参数不合法 | |
2 | 功能号参数不合法 | |
3 | 特征组数量不合法 | |
4 | 特征组数据不合法 | |
5 | 特征组2数量不合法 | |
6 | 特征组2数据不合法 | |
7 | 图像组数量不合法 | |
8 | 图像组数据不合法 | |
9 | 图像组2数量不合法 | |
10 | 图像组2数据不合法 | |
11 | 其他 | |
-1 | 人脸检测失败 | 算法返回错误 |
-2 | 人眼检测失败 | 算法返回错误 |
-3 | 抽取特征失败 | 算法返回错误 |
-4 | 比对失败 | 算法返回错误 |
-5 | 其他 | 算法返回错误 |
接口分类 | 接口名称 | 功能说明 |
---|---|---|
Group | /Group/create | 创建组 |
/Group/delete | 删除一个指定 | |
/Group/edit | 更新组信息 | |
Person | /Person/create | 创建人员信息 |
/Person/edit | 修改人员信息 | |
/Person/get | 查询人员信息 | |
/Person/delete | 删除人员信息 | |
Feature | /Feature/addPicSet | 在人员添加一组图片集合并提取特征信息保存 |
/Feature/deletePics | 删除人员下的一张或几张照片 | |
/Feature/deleteAllPics | 删除个人下的所有照片 | |
/Feature/picState | 查询人员建模状态 | |
Recognition | /Recognition/compareByPic | 比较两张图片是否为同一人 |
/Recognition/compareByPerson | 比较两个人否为同一人 | |
/Recognition/verifyByPic | 判定一张图片是否属于一个 | |
Info (后续即将开放 | /Info/getGroupList | 查询当前apiKey下的组 |
/Info/getPersonList | 查询当前apiKey下的人员信息 | |
/Info/getPicList | 查询指定人员下的图片列表 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
groupName | String | 组合名称 |
groupDesc | String | 组合描述 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"success","data":groupId} | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
data | int | 新建组合ID |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
groupId | Int | 组合Id |
groupName | String | 组合名称 |
groupDesc | String | 组合描述 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess"} | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
groupId | int | 组合ID |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess"} | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
说明:暂时不支持级联删除,如果组合下还存在人员信息,是会删除失败 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
groupId | int | 所属组合ID |
personName | string | 姓名 |
identifyCard | string | 公民身份号码 |
cardType | int | 证件类型 0--二代身份证 1-- 一代身份证,默认0 |
sex | int | 性别 |
personNation | int | 民族 |
phoneNo | int | 联系方式 |
int | QQ号码 | |
weixin | string | 微信号 |
address | string | 住址信息 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"success","data":personId} | ||
resultCode | int | 处理返回值 |
message | string | 处理描述 |
(d) 返回业务数据 | ||
personId | int | 人员ID |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
personName | string | 姓名 |
sex | int | 性别 |
personNation | int | 民族 |
phoneNo | int | 联系方式 |
int | QQ号码 | |
weixin | string | 微信号 |
address | string | 住址信息 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess"} | ||
resultCode | int | 处理返回值 |
message | string | 处理描述 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess"} | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess"} | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
groupId | Int | 组合Id |
personName | String | 姓名 |
identifyCard | String | 公民身份号码 |
cardType | int | 证件类型 0--二代身份证 1-- 一代身份证,默认0 |
sex | int | 性别 |
personNation | int | 民族 |
phoneNo | int | 联系方式 |
int | QQ号码 | |
weixin | String | 微信号 |
address | String | 住址信息 |
face | int | 人脸建模状态 1建模,0未建模 |
fingervein | int | 指静脉建模状态 1建模,0未建模 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
bioType | int | 生物识别算法类型,目前仅支持可见光照片 类型为1 |
base64Pics | String[] | 图片文件内容base64编码 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess" "data":{"total":picNum,"detail":{"0":0,"1":1,"2":1}} |
||
resultCode | int | 处理返回值 |
message | string | 处理描述 |
(d) 返回业务数据 | ||
total | int | 当前用户已经上传的图片数,调用都如何得知当前上传的图片id呢,很简单,从总数往后数成功的图片数,再按上传顺序的一一对应 |
detail | String | Json结构,前面的表示上传的图片顺序号,后 面值表示建模结果0--失败,1--成功 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
picIds | String | 图像编号,表示删除当前第x张图片 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"success"} | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
bioType | int | 目前只能为1--可见光,人脸 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"success"} | ||
(d) 返回业务数据 | ||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"success"} | ||
resultCode | int | 处理返回值 |
message | string | 处理描述 |
(d) 返回业务数据 | ||
face | int | 人脸可见光建模状态:1建模,0未建模 |
fingerprint | int | 指纹建模状态:1建模,0未建模 |
fingervein | int | 指静脉建模状态:1建模,0未建模 |
palmvein | int | 掌静脉建模状态:1建模,0未建模 |
voiceprint | int | 声闻建模状态:1建模,0未建模 |
facenir | int | 人脸近红外建模状态:1建模,0未建模 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 请求报文体 | ||
base64Pic1 | String | 图像1base64内容 |
base64Pic2 | String | 图像2 base64内容 |
bioType | int | 目前只能为1--可见光,人脸 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"success","data": {"avg":xx.xx,"max":xx.xx",min:" xx.xx"} |
||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
(d) 返回的业务数据 | ||
avg | float | 平均分 |
max | float | 最高分 |
min | float | 最小 |
threshold | float | 阈值 |
recogresult | int | 是否本人:1是,0不是 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 请求报文体 | ||
personId1 | int | 人员ID |
personId2 | int | 人员ID |
bioType | int | 生物识别算法类型 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess","data": {"avg":xx.xx,"max":xx.xx",min:" xx.xx"} |
||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
(d) 返回的业务数据 | ||
avg | float | 平均分 |
max | float | 最高分 |
min | float | 最小 |
threshold | float | 阈值 |
recogresult | int | 是否本人:1是,0不是 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 请求报文体 | ||
base64Pic | String | 图像base64 |
personId | int | 人员ID |
bioType | int | 生物识别算法类型 |
(c) 返回http body(json结构) | ||
{"resultCode":0,"message":"sucess","data": {"avg":xx.xx,"max":xx.xx",min:" xx.xx"} |
||
resultCode | int | 处理返回值 |
message | String | 处理描述 |
(d) 返回的业务数据 | ||
avg | float | 平均分 |
max | float | 最高分 |
min | float | 最小 |
threshold | float | 阈值 |
recogresult | int | 是否本人:1是,0不是 |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
groupId | int | 分组ID,可选 |
groupName | string | 分组名称,可选 |
groupDes | string | 分组描述,可选 |
pageNo | int | 查询页数,默认第1页,可选 |
pageSize | int | 页面大小,默认20条记录,可选 |
(c) 返回http body(json结构) | ||
{"data":["apiKey":"test111", "createDate":1438790400000}],"resultCode":0,"message":"success"} |
||
resultCode | int | 处理返回值0--成功 |
message | String | 处理描述 |
(d) 返回的业务数据 | ||
data | Json结构 | 主要是组合信息对象的字段 (名称,描述,组合id) |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
groupId | int | 人员所属组合id,可选 |
pageNo | int | 查询页数,默认第1页,可选 |
pageSize | int | 页面大小,默认20条记录,可选 |
(c) 返回http body(json结构) | ||
{"data":
[{"sex":0,"personId":65,"groupId":64,"identifycard":"430121198902271032", "apiKey":"test111","cardType":0,"personName":"wendell", "personNati":null,"phoneNo":null,"qq":0,"weiXin":null,"address":null}], "resultCode":0,"message":"success"} |
||
resultCode | int | 处理返回值 0--成功 |
message | String | 处理描述 |
(d) 返回的业务数据 | ||
data | Json结构 | 主要是人员信息对象的字段 (姓名,联系号码,qq,身份证,所属组合id等. |
参数名 | 类型 | 说明 |
---|---|---|
(a) 基础参数 | ||
apiKey | string | |
apiSign | string | |
(b) 业务部分参数 | ||
personId | int | 人员ID,必须 |
bioType | int | 算法类型,1--可见光 |
(c) 返回http body(json结构) | ||
{ "data" : { "0" : "/", "1" : "/" }, "message" : "sucess", "resultCode" : 0 } |
||
resultCode | int | 处理返回值 0--成功 |
message | String | 处理描述 |
(d) 返回的业务数据 | ||
data | Json结构 | 主要包括图片的base64内容,对应当前编号等 |
名称 | 值 | 描述 |
---|---|---|
证件类型 | 0 | 二代身份证 |
1 | 一代身份证 | |
2 | 护照 | |
3 | 港澳台 | |
4 | 军官证 | |
5 | 其他 | |
性别 | 0 | 男 |
1 | 女 | |
9 | 未知 | |
生物照片类型 | 1 | 可见光图片 |
2 | 近红外图片 | |
3 | 指静脉图片 | |
6 | 指纹图片 |