重庆市智建筑工人
实名制管理OpenApi接口v1.0
版本 | 时间 | 变更内容 |
V1.0 | 2019-07-19 | 初始版本 |
智慧工地平台实名制人员信息采集、考勤与供应商实名制服务关系如下:
工程项目现场统一使用智慧工地app进行人员信息采集,平台提供人员信息下载接口,供各供应商实名制服务应用下载,供应商实名制应用下载后,在其应用中完成人员与考勤介质(如考勤卡,指纹、人脸识别等)绑定,现场人员实际进出场时,供应商实名制应用调用平台接收考勤数据接口,将考勤结果实时上传。
本接口包含实名制人员信息下载接口和实名制人员考勤数据上传接口。
实名制人员信息下载接口每次调用最多返回100行人员记录,同时返回记录总数和当前分页信息,当项目人员信息超过100行人员记录,需要供应商应用根据记录分页信息,分批次调用此接口直至返回该项目所有人员记录。基于安全考虑,下载的人员信息已经过脱敏处理,身份证号使用sha1算法进行加密。
考勤数据上传接口可接收设备直传数据和供应商服务器转发数据,要求设备或供应商服务器在收到考勤数据时,实时上传到平台。
数据接口采用HTTP协议,数据格式采用JSON。
智慧工地信息管理平台所有接口的权限认证都采用密钥签名的认证方式,工作原理为:在系统内生成唯一的密钥,颁发给数据采集设备或其他外部系统。外部系统获取密钥对之后妥善保存密钥,在调用接口上传数据时,外部系统使用密钥当前请求进行签名,将签名后的结果放在http请求头部与数据一起发送至监管端的数据采集接口。数据采集接口根据请求头部包含的签名信息查找对应的密钥信息,验证当前请求是否合法。
智慧工地信息管理平台中可以为获得建委授权的设备供应商或软件供应商创建密钥对,密钥主要包括以下信息:
字段名称 | 数据类型 | 描述 |
keyId | String | 授权id,全局唯一 |
keySecret | String | 密钥值,用于请求签名,不在请求中传输,需要妥善保管 |
status | String | 密钥状态,值为:ENABLED,DISABLED |
获得建委授权的设备供应商或软件供应商可以从项目上获得项目生成的密钥对,密钥主要包括以下信息:
字段名称 | 数据类型 | 描述 |
keyId | String | 授权id,全局唯一 |
keySecret | String | 密钥的值,用于请求签名,不在请求中传输,需要妥善保管 |
对设备或软件供应商进行数据授权,指定的密钥可以上传那种类型的数据。模块维度目前包括:环境数据、机械设备数据、视频监控数据三个主要分类。获得环境数据授权后可以上传扬尘、噪音数据;获得机械设备数据授权后可以上传塔吊运行数据、升降机运行数据;获得视频监控数据授权后可以进行视频的在线直播。
在调用数据接口发送数据时,需要使用密钥对请求进行签名,具体签名方式如下所示:
本次示例所用密钥对:
字段名 | 字段值 | |
供应商 | keyId | e6fe9dd5-58af-11e8-857d-00163e32d704 |
keySecret | Ny35o694RgXURrNQ7hCBbI4wyearCWxx7H4n | |
项目 | keyId | 1b0f28a4-a5a8-4ea8-ae1a-3b80d6e72397 |
keySecret | RMSRvZBhviBiWlddbXil5EqVQhkHJ0WJUbH7 |
1. 取发送请求时取服务器的UNIX时间戳(服务器时间需要提前与标准时间进行校对),例如:1526438202
2. 生成一个随机字符串,长度至少10位,由英文字符与数字组成,如:jUY9ybWcM3DH,注意随机字符串每次请求都要不同,不要在不同请求中使用相同随机字符串。
3. 使用下划线将随机字符串,时间戳与密钥(供应商密钥在前项目密钥在后)拼接为预处理字符串:
jUY9ybWcM3DH_1526438202_Ny35o694RgXURrNQ7hCBbI4wyearCWxx7H4n_ RMSRvZBhviBiWlddbXil5EqVQhkHJ0WJUbH7
4. 使用sha1 Hash算法对预处理字符串进行加密,得到的结果即为签名后的字符串:e914fed7db86318b6d8ce01a6f7cfe463c929f3d
5. 将密钥的keyId,随机字符串(rCode),计算签名时的UNIX时间戳以及签名放入http请求的头部,格式为:[供应商keyId]_[项目keyId],与数据一起发送给重庆市两江新区智慧工地信息管理平台数据接口。此时HTTP请求头中包含的签名信息如下:
keyId=e6fe9dd5-58af-11e8-857d-00163e32d704_1b0f28a4-a5a8-4ea8-ae1a-3b80d6e72397(授权id,以下划线连接,供应商的在前,项目的在后)
ts=1526438202(时间戳)
rCode= jUY9ybWcM3DH (随机字符串)
signature= e914fed7db86318b6d8ce01a6f7cfe463c929f3d(密钥签名)
接上述例子,平台收到请求后,从请求头部获取到密钥的keyId,随机串,时间戳与签名。平台鉴权计算过程如下:
1. 检查时间戳,如果时间戳小于当前时间60秒(这个值可以根据具体情况设置),则判定请求已过期,丢弃本次请求。
1. 通过密钥的keyId找到对应的密钥,按照2.3所述的方法计算签名。
2. 将计算结果与接种中的签名进行比较,如果相等则说明请求合法。
3. 记录请求日志。
5. 处理请求中上传的数据。
密钥签名方式进行接口权限认证主要有以下特点:
l 在整个请求的鉴权过程中,密钥不会随数据一起通过网络进行传输,只有监管端与数据采集与提供方知晓密钥的具体内容,只要不泄露密钥,就能保证数据传输过程的安全。
l 密钥与具体的数据结构无关,即使意外泄露,也只需要双方更新对应的密钥secret值,对已有的数据与接口无任何影响。
l 整个鉴权过程由算法控制,无需保持客户端连接与会话上下文,所有请求都是无状态的,在客户端较多的情况下能够大幅减少服务器的资源消耗,提高系统运行的效率与稳定性。
/api/open/v1/projectWorker
请求方法
GET
URL参数
参数名称 | 值类型 | 是否必输 | 说明 |
page | Int | 否 | 请求页面,首次请求可以不传,page从0开始计算, 首页page=0,第二页page=1,依次类推 |
{ "code": "0", "message": "操作成功", "content": [ { "areaId": "500120", "rootId": "500000", "projectId": "f893095a-64e4-11e9-892f-b8ca3afa96a4", "workerId": "689270c5-b978-4278-b9e4-1da6350f5273", "workerName": "xxx", "workerIdNo": "5001****311X", "workerIdNoCoded": "655e368ed3e30055a4173bdc6d05f26d8b6248d0", "workerGender": "MALE", "workerHeaderImage": "http://www.sample.com/image/045cfe94-9e64-4b6b-b227-31203223c63f.png", "workerNation": "汉", "corp": { "id": "b3415d99-f37b-4658-b1b3-03d962afb120", "code": "000", "name": "xxx" }, "workerType": { "id": "f6ef524a-4c22-11e7-b876-00163e32d704", "code": "010", "name": "砌筑工" }, "workPost": { "id": "1a819b50-6b9c-4987-9c24-88c2cd2823ff", "code": "P010", "name": "甲方代表" }, "workerCategory": "M", "workerGroup": { "id": "da5179c1-95c0-4b7b-9985-c7eb55223478", "code": null, "name": "普通工班组" }, "entryStatus": "Entry", "joinDate": 1558111885000, "leaveDate": null, "mode": "RnCard", "attendanceCard": { "id":"caf64b97-037d-4390-8cac-d18b3955507e", "cardNumber":"07346338", "cardType":"RFID", "issueCardDate":1558111885000, "issueCardPic":"xxxxx", }, "laborCompany": { "id": "b3415d99-f37b-4658-b1b3-03d962afb120", "code": "000", "name": "xxx" }, "updatedAt": 1558686577445, "groupLeader": false } ], "page": { "size": 100, "totalElements": 101, "totalPages": 2, "number": 1 } } |
返回值说明:
字段名(父级) | 字段名(子级) | 数据类型 | 说明 |
code | String | 状态代码 | |
message | String | 描述 | |
content | 数组 | 返回结果记录列表,数组格式 | |
areaId | String | 区域ID | |
rootId | String | 省级ID | |
projectId | String | 项目ID | |
workerId | String | 人员ID | |
workerName | String | 人员名称 | |
workerIdNo | String | 身份证(掩码显示) | |
workerIdNoCoded | String | 身份证sha1加密 | |
workerGender | String | 性别: MALEL:男 FEMALE:女 | |
workerHeaderImage | String | 头像图片URL | |
workerNation | String | 民族 | |
workerCategory | String | 人员类别: M:管理人员 W:作业工人 | |
corp.id | String | 所属企业ID | |
corp.code | String | 企业编码 | |
corp.name | String | 企业名称 | |
workerType.id | String | 工种ID | |
workerType.code | String | 工种编码 | |
workerType.name | String | 工种名称 | |
workPost.id | String | 岗位ID | |
workPost.code | String | 岗位编码 | |
workPost.name | String | 岗位名称 | |
workerGroup.id | String | 班组ID | |
workerGroup.code | String | 班组编码 | |
workerGroup.name | String | 班组名称 | |
entryStatus | String | 人员状态: Exit:离职 Locked:禁入 | |
joinDate | Long | 入职时间 | |
leaveDate | Long | 离职时间 | |
mode | String | 考勤方式: Face:人脸识别 Eye:虹膜识别 Finger:指纹识别 Hand:掌纹识别 IDCard:身份证识别 RnCard:实名卡 Error:异常清退 Manuel:一键开闸 ExitChannel:应急通道 QRCode:二维码识别 App:APP考勤 Other:其他方式 | |
attendanceCard.id | String | 考勤卡ID | |
attendanceCard.cardNumber | String | 考勤卡号 | |
attendanceCard.cardType | String | 考勤卡类别 | |
attendanceCard.issueCardDate | Long | 制卡时间 | |
attendanceCard.issueCardPic | String | ||
laborCompany.id | String | 劳务公司ID | |
laborCompany.code | String | 劳务公司编码 | |
laborCompany.name | String | 劳务公司名称 | |
updatedAt | Long | 最后更新时间 | |
groupLeader | Boolean | 是否班组长 | |
page | 分页信息 | ||
size | Int | 每页记录数 | |
totalElements | Int | 总记录数 | |
totalPages | Int | 总页数 | |
number | Int | 当前页,首页number=0,第二页number=1,依次类推 |
代码值 | 说明 |
0 | 执行成功 |
1 | 参数格式错误 |
2 | 数据错误 |
3 | 未授权 |
4 | 系统异常 |
/api/open/v1/attendance
POST
1. 请求体
[ { "workerId":"013b0bcc-5d8a-4365-a3bb-b9eb8cd59ea0", "idNumber":"5001****311X ", "entry":"Entry", "mode":"App", "photo":"", "attendanceTime":"2018-05-16 13:30:20", "sn":"考勤设备序列号", "lat":0, "lng":0 } ] |
请求体数据说明:
字段名(父级) | 数据类型 | 是否必输 | 说明 |
workerId | String | 是 | 人员id,以下载的人员信息id为准 |
idNumber | String | 否 | 身份证 |
entry | String | 是 | 进出场标识: Entry:进场 Exit:出场 |
mode | String | 是 | 考勤方式: Face:人脸识别 Eye:虹膜识别 Finger:指纹识别 Hand:掌纹识别 IDCard:身份证识别 RnCard:实名卡 Error:异常清退 Manuel:一键开闸 ExitChannel:应急通道 QRCode:二维码识别 App:APP考勤 Other:其他方式 |
photo | String | 否 | 考勤照片url地址,当考勤方式为人脸识别时,不可为空 |
attendanceTime | DateTime | 是 | 考勤时间 |
sn | String | 否 | 考勤设备序列号,当考勤方式为app时可以为空,其他方式不可为空 |
lat | Double | 否 | 经度 |
lng | Double | 否 | 纬度 |
{ “code”:”1”, “message”:”数据错误”, “content”:{ “第1行:workerId错误” } } |
返回值说明:
字段名(父级) | 说明 |
code | 状态代码 |
message | 描述 |
content |
代码值 | 说明 |
0 | 执行成功 |
1 | 参数格式错误 |
2 | 数据错误 |
3 | 未授权 |
4 | 系统异常 |
部分内容由用户投稿或者来源于网络,如有侵权,请联系底部邮箱进行删除!非常感谢您的支持!