本文档介绍如何使用腾讯云慧眼人脸核身能力,完成在线考试过程中用户身份核验的。不仅满足考试用户身份核验,在考试过程中,如需随机抽选查看是否违规,还可结合人脸识别等能力达到防作弊的管理。
准备工作
准备工作包括:开通人脸核身服务、业务申请、了解腾讯云慧眼人脸核身配置、获取账号的云 API 密钥5个步骤。
开通人脸核身服务
说明
互联网行业和金融行业必须上传业务相关营业资质。
腾讯云 E证通服务不仅支持权威库比对,还支持客户自传身份证照片,本实例需要的功能组合为:活体人脸核身(完成活体检测后照片与权威库比对)和身份信息实名验证(二要素)。
业务申请
成功开通人脸核身服务后,进入自助接入页面。E证通服务目前只向已完成企业实名认证的腾讯云用户开发,使用服务前需要通过企业资质审核。
1. 单击认证指引按钮进入企业账号认证指引页面,按照指引完成企业账号实名认证。
?
?2. 企业认证完成后即可进行商户 ID 申请,开启 E证通服务。
?
?了解腾讯云 E 证通服务
获取账号的云 API 密钥
注意
获取的 API 密钥需妥善保管。
?
?
?接入 E证通人脸核身服务
查看接入文档并选择接入方式
E证通小程序接入和E证通小程序接入(uni-app)需要微信小程序支持,实现接入方小程序和 eID 小程序之间的交互逻辑。
H5 接入方式只需要接入方后台调用 E证通服务接口,就可以得到一个用户可访问的 H5 页面。
结合在线考试身份核验应用场景,选择基于 H5 的 E证通服务进行接入。
确定交互流程
E证通 H5 接入方式需要与 E证通后端接口交互两次:
初始时获取 EidToken 和核身 URL。
考生完成核身流程后获取核验结果。
获取核验结果有两种方式:轮询和重定向。
在这个场景下,选择重定向方式,时序图如下所示:
?
?其中,接入方前端为考生个人微信,接入方服务端为我们实现的接入逻辑。整个实现流程为:
1. 给考生发放一个二维码,这个二维码指向接入方调用 GetEidToken 的接口。
2. 考生使用微信扫描二维码后跳转到核身 Url 指定的核身 H5 页面,进行身份证 OCR 识别以及人脸识别身份核验 ,核身完成后自动调用 RedirectUrl 指定的获取核验结果的接入方后端接口。
3. 由于 E证通的重定向方式会自动将 token 作为参数传入 RedirectUrl 指定的接口,所以接入方获取结果的接口能够拿到 token,调用 E证通后端提供的 GetEidResult 接口,获得核验结果。
通过下面这个实际使用页面中的流程图能够形象地说明这一过程。
?
?接入实现
基于前面的分析,我们只需要实现两个接入方后端接口即可完成对 E证通 H5 方式的接入,同时为了实现通过扫描二维码启动身份核验,需要实现一个获取指向 getToken 接口的二维码的接口。
主函数中开放出三个接口
实现如下:
func main() {// http请求路径和接口名http.HandleFunc("/gettoken", getToken)http.HandleFunc("/redirect", getResult)http.HandleFunc("/getqrcode", getQRCode)?// 在IP:Port开启服务err := http.ListenAndServe("ServerIP:Port", nil)if err != nil {fmt.Println("ListenAndServe Error:", err.Error())}}
三个 HTTP 接口的实现
1. getToken 接口: 由考生触发,调用E证通后端 GetEidToken,获取到核身 Url,考生进行刷脸认证。基于 Go 的实现如下:
func getToken(w http.ResponseWriter, req *http.Request) {credential := common.NewCredential("SecretId","SecretKey",)cpf := profile.NewClientProfile()cpf.HttpProfile.Endpoint = "faceid.tencentcloudapi.com"client, _ := faceid.NewClient(credential, "", cpf)?request := faceid.NewGetEidTokenRequest()?// 装填参数merchantId := "MerchantId"redirectUrl := "http://ServerIP:Port/redirect"request.MerchantId = &merchantIdrequest.RedirectUrl = &redirectUrl?// 发起调用response, err := client.GetEidToken(request)if _, ok := err.(*errors.TencentCloudSDKError); ok {fmt.Printf("An API error has returned: %s", err)return}if err != nil {panic(err)}// 控制前端H5页面跳转http.Redirect(w, req, *response.Response.Url, 302)}
2. getResult 接口: RedirectUrl 指定,考生在 H5 页面完成核身后,由E证通前端自动调用,传入本次核验的 token,获取核验结果。基于 Go 的实现如下:
func getResult(w http.ResponseWriter, req *http.Request) {credential := common.NewCredential("SecretId","SecretKey",)?cpf := profile.NewClientProfile()cpf.HttpProfile.Endpoint = "faceid.tencentcloudapi.com"client, _ := faceid.NewClient(credential, "", cpf)?request := faceid.NewGetEidResultRequest()// 装填参数err := req.ParseForm()if err != nil {fmt.Println(err.Error())}token, found := req.Form["token"]if !found {fmt.Println("参数解析出错")}request.EidToken = &token[0]// 发起结果查询response, err := client.GetEidResult(request)if _, ok := err.(*errors.TencentCloudSDKError); ok {fmt.Println("An API error has returned: %s", err)return}if err != nil {panic(err)}// 获取结果信息code := response.Response.Text.ErrCodename := response.Response.Text.Nameif *code == 0 {res := "认证通过,该用户是" + *namefmt.Println(res)fmt.Fprint(w, res)} else {res := "!!!认证未通过,该用户不是" + *namefmt.Println(res)fmt.Fprint(w, res)}}
3. 获取二维码的接口实现代码如下:
func getQRCode(w http.ResponseWriter, req *http.Request) {err1 := req.ParseForm()if err1 != nil {fmt.Println(err1.Error())}url := "http://ServerIP:Port/gettoken"// 设置http响应头首部行w.Header().Set("content-type", "image/png")w.Write(stringToQR(url))}?// 字符串转二维码func stringToQR(url string) []byte {res, err := qrcode.Encode(url, qrcode.Medium, 256)if err != nil {fmt.Println(err.Error())}return res}
在接入过程中,可以充分利用文档的 API 接口范例,得到对接口的调用框架代码,只需要在里面完成自己的逻辑就行。例如获取 E证通 Token 请参见 API 文档。
推荐使用 API Explorer,详细操作及说明请参见云 API 文档 使用 API Explorer。