最佳实践 | 用腾讯云慧眼人脸核身为诚信考试保驾护航

2022-09-21 14:23:16 浏览数 (3)

点击参与:腾讯云AI用户实践有奖征稿活动!

2020年新冠疫情爆发后,疫情之下的考试在各国均受到不同程度的影响,“延期”、“取消”、“补考”成为各国考生的“赶考”关键词,传统意义上的线下考试工作面临较大的人群聚集风险,而且十分依赖人工监考模式,人力物力成本趋高。

随之而来的是在线考试大潮来临,从校园到职场,尤其是学业考试、培训认证考试等因疫情原因都转到线上进行,各行业在线考试的需求集中爆发。而线上考试一个首要难题就是用户从平台注册到考试登陆等环节都需要实名身份核验,依赖于人工手段核验,必然占用过多人力财力。那么,有没有更智能的方式呢?

作为一名开发者,期间也有参加不少线上培训认证考试的经历,经过一番调研,从产品易用性和性价比看,发现腾讯云慧眼人脸核身在考试领域已有成熟应用,不仅可以满足考试用户身份核验,在考试过程中,如需随机抽选查看是否违规,还可以结合人脸识别等能力达到防作弊的管理。

接下来,将详细讲述我是如何使用腾讯云慧眼人脸核身能力,完成在线考试过程中用户身份核验的。

一、准备工作

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

第一步:开通人脸核身服务

我们先进入腾讯云慧眼 人脸核身控制台 ,首次使用人脸核身服务的用户,需要先开通人脸核身服务。直接点击提交申请,按照实际情况填写信息,提交申请。

特别提醒:

1. 互联网行业和金融行业必须上传业务相关营业资质。

2. 因为腾讯云E证通服务不仅支持权威库比对,还支持客户自传身份证照片,所以需要的功能组合为:活体人脸核身(完成活体检测后照片与权威库比对)和身份信息实名验证(二要素)。

第二步:业务申请

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

点击认证指引按钮进入企业账号认证指引页面,按照指引完成企业账号实名认证。

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

第三步:了解腾讯云E证通服务

首先可以在官网产品简介页面了解E证通服务的功能和优势等。

第四步:获取账号的云API密钥

我们需要个人密钥。在腾讯云访问管理的API密钥管理页面,我们新建了个人密钥。 注意:所申请的API密钥需要妥善保管。

二、接入E证通人脸核身服务

第一步:查看接入文档并选择接入方式

首先查看E证通接入文档,在左侧目录栏中可以看到E证通的接入方式有三种:E证通小程序接入、E证通小程序接入(uni-app)和E证通H5接入。其中E证通小程序接入和E证通小程序接入(uni-app)需要微信小程序支持,实现接入方小程序和eID小程序之间的交互逻辑,而H5接入方式只需要接入方后台调用E证通服务接口,就可以得到一个用户可访问的H5页面。

结合在线考试身份核验应用场景,我们选择基于H5的E证通服务进行接入。

第二步:确定交互流程

查看E证通H5接入指引我们能够知道,E证通H5接入方式需要与E证通后端接口交互两次,分别是:初始时获取EidToken和核身URL,考生完成核身流程后获取核验结果。获取核验结果又有两种方式:轮询和重定向,在这个场景下,我们选择重定向方式,时序图如下所示。

其中,接入方前端为考生个人微信,接入方服务端为我们实现的接入逻辑。整个实现流程为:

1. 给考生发放一个二维码,这个二维码指向接入方调用GetEidToken的接口 2.,考生使用微信扫描二维码后跳转到核身Url指定的核身H5页面,进行身份证OCR识别以及人脸识别身份核验 ,核身完成后自动调用RedirectUrl指定的获取核验结果的接入方后端接口 3. 由于E证通的重定向方式会自动将token作为参数传入RedirectUrl指定的接口,所以接入方获取结果的接口能够拿到token,调用E证通后端提供的GetEidResult接口,获得核验结果

通过下面这个实际使用页面中的流程图能够形象的说明这一过程。

第三步:接入实现

基于第二步的分析,我们只需要实现两个接入方后端接口即可完成对E证通H5方式的接入,同时为了实现通过扫描二维码启动身份核验,需要实现一个获取指向getToken接口的二维码的接口。 主函数中开放出三个接口,实现如下:

代码语言:javascript复制
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的实现如下:

代码语言:javascript复制
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的实现如下:

代码语言:javascript复制
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.获取二维码的接口实现代码如下:

代码语言:javascript复制
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调用范例。 首先在E证通接入页面点击“获取E证通Token”,进入接口调用说明页面。

然后在接口说明页面中选择“点击调试”,进入接口调试界面,选择语言,复制代码即可。

三、效果展示

最后我们在同一网段搭建测试环境,使得手机能够访问pc提供的服务(实际场景中将服务部署在公网即可),最后得到完整测试结果如下所示:查看视频

0 人点赞