人脸核身基础版 SDK 接入 > 合作方后台上送身份信息

文章目录

          • 一、概述
          • 二、实现流程
            • 2.1. 获取获取 access_token
            • 2.2. 获取 SIGN ticket
            • 2.3. 生成签名
            • 2.4. 上送身份信息
            • 2.5. 获取 NONCE ticket
          • 三、实战
            • 3.1. 获取获取 access_token
            • 3.2. 获取 SIGN ticket
            • 3.3. 生成签名
            • 3.4. 上送身份信息
            • 3.5. 获取 NONCE ticket
          • 四、开源地址

一、概述

人脸识别,使用官方API:腾讯云人脸核身之独立H5接入。接口官方返回code = 0 表示成功,其他code码值均为对应码值信息,详见错误码。

注意:
1.合作方上送身份信息的计算签名参数与启动人脸核身计算签名参数不一致,有部分区别。
2.wbappid = webankAppId = app_id

二、实现流程
2.1. 获取获取 access_token

文档: https://cloud.tencent.com/document/product/1007/37304

2.2. 获取 SIGN ticket

文档: https://cloud.tencent.com/document/product/1007/37305

2.3. 生成签名

文档: https://cloud.tencent.com/document/product/1007/35866

2.4. 上送身份信息

文档: https://cloud.tencent.com/document/product/1007/35866

2.5. 获取 NONCE ticket

文档: https://cloud.tencent.com/document/product/1007/37306

三、实战
3.1. 获取获取 access_token

app_id获取:https://cloud.tencent.com/document/product/1007/49634
secret获取:https://cloud.tencent.com/document/product/1007/49634
在这里插入图片描述

