h5接入腾讯云人脸核身

一.自助接入步骤。 

1.登录腾讯云开通人脸核身服务。 

 2.选择微信h5。

3.填写用户授权信息,选择对比源。

4.在调用实名核身鉴权接口时,必须传入认证人姓名和身份证号。

5.配置结果。

二.时序图

三.后端接口

 service

package com.ynfy.buss.exam.faceverify.service.impl;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.faceid.v20180301.FaceidClient;
import com.tencentcloudapi.faceid.v20180301.models.*;
import com.ynfy.buss.exam.faceverify.service.IFaceVerifyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Objects;


/**
 * @Description: 人脸核验
 * @Author: yangfeng
 * @Date: 2024-04-01
 * @Version: V1.0
 */
@Slf4j
@Service
public class FaceVerifyServiceImpl implements IFaceVerifyService {

    @Value("${tencent.cloud.faceApi}")
    private String faceApi;

    @Value("${tencent.cloud.secretId}")
    private String secretId;

    @Value("${tencent.cloud.secretKey}")
    private String secretKey;

    @Value("${tencent.cloud.ruleId}")
    private String ruleId;

    @Value("${tencent.cloud.redirectUrl}")
    private String redirectUrl;

    /**
     * 实名核身鉴权
     *
     * @return
     */
    @Override
    public DetectAuthResponse detectAuth(String examId, String realName, String idCard, String imageBase64) {
        DetectAuthResponse resp = null;
        try {
            Credential cred = new Credential(secretId, secretKey);
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(faceApi);
            httpProfile.setConnTimeout(10); // 请求连接超时时间,单位为秒(默认60秒)
            httpProfile.setWriteTimeout(10);  // 设置写入超时时间,单位为秒(默认0秒)
            httpProfile.setReadTimeout(10);
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            FaceidClient client = new FaceidClient(cred, "", clientProfile);
            DetectAuthRequest req = new DetectAuthRequest();
            req.setRuleId(ruleId);
            req.setIdCard(idCard);
            req.setName(realName);
            req.setImageBase64(imageBase64);
            req.setRedirectUrl(redirectUrl + examId + "&isNeedFaceDetect=" + true);
            resp = client.DetectAuth(req);
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
        return resp;
    }


    /**
     * 获取实名核身结果信息
     *
     * @param bizToken
     * @return
     */
    @Override
    public GetDetectInfoEnhancedResponse getDetectInfo(String bizToken) {
        GetDetectInfoEnhancedResponse resp = null;
        try {
            Credential cred = new Credential(secretId, secretKey);
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(faceApi);
            httpProfile.setConnTimeout(10); // 请求连接超时时间,单位为秒(默认60秒)
            httpProfile.setWriteTimeout(10);  // 设置写入超时时间,单位为秒(默认0秒)
            httpProfile.setReadTimeout(10);
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            FaceidClient client = new FaceidClient(cred, "", clientProfile);
            GetDetectInfoEnhancedRequest req = new GetDetectInfoEnhancedRequest();
            req.setBizToken(bizToken);
            req.setInfoType("0");
            req.setRuleId(ruleId);
            resp = client.GetDetectInfoEnhanced(req);
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
        return resp;
    }

    /**
     * 实名核身是否通过
     *
     * @param bizToken
     * @return
     */
    @Override
    public boolean faceDetectIsPass(String bizToken) {
        GetDetectInfoEnhancedResponse resp = getDetectInfo(bizToken);
        if (!Objects.isNull(resp)) {
            DetectInfoText text = resp.getText();
            return !Objects.isNull(text) && text.getErrCode().intValue() == 0;
        }
        return false;
    }


}

 controller

package com.ynfy.app.api.v1.controller;

import com.ynfy.app.api.v1.annoation.IgnoreAuth;
import com.ynfy.buss.exam.faceverify.service.IFaceVerifyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.TokenUtil;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: 人脸核验(目前仅适用微信h5)
 * @Author: yangfeng
 * @Date: 2024-04-01
 * @Version: V1.0
 */
@Api(tags = "人脸核验")
@RestController
@RequestMapping("/api/v1/faceVerify")
@Slf4j
public class ApiFaceVerifyController extends ApiBaseController {
    @Autowired
    private IFaceVerifyService faceVerifyService;

    @Autowired
    private ISysUserService sysUserService;

    /**
     * 实名核身鉴权
     *
     * @return
     */
    @ApiOperation(value = "实名核身鉴权", notes = "实名核身鉴权")
    @GetMapping(value = "/detectAuth")
    public Result<?> detectAuth(@RequestParam String examId) {
        log.info("考试:{},实名核身鉴权开始...", examId);
        SysUser user = sysUserService.getUserByName(TokenUtil.getUserName(TokenUtil.getToken(request)));
        log.info("user:{}", user.toString());
        return Result.OK(faceVerifyService.detectAuth(examId, user.getRealname(), user.getIdCard(), user.getImageBase64()));
    }

    /**
     * 获取实名核身结果信息
     *
     * @param bizToken
     * @return
     */
    @IgnoreAuth
    @ApiOperation(value = "获取实名核身结果信息", notes = "获取实名核身结果信息")
    @GetMapping(value = "/getDetectInfo")
    public Result<?> getDetectInfo(@RequestParam String bizToken) {
        log.info("获取实名核身结果信息,bizToken:{}", bizToken);
        return Result.OK("", faceVerifyService.getDetectInfo(bizToken));
    }

    /**
     * 实名核身是否通过
     *
     * @param bizToken
     * @return
     */
    @IgnoreAuth
    @ApiOperation(value = "实名核身是否通过", notes = "实名核身是否通过")
    @GetMapping(value = "/faceDetectIsPass")
    public Result<?> faceDetectIsPass(@RequestParam String bizToken) {
        log.info("调用实名核身是否通过接口,bizToken:{}", bizToken);
        return Result.OK(faceVerifyService.faceDetectIsPass(bizToken));
    }

}

 四.h5前端。

点击“开始考试”后,读取本次考试 是否需要进行人脸核验。如果需要,调用实名核身鉴权,接口会返回用于发起核身流程的URL。

    async created() {
			this.initFormData();

			// #ifdef H5
			if (this.isNeedFaceDetect && JSON.parse(this.isNeedFaceDetect)) {
				//实名核身是否通过
				const data = await apiFaceDetectIsPass(this.bizToken)
				if (data) {
					//通过的话则加载考试信息
					this.loadExam()
				}
			}
			// #endif 
		},
        //开始考试
			async startExam() {
				//h5需要人脸核身验证后才可以开始
				// #ifdef H5
				//本考试是否支持人脸核身
				if (!!this.form.globalFaceEnable && !!this.form.faceDetectEnable) {
					const data = await apiDetectAuth(this.examId)
					window.location.href = data.url
					this.isNeedFaceDetect = true
				} else {
					this.loadExam()
				}
				// #endif 

				//非h5直接进入考试
				// #ifndef H5
				this.loadExam()
				// #endif 
			},

跳转url核验,核验完成后,会根据实名核身鉴权接口传入的RedirectUrl,

跳转前端页面,监听BizToken参数和自助传入的参数,获取核验结果。如果通过,则可以进行考试。

 五.效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507336.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PurpleKeep:提供Azure管道以创建基础设施并执行Atomic测试

关于PurpleKeep PurpleKeep是一款功能强大的安全测试自动化工具&#xff0c;该工具能够通过提供Azure管道以创建基础设施&#xff0c;并帮助广大研究人员执行Atomic测试。 随着攻击技术种类的迅速增加&#xff0c;以及EDR&#xff08;端点检测和响应&#xff09;和自定义检测规…

C语言----预处理(详解)

好了书接上回。我在讲编译与链接的时候写过宏和条件建议。我说会在下一篇博客中讲解&#xff0c;那么来了。今天我们来详细的讲讲预处理。宏与条件编译也在其中&#xff0c;那么我们现在就来好好会会这个预处理吧。 预定义符号 关于预定义符号&#xff0c;我暂时只知道几个。并…

Python-VBA编程500例-028(入门级)

经典二分查找算法(Classic Binary Search Algorithm)(也称为折半查找算法)&#xff0c;是一种在有序数组中查找某一特定元素的搜索算法。它要求序列必须有序&#xff0c;然后通过每次比较数组中间元素与目标值&#xff0c;将搜索范围缩小一半&#xff0c;直到找到目标元素或搜索…

传输大咖20|提升效率:优化文件服务器删除大文件夹过程的策略

引文&#xff5c; 文件服务器在删除大文件夹时&#xff0c;往往会比较耗时。如果在原有线程中同步等待删除结果&#xff0c;那么会阻塞原有线程的运行&#xff1b;如果在其它线程中异步删除文件夹&#xff0c;则虽不阻塞原有线程的运行&#xff0c;但对于那些关注删除结果的用户…

每日面经分享(pytest装饰器)

pytest装饰器 a. pytest.mark.parametrize&#xff1a;这个装饰器用于标记测试函数&#xff0c;并为其提供多组参数进行参数化测试。可以使用元组、列表、字典等形式来指定参数组合。 import pytestpytest.mark.parametrize("num1, num2, expected", [(2, 2, 4), (5…

力扣热门算法题 217. 存在重复元素,223. 矩形面积,225. 用队列实现栈

217. 存在重复元素&#xff0c;223. 矩形面积&#xff0c;225. 用队列实现栈&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.04.01 可通过leetcode所有测试用例。 目录 217. 存在重复元素 解题思路 完整代码 Java Python 223…

Discuz采集发布插件

Discuz&#xff08;简称DZ&#xff09;是一款知名的开源论坛系统&#xff0c;广泛应用于各类网站社区。对于许多站长来说&#xff0c;保持论坛内容的更新是一项挑战&#xff0c;特别是在内容量庞大的情况下。为了解决这个问题&#xff0c;有一类特殊的插件是用于在Discuz论坛中…

惟客数据《2024泛零售行业大会员经营实践与案例》正式发布

对于多业态、多品牌、多渠道经营的泛零售企业而言&#xff0c;如何改变过去会员经营过程中“各自为政”的状态&#xff1f; 如何让企业内不同业务之间的会员经营“瞄得准、看得穿、打得透、流得通、触得动”&#xff0c;充分发挥多业态、多品牌、多渠道优势&#xff0c;最大化挖…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了&#xff0c;为么子哇 如下图

简单说清楚什么是SQL Injection?

最近看完了《The Pragmatic Programmer: 20th Anniversary Edition, 2nd Edition: Your Journey to Mastery》&#xff0c;在第7章&#xff1a;While You Are Coding的footnotes中&#xff0c;提到了一幅漫画&#xff1a; 这不仅用简单的方式说清楚了什么是SQL Injection&#…

【御控物联】JSON结构数据转换在物联业务中应用(场景案例二)

文章目录 一、物联网业务场景现状二、物联网业务场景数据交互格式三、JSON格式数据转换案例四、JSON数据格式转换DEMO 一、物联网业务场景现状 目前&#xff0c;市场上多数物联网关与物联平台捆绑售卖&#xff0c;网关采集到设备数据只能按照指定的协议和规定的数据格式传输到…

蚂蚁测试可控制天气的“龙王”系统

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 所有伟大的发明&#xff0c;都来自最初不切实际的幻想。 4月1日&#xff0c;不少互联网大厂都发布一些新产品&#xff0c;例如&#xff1a;淘宝测试用火箭送快递&#xff0c;蚂蚁集团推出可以控制天气的技术系统畅…

【学习笔记】java项目—苍穹外卖day03

文章目录 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新…

MySQL 进阶-----索引使用规则

目录 前言 一、验证索引效率 二、最左前缀法则 三、范围查询 四、索引失效情况 1.索引列运算 2.字符串不加引号 3 .模糊查询 4.or连接条件 5 .数据分布影响 前言 本期我们学习MySQL索引的使用方法&#xff0c;在讲解索引的使用原则之前&#xff0c;先通过一个简单的…

【漏洞复现】通天星CMSV6弱口令漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

探索 Redis 数据库:一款高性能的内存键值存储系统

目录 引言 一、非关系型数据库 &#xff08;一&#xff09;什么是非关系型数据库 &#xff08;二&#xff09;非关系型数据库的主要特征 &#xff08;三&#xff09;关系数据库与非关系型数据库的区别 二、Redis 简介 &#xff08;一&#xff09;基本信息 &#xff08;…

哪一款个微管理助手比较好用?

私域流量兴起&#xff0c;社群运营成为热门&#xff0c;越来越多的行业进入社群的圈子。但是社群管理是个超麻烦、巨琐碎的活儿&#xff0c;方法不对&#xff0c;很容易无限陷入死循环。 此时&#xff0c;一个合适的管理工具可以帮我们高效管理&#xff0c;达到事半功倍的效果…

构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理

方案概述 现在绝大多数客户都有很多非结构化的数据存在 OSS 中&#xff0c;以图片&#xff0c;视频&#xff0c;音频居多。举一个图片处理的场景&#xff0c;现在各种终端种类繁多&#xff0c;不同的终端对图片的格式、分辨率要求也不同&#xff0c;所以一张图片往往会有很多张…

泰迪智能科技高职人工智能专业人才培养方案

人工智能专业坚持以立德树人为根本&#xff0c;立足社会经济发展&#xff0c;面向信息技术行业&#xff0c;培养德智体美劳全面发展的人工智能领域的高素质工程型专门人才。毕业生具备扎实的数学、自然科学、工程技术、人文社科的基本理论, 系统深入的人工智能专业知识和实践能…