由于不同公司对于 人脸识别的用词不一致,微信小程序背靠腾讯,因此以下的名词主要采集于腾讯云的解释
人脸识别:
主要关注人脸的检测、分析、比对等技术层面,侧重于识别个体身份的技术实现。它利用人脸检测、五官定位、人脸搜索、人脸比对、人脸验证、活体检测等功能,来判断和确认两个人脸图像是否属于同一人。
应用场景包括但不限于在线相册分类、刷脸门禁、人脸考勤、人脸登录、人脸特效、在线考试等,更多地用于便捷性和安全性提升的场景中。
人脸核身(又称人脸身份验证):
是一个更综合的概念,不仅包含了人脸识别的技术,还加入了证件OCR识别、活体检测等技术,以实现对用户身份信息的真实性验证。它是一个完整的身份认证解决方案,目的是为了确认当前用户是否为其所声称的身份。
人脸核身主要用于需要高度安全性和合规性的场景,比如金融服务、政务平台、共享出行等行业,确保用户身份的合法性,防止身份冒用。
在微信小程序中,想要实现人脸核身,无非两种解决方案
由于微信小程序的官方限制,并不是所有的微信小程序都可以使用官方提供的人脸核身功能。
现阶段微信人脸核验能力,针对小程序,开放的主体类目范围包含:
小程序一级类目 | 小程序二级类目 | 小程序三级类目 | 使用人脸核验接口所需资质 |
---|---|---|---|
物流服务 | 收件/派件 | / | 《快递业务经营许可证》 |
物流服务 | 货物运输 | / | 《道路运输经营许可证》(经营范围需含网络货运) |
教育 | 学历教育(学校) | / | (2选1):1、公立学校:由教育行政部门出具的审批设立证明 或 《事业单位法人证书》;2、私立学校:《民办学校办学许可证》与《民办非企业单位登记证书》 |
医疗 | 公立医疗机构 | / | 《医疗机构执业许可证》与《事业单位法人证书》 |
医疗 | 互联网医院 | / | 仅支持公立医疗机构互联网医院(2选1):1、卫生健康部门的《设置医疗机构批准书》;2、 《医疗机构执业许可证》(范围均需含“互联网诊疗”或名称含“互联网医院”等相关内容 |
医疗服务 | 三级私立医疗机构 | / | 仅支持三级以上私立医疗机构,提供《医疗机构执业许可证》、《营业执照》及《医院等级证书》 |
政务民生 | 所有二级类目 | / | 仅支持政府/事业单位,提供《组织机构代码证》或《统一社会信用代码证》。 |
金融业 | 银行 | / | (2选1):1、《金融许可证》; 2、《金融机构许可证》。 |
金融业 | 信托 | / | (2选1):1、《金融许可证》; 2、《金融机构许可证》。 |
金融业 | 公募基金 | / | (4选1):1、《经营证券期货业务许可证》且业务范围必须包含“基金”;2、《基金托管业务许可证》; 3、《基金销售业务资格证书》;4、《基金管理资格证书》。 |
金融业 | 证券/期货 | / | 《经营证券期货业务许可证》 |
金融业 | 保险 | / | (8选1):1、《保险公司法人许可证》;2、《经营保险业务许可证》;3、《保险营销服务许可证》;4、《保险中介许可证》;5、《经营保险经纪业务许可证》;6、《经营保险公估业务许可证》或《经营保险公估业务备案》;7、《经营保险资产管理业务许可证》 ;8、《保险兼业代理业务许可证》。 |
金融业 | 消费金融 | / | 银监会核准开业的审批文件与《金融许可证》与《营业执照》 |
金融业 | 汽车金融 | / | 仅支持汽车金融主体,同时提供:1、《营业执照》(公司名称包含“汽车金融” ;营业范围包含“汽车金融”业务);2、《金融许可证》或银保监会及其派出机构颁发的开业核准批复文件 |
交通服务 | 网约车 | 快车/专车/其他网约车 | (自营性网约车)提供《网络预约出租汽车经营许可证》。(网约车平台)提供与网约车公司的合作协议以及合作网约车公司的《网络预约出租汽车经营许可证》。 |
交通服务 | 航空 | / | (航司)提供《公共航空运输企业经营许可证》。(机场)提供《民用机场使用许可证》或《运输机场使用许可证》。 |
交通服务 | 公交/地铁 | / | 提供公交/地铁/交通卡公司《营业执照》 |
交通服务 | 水运 | / | (船企)提供《水路运输许可证》。(港口)提供《港口经营许可证》 |
交通服务 | 骑车 | / | 仅支持共享单车,提供共享单车公司《营业执照》 |
交通服务 | 火车/高铁/动车 | / | 仅支持铁路局/公司官方,提供铁路局/公司《营业执照》 |
交通服务 | 长途汽车 | / | (2选1):1、《道路运输经营许可证》(经营范围需含客运);2、官方指定联网售票平台(授权或协议或公开可查询文件)。 |
交通服务 | 租车 | / | 运营公司提供《备案证明》与对应公司《营业执照》,且营业执照中包含汽车租赁业务 |
交通服务 | 高速服务 | / | 仅支持ETC发行业务,(2选1):1、事业单位主体,需提供《事业单位法人证书》;2、官方指定的发行单位(一发单位),需提供“官方授权或协议,或公开可查询的文件”; |
生活服务 | 生活缴费 | / | (供电类)提供《电力业务许可证》与《营业执照》,且《营业执照》且经营范围含供电。(燃气类)提供《燃气经营许可证》与《营业执照》,且《营业执照》且经营范围含供气。(供水类)提供《卫生许可证》与《营业执照》。 |
IT科技 | 基础电信运营商 | / | (2选1):1、基础电信运营商:提供《基础电信业务经营许可证》;2、运营商分/子公司:提供营业执照(含相关业务范围)。 |
IT科技 | 转售移动通信 | / | 仅支持虚拟运营商,提供《增值电信业务许可证》(业务种类需含通过转售方式提供移动通信业务) |
旅游服务 | 住宿服务 | / | 仅支持酒店,提供《酒店业特种行业经营许可证》 |
商业服务 | 公证 | / | 仅支持公证处,提供《公证处执业许可证》或《事业单位法人证书》 |
社交 | 直播 | / | (2选1):1、《信息网络传播视听节目许可证》;2、《网络文化经营许可证》(经营范围含网络表演)。 |
总得来说,如果你的微信小程序主体不符合以上资质,那么你只能选择第三方的公司提供的人脸核身方案了。
活体人脸比对
传入视频和照片,先判断视频中是否为真人,判断为真人后,再判断该视频中的人与上传照片是否属于同一个人。
活体人脸核身
传入视频和身份信息,先判断视频中是否为真人,判断为真人后,再判断该视频中的人与权威库的证件照是否属于同一个人。
链接
不管是使用任何第三方的人脸核身接口,都脱离不了以下相关流程
此方案对比 客户端-第三方服务接口的主要区别是多了一层中间 后端
此时 后端 的存在主要是解决 自己业务的实际问题。如自己存储人脸相关数据,或者选择服务端接入的方式实现人脸核身。
来到此文重点讲解的部分。如你的公司或者组织符合相关资质。那么使用微信小程序-人脸核身方案会更存在优势
开通人脸核身
检测设备是否支持人脸活体检测 wx.checkIsSupportFacialRecognition(OBJECT)
接口说明和使用
OBJECT 参数说明:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
success | Function | 否 | 调用成功回调 |
fail | Function | 否 | 调用失败回调 |
complete | Function | 是 | 调用完成回调(成功或失败都会回调) |
checkAliveType | Number | 否 | 人脸核验的交互方式,默认读数字(见表 2) |
checkAliveType 的值和对应的解释:
参数 | 解释 |
---|---|
2 | 先检查是否可以屏幕闪烁,不可以则自动为读数字 |
CALLBACK 返回参数
参数 | 类型 | 说明 |
---|---|---|
errMsg | Boolean | 错误信息 |
errCode | Number | 错误码 |
回调结果说明
回调类型 | ErrCode | 说明 |
---|---|---|
sucess | 0 | 支持人脸采集 |
fail | 10001 | 不支持人脸采集:设备没有前置摄像头 |
fail | 10002 | 不支持人脸采集:没有下载到必要模型 |
fail | 10003 | 不支持人脸采集:后台控制不支持 |
回调结果说明仅对Android生效,iOS不返回errcode。
开始人脸活体检测
此时调用接口需要传递用户的姓名+身份证相关信息
(一)接口描述wx.startFacialRecognitionVerify(OBJECT)
(二)参数说明
1、OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
name | String | 是 | 姓名 |
idCardNumber | String | 是 | 身份证号码 |
success | Function | 否 | 调用成功回调 |
fail | Function | 否 | 调用失败回调 |
complete | Function | 是 | 调用完成回调(成功或失败都会回调) |
2、CALLBACK返回参数
参数 | 类型 | 说明 |
---|---|---|
errMsg | String | 错误信息 |
errCode | Number | 错误码 |
verifyResult | String | 本次认证结果凭据,第三方可以选择根据这个凭据获取相关信息 |
3、回调结果说明
示例代码
async faceAuth() { try { const res = await wx.startFacialRecognitionVerify({ name: "xxx", idCardNumber: "xxx" }) console.log(res) } catch (e) { //TODO handle the exception console.log(e.message) } }
1、业务方上传用户姓名和身份证,获取用户凭证,把凭证给到前端通过 jsapi 调用
1.2 请求URL
https://api.weixin.qq.com/cityservice/face/identify/getuseridkey?access_token={ac cess_token}
1.3 请求方式
POST
2、请求数据格式
Json { "name" : “张三”, "id_card_number" : "452122xxxxxxx43215" }
请求示例
#!/bin/bash TOKEN='xxxxxxxxxxxx' URL='https://api.weixin.qq.com/cityservice/face/identify/getuseridkey' JSON='{ "name": "张三", "id_card_number": "452344xxxxxxxxxxxxx234"}' curl "${URL}?access_token=${TOKEN}" -d "${JSON}"
参数说明
json 字段 | 中文显示 | 是否必传 |
---|---|---|
name | 姓名 | 是 |
id_card_number | 身份证号码 | 是 |
out_seq_no | 业务方唯一流水号 | 否 |
3、返回数据
参数 | 类 型 | 说明 |
---|---|---|
errcode | int | 错误码 |
errmsg | string | 错误信息 |
user_id_key | string | 用于后台交互表示用户姓名、身份证的凭证 |
expires_in | uint32 | user_id_key 有效期,过期需重新获取 |
{ "errcode" : 0, "errmsg" : "ok", "user_id_key" : "id_key_xxxx", "expires_in": 3600 }
4、后台消息推送
如果业务方传入out_seq_no,核身完成后会通过消息推送回调给业务方的服务器,如果回调业务方失败,会在5s尽力推送,超过5s不再推送。
参数说明
参数 | 类 型 | 说明 |
---|---|---|
ToUserName | string | 小程序原始ID |
FromUserName | string | 事件消息openid |
CreateTime | uint32 | 消息推送时间 |
MsgType | string | 消息类型 |
Event | string | 事件类型 |
openid | string | 核身用户的openid |
out_seq_no | string | 业务方唯一流水号 |
verify_result | string | 核身返回的加密key(凭据) |
返回示例
{ "ToUserName": "gh_81fxxxxxxxx", "FromUserName": "oRRn15NUibBxxxxxxxxx", "CreateTime": 1703657835, "MsgType": "event", "Event": "face_identify", "openid": "oRRn15NUibBxxxxxxxxx", "out_seq_no": "test1234", "verify_result": "XXIzTtMqCxwOaawoE91-VNGAC3v1j9MP-5fZJxv0fYT4aGezzvYlUb-n6RWQa7XeJpQo0teKj8mGE4ZcRe1JI3GqzADBYORBu613rKjKAFfEXTXw_bu1bs7MnmPOpguS" }
四、再次获取核验结果api
此接口是前端完成人脸核身后,基于前端返回的凭据,通过后台api再次进行核验结果和身份信息的校验,有助于提高安全性,请务必接入!
前端获取结果不可信,存在被篡改的风险,为了保障请求结果安全性,请务必对identify_ret、id_card_number_md5、name_utf8_md5字段进行校验!
(一)API说明
1、说明
人脸核身之后,开发者可以根据jsapi返回的verify_result向后台拉取当次认证的结果信息。
2、请求URL
https://api.weixin.qq.com/cityservice/face/identify/getinfo?access_token={access_token}
3、请求方式
POST
4、请求格式
json
(二)请求数据说明
1、请求
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
verify_result | String | 是 | jsapi返回的加密key(凭据) |
2、数据返回 HTTP 头如下
Date: Mon, 06 Feb 2017 08:12:58 GMT
Content-Type: application/json; encoding=utf-8
Content-Length: 85
Connection: close
json示例
{ "errcode" : 0, "errmsg" : "ok", "identify_ret" : 0, "identify_time" : 1486350357 "validate_data": "8593"
(三)返回参数说明
1、返回参数
注:errcode和identify_ret同时为0,代表本次认证成功。
参数 | 类型 | 描述 |
---|---|---|
errcode | int | 错误码, 0表示本次api调用成功 |
errmsg | string | 本次api调用的错误信息 |
identify_ret | int | 人脸核身最终认证结果 |
identify_time | uint32 | 认证时间 |
validate_data | string | 用户读的数字(如是读数字) |
openid | string | 用户openid |
user_id_key | string | 用于后台交互表示用户姓名、身份证的凭证 |
finish_time | uint32 | 认证结束时间 |
id_card_number_md5 | string | 身份证号的md5(最后一位X为大写) |
name_utf8_md5 | string | 姓名MD5 |
2、错误码对应信息
errcode | 备注 |
---|---|
84001 | 非法identity_id |
84002 | 用户信息过期 |
84003 | 用户信息不存在 |