@Autowiredprivate RedisUtils redisUtils;@Value("${tencent-cloud.wbappid}")private String appId;@Value("${tencent-cloud.secret}")private String secret;/*** 获取 access_token* 文档: https://cloud.tencent.com/document/product/1007/37304** @return*/@Overridepublic String getAccessTokenTencent() {// 从redis中获取accessTokenTencentString accessTokenTencent = redisUtils.get("accessTokenTencent");log.info("获取redis中的accessToken,为:[{}]", accessTokenTencent);if (StringUtils.isEmpty(accessTokenTencent)) {String accessTokenUrl = String.format(TencentCloudConfig.ACCESS_TOKEN_URL, appId, secret);String jsonStr = HttpUtil.doGet(accessTokenUrl, null);log.info("返回报文;->{}", jsonStr);Map<String, String> jsonMap = ConvertUtils.stringToMap(jsonStr);if (!"0".equals(jsonMap.get("code"))) {String msg = jsonMap.get("msg");log.error("获取腾讯token信息错误,code:{},msg:{}", jsonMap.get("code"), msg);GraceJSONResult.errorMsg(msg);/*** 错误响应示例:* {*     "code": "66660000",*     "msg": "请求参数异常",*     "bizSeqNo": "22090720001184453210262184859700",*     "transactionTime": "20220907102621",*     "success": false,*     "expire_in": 0* }*/}/*** 正确响应示例:* {*  "code":"0","msg":"请求成功",*  "transactionTime":"20151022043831",*  "access_token":"accessToken_string",*  "expire_time":"20151022043831",*  "expire_in":"7200"* }*/// 获取 access_tokenaccessTokenTencent = jsonMap.get("access_token");// 过期时间 默认7200L  设置6800L提前重新获取redisUtils.set("accessTokenTencent", accessTokenTencent, 6800L);}log.info("返回有效accessToken,为:[{}]", accessTokenTencent);return accessTokenTencent;}
3.2. 获取 SIGN ticket

在这里插入图片描述

   /*** 获取 SIGN ticket* 请求地址: http://localhost:9900/getSignTicketTencent* 文档: https://cloud.tencent.com/document/product/1007/37305** @param accessTokenTencent access_token* @return*/@Overridepublic String getSignTicketTencent(String accessTokenTencent) {// 从redis中获取nonceTicketTencentString signTicketTencent = redisUtils.get("signTicketTencent");log.info("获取redis中的signTicketTencent,为:[{}]", signTicketTencent);String signTicketValue = null;if (StringUtils.isEmpty(signTicketTencent)) {String getSignTicketUrl = String.format(TencentCloudConfig.SIGN_TICKET_URL, appId, accessTokenTencent);String jsonStr = HttpUtil.doGet(getSignTicketUrl, null);log.info("返回报文;->{}", jsonStr);TicketDTO ticketDTO = JSON.parseObject(jsonStr, TicketDTO.class);if (!"0".equals(ticketDTO.getCode())) {String msg = ticketDTO.getMsg();log.error("获取腾讯signTicket信息错误,code:{},msg:{}", ticketDTO.getCode(), msg);GraceJSONResult.errorMsg(msg);}/*** 正确响应示例:* {*       "code": "0",*       "msg": "请求成功",*       "transactionTime": "20151022044027",*       "tickets": [*         {*              "value": "ticket_string",*              "expire_in": "3600",*              "expire_time": "20151022044027"*         }*     ]* }*/signTicketValue = ticketDTO.getTickets().get(0).getValue();// 过期时间 默认3600L  设置3200L提前重新获取redisUtils.set("signTicketTencent", signTicketValue, 3000L);}return signTicketValue;}
3.3. 生成签名

在这里插入图片描述

 /*** 合作方上送身份信息计算签名* API: https://cloud.tencent.com/document/product/1007/35866** @param userId     用户唯一标识,同一个用户的 userId 请保持一致,我们会根据 userId 来做防重复点击优化* @param signTicket 合作伙伴服务端获取的 ticket,注意是 SIGN 类型* @return*/@Overridepublic String sign(String userId, String signTicket) {//为计算签名做准备List<String> list = new ArrayList<>();list.add(appId);list.add(userId);list.add(SignUtils.GenerateRandom32Number());list.add(TencentCloudConfig.VERSION);return SignUtils.getSign(list, signTicket);}
package com.gblfy.tencent.cloud.utils;import com.gblfy.tencent.cloud.result.GraceJSONResult;
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.Collections;
import java.util.List;
import java.util.UUID;/*** Java 签名算法* 腾讯云文档: https://cloud.tencent.com/document/product/1007/37307** @author gblfy* @Date 2022-09-06**/
@Slf4j
@Component
public class SignUtils {//签名计算public static String getSign(List<String> values, String signTicket) {if (CollectionUtils.isEmpty(values)) {GraceJSONResult.errorMsg("签名计算 values is null");}// remove nullvalues.removeAll(Collections.singleton(null));values.add(signTicket);log.info("启动人脸核身签名排序前参数为:[{}]", values);java.util.Collections.sort(values);log.info("启动人脸核身签名排序后参数为:[{}]", values);StringBuilder sb = new StringBuilder();for (String s : values) {sb.append(s);}return Hashing.sha1().hashString(sb, Charsets.UTF_8).toString().toUpperCase();}//生成32位随机数public static String GenerateRandom32Number() {return UUID.randomUUID().toString().replace("-", "");}// public static void main(String[] args) {//     System.out.println(UUID.randomUUID().toString().replace("-", "").length());//     System.out.println(UUID.randomUUID().toString().replace("-", ""));// }
}
3.4. 上送身份信息

在这里插入图片描述

 /*** 合作方后台上送身份信息** @param faceDetectUserVO 身份信息* @return*/@Overridepublic GraceJSONResult sendIdentityInfoUserInfo(FaceDetectUserVO faceDetectUserVO) {//获取accessTokenString accessToken = getAccessTokenTencent();//获取signTicketString signTicket = getSignTicketTencent(accessToken);//合作方上送计算签名String sign = sign(signTicket, faceDetectUserVO.getUserId());String orderNo = faceDetectUserVO.getOrderNo();Map<String, String> param = new HashMap<>(16);param.put("webankAppId", appId);param.put("orderNo", orderNo);param.put("name", faceDetectUserVO.getName());param.put("idNo", faceDetectUserVO.getIdNo());param.put("userId", faceDetectUserVO.getUserId());param.put("version", TencentCloudConfig.VERSION);param.put("sign", sign);log.debug("合作方上送身份信息参数有:[{}]", param);String getFaceidUrl = String.format(TencentCloudConfig.GET_FACEID_URL, orderNo);String jsonStr = HttpUtil.doPost(getFaceidUrl, JSON.toJSONString(param));log.info("返回报文;->{}", jsonStr);TXIdentityInfoDTO txIdentityInfoDTO = JSON.parseObject(jsonStr, TXIdentityInfoDTO.class);log.info("合作方上送身份信息接口返回:[{}]", txIdentityInfoDTO);return GraceJSONResult.ok(txIdentityInfoDTO);}
3.5. 获取 NONCE ticket

在这里插入图片描述

 /*** 获取 NONCE ticket* 请求地址: http://localhost:9900/getNonceTicketTencent?userId=123456* 文档: https://cloud.tencent.com/document/product/1007/37306** @param userId 当前使用用户的唯一标识,需合作伙伴自行定义* @return*/@Overridepublic GraceJSONResult getNonceTicketTencent(String userId) {// 从redis中获取nonceTicketTencentString nonceTicketTencent = redisUtils.get("nonceTicketTencent");log.info("获取redis中的nonceTicketTencent,为:[{}]", nonceTicketTencent);// 获取access_tokenString accessTokenTencent = getAccessTokenTencent();String nonceTicketValue = null;if (StringUtils.isEmpty(nonceTicketTencent)) {String nonceTicketUrl = String.format(TencentCloudConfig.NONCE_TICKET_URL, appId, accessTokenTencent, userId);String jsonStr = HttpUtil.doGet(nonceTicketUrl, null);log.info("返回报文;->{}", jsonStr);TicketDTO ticketDTO = JSON.parseObject(jsonStr, TicketDTO.class);if (!"0".equals(ticketDTO.getCode())) {String msg = ticketDTO.getMsg();log.error("获取腾讯NonceTicket信息错误,code:{},msg:{}", ticketDTO.getCode(), msg);GraceJSONResult.errorMsg(msg);}/*** 正确响应示例:* {*       "code": "0",*       "msg": "请求成功",*       "transactionTime": "20151022044027",*       "tickets": [*         {*               "value": "ticket_string",*               "expire_in": "120",*               "expire_time": "20151022044027"*         }*     ]* }*/nonceTicketValue = ticketDTO.getTickets().get(0).getValue();// 过期时间 默认120L  设置100L提前重新获取redisUtils.set("nonceTicketTencent", nonceTicketValue, 100L);}return GraceJSONResult.ok(nonceTicketValue);}
四、开源地址

https://gitee.com/gblfy/tencent-cloud

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G、射频、奥特曼,这仨有联系吗?

作者 | 小枣君来源 | 鲜枣课堂头图 | 下载于ICphoto手机&#xff0c;作为移动互联网时代的标配&#xff0c;已经走进了我们每个人的生活。有了它&#xff0c;我们可以随心所欲地聊天、购物、追剧&#xff0c;享受美好的人生。正因为手机如此重要&#xff0c;所以人们对相关技术…

一种简单快捷的 java 热部署方式

简介&#xff1a; 本文热部署插件(Arthas Hot Swap)是基于 Arthas redefine 命令实现的&#xff0c;使用该插件进行远程热部署无需任何配置&#xff0c;无需使用 debug 端口&#xff0c;只需几个简单动作就能完成。 作者 | 周忠太 阿里巴巴淘系技术部的一个搬砖工 【Arthas 官…

赠书 | IoT 的真正目标是什么

以往在构建物联网局域网系统时&#xff0c;为了方便考虑&#xff0c;在云端进行数据处理和分析已经成了常识。但是这种做法已经无法应对现在的情况。在物联网中边缘计算的必要性想要获取数据就要增加连接的设备数量&#xff0c;提高从传感器采集数据的记录&#xff08;获取&…

AI 腾讯云人脸核身之独立H5接入

文章目录一、概述二、合作方后台上送身份信息~实现流程2.1. 前端入参2.2. 后端固定参数2.3. 获取 Access Token2.4. 获取 SIGN ticket2.5. 生成签名2.6. 合作方后台上送身份信息三、启动H5人脸核身3.1. 获取h5faceId3.2. 获取nonce3.3. 获取nonceTicket3.4. 计算启动签名3.5. 构…

最佳实践:使用阿里云CDN加速OSS访问

简介&#xff1a; 用户直接访问OSS资源&#xff0c;访问速度会受到OSS的下行带宽以及Bucket地域的限制。如果通过CDN来访问OSS资源&#xff0c;带宽上限更高&#xff0c;并且可以将OSS的资源缓存至就近的CDN节点&#xff0c;通过CDN节点进行分发&#xff0c;访问速度更快&#…

IDEA 2022 CPU占用100%的问题及解决方法

禁用下面这三个插件然后重启IDEA即可&#xff1a; Package Checker Package Search Ktor 下面的内容可以不用看了&#xff0c;只要禁用这仨插件就行

无服务计算应用场景探讨及 FaaS 应用实战

简介&#xff1a; 无服务计算本身是一个概念或者理论模型&#xff0c;落地到具体技术上主要有函数即服务&#xff08;FaaS&#xff09;以及后端即服务&#xff08;BaaS&#xff09;两种形式&#xff0c;阿里云提供函数即服务 FaaS 产品。 作者 | 宋文龙&#xff08;闻可&#x…

想学 Python?那这套教程再适合你不过了!!

如果你想问最近这些年什么编程语言最值得学习&#xff0c;我相信很多人都会告诉你是Python&#xff01;所以不仅是开发小白&#xff0c;甚至很多开发老手&#xff0c;也都开始学习Python&#xff0c;作为辅助第二语言来提高自己的职场竞争力。不过结合我最近这些年Python的学习…

2020-09-01

简介&#xff1a; 《5天入门视觉AI》电子书来了&#xff01;身份证识别、电子相册两大实践场景带你快速入门视觉AI应用开发&#xff01; 阿里云“在家实践”全新出击&#xff01; 《5天入门视觉AI》电子书正式上线&#xff01; 视觉AI训练营必备教材&#xff01; 身份证识别、电…

再见 Nacos,我要玩 Service Mesh 了!

作者 | 姜桥出品 | CSDN云计算&#xff08;ID:CSDNcloud&#xff09;前面的文章<<干货|如何步入Service Mesh微服务架构时代>>实战演练了Service Mesh微服务架构的具体玩法&#xff0c;该案例中通过IstioKubernetes的组合&#xff0c;一组以Spring Boot框架开发的服…

顶会论文看不懂?阿里巴巴技术专家为你全方位解读!

简介&#xff1a; 由阿里云开发者社区联合新零售智能引擎事业群共同打造的《KDD 论文精华解读》电子书重磅发布&#xff01;覆盖推荐系统、图神经网络预训练、买家秀视频标题生成、在线电视剧的受众竞争力预测和分析等 10 内容&#xff0c;免费下载电子书感受科技的震撼&#x…

Python C扩展的引用计数问题探讨

简介&#xff1a; # Python GC机制 对于Python这种高级语言来说&#xff0c;开发者不需要自己管理和维护内存。Python采用了引用计数机制为主&#xff0c;标记-清除和分代收集两种机制为辅的垃圾回收机制。 首先&#xff0c;需要搞清楚变量和对象的关系&#xff1a; * 变量&…

云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator

作者 | 刘睿、杜恒 导读&#xff1a;RocketMQ Operator 现已加入 OperatorHub&#xff0c;正式进入 Operator 社区。本文将从实践出发&#xff0c;结合案例来说明&#xff0c;如何通过 RocketMQ Operator 在 Kubernetes 上快速搭建一个 RocketMQ 集群&#xff0c;并提供一些 Ro…

Spring Security BadCredentialsException: Bad credentials问题解决

问题描述&#xff1a; org.springframework.security.authentication.BadCredentialsException: Bad credentials 问题分析&#xff1a; 1、数据库里面的密码没有加密&#xff0c;导致输入正确密码也匹配不上。 解决办法&#xff1a;使用PasswordEncoder先将当前密码加密&…

携程在港挂牌:两次疫情两次上市 穿越周期初心不灭

携程香港联合交易所上市庆祝仪式现场 2021年4月19日9点30分,携程集团正式在香港联合交易所上市&#xff0c;股份代号&#xff1a;9961.hk。这是继2003年在美国纳斯达克上市后&#xff0c;携程在香港的第二次上市。在上海市凌空SOHO携程总部大楼前&#xff0c;8位携程客人代表数…

淘宝直播在智能互动领域的探索及落地

简介&#xff1a; 随着带宽成本的降低和端上算力的提升&#xff0c;在直播、短视频中基于流的互动玩法也将越来越丰富&#xff1b;无论是基于人脸、手势、分割算法的智能化贴纸&#xff0c;还是结合算法的小游戏有了越来越好的舞台&#xff1b;业界短视频和直播主要针对的娱乐性…

基于实时计算Flink的机器学习算法平台及场景介绍

作者&#xff1a;高旸&#xff08;吾与&#xff09;&#xff0c;阿里巴巴高级技术专家 1. 前言 随着互联网“人口红利”的“消耗殆尽”&#xff0c;基于“T1”或者离线计算的机器学习平台及推荐系统转化率与效果日趋“平淡”。后疫情时代的新社会模式及经济形态必将催生出新的…

SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可监控)

简介&#xff1a; 本篇是“SpringCloud 应用在 Kubernetes 上的最佳实践”系列文章的第六篇&#xff0c;主要介绍了如何保障生产环境服务稳定&#xff0c;做到随时发布&#xff0c;从而加快业务的迭代和上线速度。 文&#xff1a;骐羽 前言 在应用发布上线的时候我们最担心的…

mPaaS:全新移动开发平台,只为打造性能更优越的App

简介&#xff1a; 基于移动开发现状与技术演进预判&#xff0c;提供移动开发强力解决方案&#xff0c;洞察 mPaaS 如何帮助企业有效降低技术门槛&#xff0c;减少研发成本&#xff0c;搭建更稳定、更流畅的移动 App。 mPaaS 是源自于支付宝的移动开发平台&#xff0c;为移动开发…

德勤2021技术趋势:繁琐、点状的匠人AI时代将终结,MLOps时代来临

作者 | 宋慧 出品 | CSDN 头图 | 付费下载于视觉中国 德勤在近日发布《2021 年技术趋势》报告&#xff0c;这已经是德勤连续第十二年发布全球技术趋势报告。纵观今年的九大技术趋势&#xff0c;德勤给出的主题关键词是“韧性”&#xff0c;建议企业运用技术实现敏捷发展、构建…