文档中心>人脸核身>实践教程>在线考试场景身份核验实践

在线考试场景身份核验实践

最近更新时间:2022-08-24 15:54:25

我的收藏
本文档介绍如何使用腾讯云慧眼人脸核身能力,完成在线考试过程中用户身份核验的。不仅满足考试用户身份核验,在考试过程中,如需随机抽选查看是否违规,还可结合人脸识别等能力达到防作弊的管理。

准备工作

准备工作包括:开通人脸核身服务、业务申请、了解腾讯云慧眼人脸核身配置、获取账号的云 API 密钥5个步骤。

开通人脸核身服务

登录 人脸核身控制台,首次使用人脸核身服务的用户,需要先开通人脸核身服务。单击提交申请,按照实际情况填写信息即可。


说明
互联网行业和金融行业必须上传业务相关营业资质。
腾讯云 E证通服务不仅支持权威库比对,还支持客户自传身份证照片,本实例需要的功能组合为:活体人脸核身(完成活体检测后照片与权威库比对)和身份信息实名验证(二要素)。

业务申请

成功开通人脸核身服务后,进入自助接入页面。E证通服务目前只向已完成企业实名认证的腾讯云用户开发,使用服务前需要通过企业资质审核。
1. 单击认证指引按钮进入企业账号认证指引页面,按照指引完成企业账号实名认证。


2. 企业认证完成后即可进行商户 ID 申请,开启 E证通服务。



了解腾讯云 E 证通服务

可在官网产品文档中了解 E证通服务的功能和优势等,详情请参见 E证通

获取账号的云 API 密钥

在腾讯云访问管理的 API 密钥管理 页面,新建或获取个人密钥(SecretId 和 SecretKey)。
注意
获取的 API 密钥需妥善保管。




接入 E证通人脸核身服务

查看接入文档并选择接入方式

首先查看 E证通接入文档,E证通支持的接入方式有三种:E证通小程序接入、E证通小程序接入(uni-app)和 E证通 H5 接入。
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 = &merchantId
request.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.ErrCode
name := response.Response.Text.Name
if *code == 0 {
res := "认证通过,该用户是" + *name
fmt.Println(res)
fmt.Fprint(w, res)
} else {
res := "!!!认证未通过,该用户不是" + *name
fmt.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