项目开发中用到了腾讯人脸验证的模块,中间也踩了一些坑,这里发帖记录一下,留待自己后续查验。
首先说后端,这里用java开发的,官方的文档地址是:人脸核身 实名核身鉴权 - API 文档 - 文档中心 - 腾讯云
需要引入的库
com.tencentcloudapi tencentcloud-sdk-java 3.1.62
具体的业务场景是,小程序调用后端的请求biztoken接口,后端通过调用腾讯的
faceid.tencentcloudapi.com接口获取biztoken,然后把biztoken返回给前端,前端通过这个值来调用人脸服务(具体下面讲),验证完成后sdk也会返回一个biztoken,前端拿到这个biztoken之后再传给后端,后端调用
faceid.tencentcloudapi.com 接口获取实名信息的认证结果,然后根据结果再插入具体的业务逻辑。
具体代码如下
/** * 腾讯云人脸核身 服务端接入 */ public class TencentCloudWxUtil { //------------------------测试--Begin------------------------- //个人密钥id private static String secretId = "在腾讯云获取的值"; //个人密钥key private static String secretKey = "在腾讯云获取的值"; //业务id(用于细分客户使用场景) private static String ruleId = "1"; //指定拉取的结果信息,取值(0:全部;1:文本类;2:身份证正反面;3:视频最佳截图照片;4:视频) private static String InfoType = "0"; public static void main(String [] args) { try { detectAuth("要查询的身份证号码","姓名"); } catch (Exception e) { e.printStackTrace(); } } //------------------------测试--End------------------------- /** * @Title 实名核身鉴权 * @description * @Param idCard(身份证 必填),name(姓名 必填) * @author ll * @return {"Url":"","BizToken":"","RequestId":""} * @version 1.0 * @time 2020年7月23日 12:13:01 */ public static DetectAuthResponse detectAuth(String idCard,String name) throws Exception{ DetectAuthResponse resp = new DetectAuthResponse(); try { Credential cred = new Credential(secretId,secretKey); HttpProfile httpProfile = new HttpProfile(); httpProfile.setEndpoint("faceid.tencentcloudapi.com"); ClientProfile clientProfile = new ClientProfile(); clientProfile.setHttpProfile(httpProfile); FaceidClient client = new FaceidClient(cred,"ap-nanjing",clientProfile); //转为json字符串 JSONObject requestBody = new JSONObject(); requestBody.put("RuleId",ruleId); requestBody.put("IdCard",idCard); requestBody.put("Name",name); String params = JSONObject.toJSONString(requestBody); DetectAuthRequest req = DetectAuthRequest.fromJsonString(params,DetectAuthRequest.class); resp = client.DetectAuth(req); System.out.println("返回结果:==" + DetectAuthResponse.toJsonString(resp)); } catch (TencentCloudSDKException e) { System.out.println(e.toString()); } return resp; } /** * @Title 获取实名核身结果信息 * @description * @Param bizToken(人脸核身流程的标识,调用DetectAuth接口时生成。 必填) * @author lulin * @version 1.0 * @time 2020年7月23日 12:13:01 */ public static GetDetectInfoResponse getDetectInfo(String bizToken) throws Exception{ GetDetectInfoResponse resp = new GetDetectInfoResponse(); try { Credential cred = new Credential(secretId,secretKey); HttpProfile httpProfile = new HttpProfile(); httpProfile.setEndpoint("faceid.tencentcloudapi.com"); ClientProfile clientProfile = new ClientProfile(); clientProfile.setHttpProfile(httpProfile); FaceidClient client = new FaceidClient(cred,"ap-nanjing",clientProfile); //转为json字符串 JSONObject requestBody = new JSONObject(); requestBody.put("RuleId",ruleId); requestBody.put("BizToken",bizToken); requestBody.put("InfoType",InfoType); String params = JSONObject.toJSONString(requestBody); GetDetectInfoRequest req = GetDetectInfoRequest.fromJsonString(params,GetDetectInfoRequest.class); resp = client.GetDetectInfo(req); System.out.println("返回结果:==" + GetDetectInfoResponse.toJsonString(resp)); } catch (TencentCloudSDKException e) { System.out.println(e.toString()); } return resp; } }
核心的代码就这2个,具体的业务逻辑自己完善
前端开发框架用的是uniapp,和官网的用法有很大区别,中间有好几个坑,也是网上一位大佬提供的解决方案,具体的地址如下
https://segmentfault.com/a/1190000020102601?utm_source=tuicool&utm_medium=referral
找了很多方法发现就是这个最靠谱,这里怕以后遗失,再次记录下详细的步骤
不是所有的企业都能够申请的,需要符合以下行业要求的客户才能申请
政务:政府机构或事业单位
金融:银行、保险
医疗:公立医疗机构
运营商:电信运营商
教育:公立教育机构
交通:航空、客运、网约车、交通卡、共享交通、轨道交通、租车
旅游:酒店
物流:快递、邮政、物流
由于SDK会调用小程序原生的wx.startFacialRecognitionVerify
方法,所以总共得申请2个服务
SDK服务:申请人脸核身服务
小程序:查看申请流程(需要发送邮件申请,使用该服务的小程序的appid,后面开发也是用的这个)
重要的事情说3遍
以上这2个服务都需要申请,缺一不可。
以上这2个服务都需要申请,缺一不可。
以上这2个服务都需要申请,缺一不可。
由于不是我申请的,所以怎么下载我也不知道,听群里的人说的是SDK腾讯云下发给客户的。
参考腾讯云文档的接入方法:https://cloud.tencent.com/document/product/1007/31071
文档是针对原生小程序写的,所以页面引入的方法有所不同
由于uni-app不支持直接引入小程序的原生页面,所以这里能想到的就是将它当作成一个微信小程序的组件,然后uni-app的页面引入这个组件
在uni-app项目中新建wxcomponents
目录,将SDK解压后放到该目录pages.json
中globalStyle
中全局引入小程序的组件,注意引用的路径
"usingComponents": { "verify-mpsdk": "/wxcomponents/verify_mpsdk/index/index" }
pages
中新建人脸核身的页面face
(名字可以随意,根据自己的需要起名,图在上面),pages.json
中配置页面(图在上面)face
页面中引入verify-mpsdk
组件
最终的人脸核身的页面访问就是/pages/face/face
在需要的页面初始化SDK,如有个页面需要点击按钮进行人脸核身,就在这个页面进行初始化。
这个直接照着文档快速入门
中的来就行了,这里就直接使用uni-app默认的index
页面,
适当修改下即可,大概代码如下:
================注意,这里有个问题特别要注意一下===================
调用 wx.startVerify方法需要修改sdk里面的main.js的里面的一个跳转路径verify_mpsdk/index/index改成你自己的页面路径,我这里和原文档一样pages/face/face,要不然执行
wx.startVerify方法会报错,跳转不过去
================注意,这里有个问题特别要注意一下===================
注意下这里的BizToken
,需要调用后端服务接口来获取,
需要后端的同学调用腾讯云提供的DetectAuth来返回前端需要的BizToken
,
调试开发阶段我们可以先通过腾讯云提供的工具
API 3.0 Explorer
直接来获取这个BizToken
如果服务申请成功后控制台一般能找到SecretId
,SecretKey
,RuleId
注意Endpoint
和Region
选择的地区得保持和申请时选择的地区一致。
填写完成后点击在线调用
中的发送请求
按钮,如果填的都对的话返回信息里面会有BizToken
拿到BizToken
后就可以直接使用了,修改下上面的代码:
xxxxxxxxxxxxxxxxx就是拿到的BizToken
this.BizToken = 'xxxxxxxxxxxxxxxxx' // 这里需要我们去客户后端调用DetectAuth接口获取BizToken
上面都做完后就可以进行调试了
需要先在项目中manifest.json
中配置上小程序的appid,这个appid就是上面申请服务
中的appid,不然无法开启调试。
然后运行到微信开发工具(这里就不多说了),如果提示不是开发人员,就让该appid的管理员将你加到开发组里面就行了。
运行成功后点击开发者工具的真机调试,扫描二维码开启真机调试模式。
接下来就是踩坑了,会出现各种问题。
这里开发者工具里面都是显示正常的,不会报这个错,
手机扫码进入调试后控制台会出现这个报错,
提示组件找不到,但是我们的路径都是对的,Component is not found in path "wxcomponents/verify_mpsdk/index/index"
问题出在这里将verify_mpsdk
当成自定义组件了,
小程序自定义组件引入的时候需要在文件JSON中指定"component": true
找到wxcomponents\verify_mpsdk\index\index.json
文件,加入"component": true
即可
重新开启调试扫码后上面的报错就没了。
点击按钮调用gotoVerify
后会报一个页面找不到的错navigateTo:fail page "verify_mpsdk/index/index?isNotice=false" is not found
SDK默认的是跳转验证页面的地址是verify_mpsdk/index/index
,
文档找了半天也没找到相应的配置地址,最后在SDK里面搜索找到了这个地址。
所以只需要把这个地址改成我们所需要的地址就行了。
找到wxcomponents\verify_mpsdk\main.js
,里面搜索verify_mpsdk/index/index
,
找到后修改成上面人脸核身页面
的地址pages/face/face
保存后重试就能跳转到人脸核身的页面了。
进入人脸核身的页面后会发现啥操作都没,控制台也没报错,
一度认为我自己弄的有问题,搞了好久也没弄好,也提了个工单(腾讯云工单反馈率还是很快的,几分钟后就有人回复了,这点赞一个),
将代码和相关操作在工单里描述了下,对方也觉得的没问题,按照快速入门的代码应该是没问题的,对方也没找到啥问题,就让我加了一个腾讯云慧眼小助手的微信,
本想着下午加人家看看啥问题的,中午吃完饭闲着的时候将SDK里面的文件都格式化后终于在index.js
里面找到问题所在了。wxcomponents\verify_mpsdk\index\index.js
文件中有个onLoad
生命周期,
正常原生微信小程序进入到这个页面的时候会执行onLoad
里面的代码,
但是我们上面将这个SDK当作是一个自定义组件了,
在uni-app中组件是不存在onLoad
这个生命周期的,这个是页面所属的生命周期。
找到问题所在就好解决了,我们可以在人脸核身的页面pages/face/face
手动执行onLoad
修改下pages/face/face
的代码,如下:
保存后重试,就能正常显示了
点击快速验证进入下一步及后面的步骤的时候发现,页面的图片都挂掉了不显示,
一开始我一直用的真机调试,页面上也不会出现破图,控制台也不会报图片异常的错误,
导致我不知道怎么进行拍摄身份证,以为会自动识别身份证然后自动下一步,
最后在开发者工具里面跑了一遍才知道是图片找不到了,然后拍照的图片按钮自然也就显示不了了。
最后在SDK里面搜索/verify_mpsdk/images
,在下面文件中找到关键词,wxcomponents\verify_mpsdk\templates\ocr\ocr.wxml
既然这种形式导致运行的时候图片找不到,我们可以把SDK所用的图片都复制到项目的static
目录里
在static
中新建verify_mpsdk
目录,将SDK中的图片即wxcomponents\verify_mpsdk\images
复制到static\verify_mpsdk
中,最终形成以下目录形式
最后将wxcomponents\verify_mpsdk\templates\ocr\ocr.wxml
中的/verify_mpsdk/images
批量替换成/static/verify_mpsdk/images
后重试即可,然后就都正常了。
最后用真机调试完整跑一把
备注:如果最上面的 wx.startFacialRecognitionVerify
服务没有申请到此时点击下一步的会弹出一个无权限的弹窗无法进行下一步
这里就是活体人脸检测了,需要将脸对准框框,点击开始后需要读几个数字,
最后验证通过后会回到之前的页面(调用gotoVerify()方法的页面),
验证成功后,会拿到一个BizToken
,
可以在wx.startVerify
回调函数success
中打印自行查看。
拿到BizToken
后可以调用后端的接口,后端通过调用 GetDetectInfo 接口获取并返回本次核身的详细信息,包括身份证上的信息和身份证证图片等信息。
前端拿到这些信息后根据自己的程序需要做处理。
整合过程中遇到不少问题,百度加google也找不到相关的详细信息,
人脸核身的相关文档都很简单,出现问题后无从下手,只能慢慢自己摸索解决了,
最后写篇文章记录下整个过程,也能帮到后面需要集成这个SDK的朋友们。