支付宝实名认证
实名认证后台服务主要涉及两个接口:人脸核身初始化接口、人脸核身结果查询接口
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.*;
import com.alipay.api.domain.DatadigitalFincloudGeneralsaasFaceVerificationInitializeModel;
import com.alipay.api.domain.DatadigitalFincloudGeneralsaasFaceVerificationQueryModel;
import com.alipay.api.request.DatadigitalFincloudGeneralsaasFaceVerificationInitializeRequest;
import com.alipay.api.request.DatadigitalFincloudGeneralsaasFaceVerificationQueryRequest;
import com.alipay.api.response.DatadigitalFincloudGeneralsaasFaceVerificationInitializeResponse;
import com.alipay.api.response.DatadigitalFincloudGeneralsaasFaceVerificationQueryResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.UUID;/*** 支付宝实名认证服务** @Author zwm* @Date 2025-01-06*/@Service
@Slf4j
public class AlipayRealNameAuthServiceImpl implements RealNameAuthService {@Autowiredprivate AliyunProperties aliyunAuthProperties;@Autowiredprivate CustomerMapper customerMapper;@Autowiredprivate CustomerAuthService customerAuthService;@Autowiredprivate CustomerCacheService customerCacheService;// 支付宝接口返回结果keyprivate static String ALIPAY_AUTH_QUERY_RESPONSE = "datadigital_fincloud_generalsaas_face_verification_query_response";private static String ALIPAY_AUTH_INITIALIZE_RESPONSE = "datadigital_fincloud_generalsaas_face_verification_initialize_response";/*** 人脸核身初始化接口** @return 前端刷脸url以及certify_id(查询接口需要用到)*/@Overridepublic JSONObject authInitialize(RealNameCertify certify) throws Exception {String outerOrderNo = "xxx_" + UUID.randomUUID().toString();log.info("auth info:idCard:{},name:{},outerOrderNo:{}", certify.getCertNo(), certify.getCertName(), outerOrderNo);// 初始化SDKAlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());// 构造请求参数以调用接口DatadigitalFincloudGeneralsaasFaceVerificationInitializeRequest request = new DatadigitalFincloudGeneralsaasFaceVerificationInitializeRequest();DatadigitalFincloudGeneralsaasFaceVerificationInitializeModel model = new DatadigitalFincloudGeneralsaasFaceVerificationInitializeModel();// 设置商户请求的唯一标识model.setOuterOrderNo(outerOrderNo);// 设置人脸核身具体类型目前仅支持model.setBizCode("DATA_DIGITAL_BIZ_CODE_FACE_VERIFICATION");// 设置认证类型model.setIdentityType("CERT_INFO");// 设置证件类型model.setCertType("IDENTITY_CARD");// 设置真实姓名model.setCertName(certify.getCertName());// 设置证件号model.setCertNo(certify.getCertNo());request.setBizModel(model);// 需要使用对称加密算法request.setNeedEncrypt(true);DatadigitalFincloudGeneralsaasFaceVerificationInitializeResponse response = alipayClient.certificateExecute(request);System.out.println(response.getBody());JSONObject resultJson = JSONObject.parseObject(response.getBody());JSONObject responseResult = resultJson.getJSONObject(ALIPAY_AUTH_INITIALIZE_RESPONSE);log.info("【人脸核身初始化接口】返回:{}", responseResult);return responseResult;}/*** 人脸核身结果查询接口* <p>** @param certifyId* @return* @throws Exception*/@Overridepublic JSONObject queryCertifyResult(String certifyId) throws Exception {// 初始化SDKAlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());// 构造请求参数以调用接口DatadigitalFincloudGeneralsaasFaceVerificationQueryRequest request = new DatadigitalFincloudGeneralsaasFaceVerificationQueryRequest();DatadigitalFincloudGeneralsaasFaceVerificationQueryModel model = new DatadigitalFincloudGeneralsaasFaceVerificationQueryModel();// 设置填入人脸核身初始化阶段获取到的certify_idmodel.setCertifyId(certifyId);// 设置是否需要返回活体结果图片model.setNeedAlivePhoto("N");request.setBizModel(model);DatadigitalFincloudGeneralsaasFaceVerificationQueryResponse response = alipayClient.certificateExecute(request);System.out.println(response.getBody());JSONObject resultJson = JSONObject.parseObject(response.getBody());JSONObject responseResult = resultJson.getJSONObject(ALIPAY_AUTH_QUERY_RESPONSE);log.info("【人脸核身结果查询接口】返回:{}", responseResult);return responseResult;}private AlipayConfig getAlipayConfig() throws Exception {String privateKey = aliyunAuthProperties.getAuth().getAppPrivateKey();AlipayConfig alipayConfig = new AlipayConfig();alipayConfig.setServerUrl(aliyunAuthProperties.getAuth().getServerUrl());// appIdalipayConfig.setAppId(aliyunAuthProperties.getAuth().getAppId());alipayConfig.setPrivateKey(privateKey);alipayConfig.setFormat("json");// 密钥模式下采用此方法//alipayConfig.setAlipayPublicKey(alipayPublicKey);//设置应用公钥证书路径alipayConfig.setAppCertPath(getFilePath(aliyunAuthProperties.getAuth().getAppCertFileName()));//设置支付宝公钥证书路径alipayConfig.setAlipayPublicCertPath(getFilePath(aliyunAuthProperties.getAuth().getAlipayCertFileName()));//设置支付宝根证书路径alipayConfig.setRootCertPath(getFilePath(aliyunAuthProperties.getAuth().getAlipayRootCertFileName()));alipayConfig.setCharset("UTF-8");alipayConfig.setSignType("RSA2");alipayConfig.setEncryptType(aliyunAuthProperties.getAuth().getEncryptType());alipayConfig.setEncryptKey(aliyunAuthProperties.getAuth().getEncryptKey());return alipayConfig;}/*** 获取资源文件路径** @param fileName* @return*/public String getFilePath(String fileName) {String relativePath = "/cert/" + fileName;log.info("relativePath:{}", relativePath);String[] split = fileName.split("\\.");try {// 使用当前类来获取资源文件的输入流InputStream inputStream = AlipayRealNameAuthServiceImpl.class.getResourceAsStream(relativePath);if (inputStream == null) {throw new IOException("File " + relativePath + " does not exist");}// 将输入流中的内容复制到临时文件Path tempFilePath = Files.createTempFile(split[0], split[1]);Files.copy(inputStream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);return tempFilePath.toString();} catch (IOException e) {e.printStackTrace();}return null;}
}
POM文件
<!--支付宝实名认证--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.38.61.ALL</version></dependency>
相关文章:
支付宝实名认证
实名认证后台服务主要涉及两个接口:人脸核身初始化接口、人脸核身结果查询接口 import com.alibaba.fastjson.JSONObject; import com.alipay.api.*; import com.alipay.api.domain.DatadigitalFincloudGeneralsaasFaceVerificationInitializeModel; import com.ali…...
GO随想:GO的并发等待
协程并发等待技术——WaitGroup 类型和 errgroup 包 waitgroup 阻塞等待多个并发任务执行完成。WaitGroup 类型主要包含下面几个方法。 func (wg *WaitGroup) Add(delta int) func (wg *WaitGroup) Done() func (wg *WaitGroup) Wait() 第一个是 Add 方法,在任务运…...
kubernetes第五天
1.容器的健康检查Probe(探针)之readinessProbe就绪探针 1.exec方式检查 #通过rc资源创建了三个pod,然后使用services资源,对外提供三个pod的容器的访问入口。 apiVersion: v1 kind: ReplicationController metadata:name: web-rc-readlinepr…...
扩散模型论文概述(三):Stability AI系列工作【学习笔记】
视频链接:扩散模型论文概述(三):Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样,第一张图片是神作,总结的太好了! 介绍Stable Diffusion之前&…...
JVM调优,参数在哪里设置的?
JVM调优,参数在哪里设置的? 在Java应用程序中,JVM(Java Virtual Machine)的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。 1. JVM参数的位置 JVM参…...
2024年最新Stable Diffusion 新手入门教程,安装使用及模型下载
一、安装要求: ① 操作系统:Windows10以后的系统 ② CPU:不做强制性要求 ③ 内存:推荐8G以上 ④ 显卡:必须是Nvidia的独立显卡,显存最低4G,推荐20系以后;A卡、核显只能用CPU跑 …...
Ubuntu 20.04安装gcc
一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…...
IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥
有时候各种原因,我们关闭了路由器的Dhcp,比如需要获取的无线IP和有线同一个网段的情况。时间久了,如果没做标记,大部分时候就会忘了路由器原来设置的是什么IP,没有路由器的对应IP,自然也无法进路由器后台去…...
kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration
1.引言 作为一名(坦白说有点懒的)图像处理方向的研究生,说实话最近新开一个坑,可能是因为要寒假了比较无聊,这次带来的系列是kaggle数据处理竞赛的经典例题:纽约出租车行程时间问题。希望大家多多支持&…...
Freemarker模板进行判空
文章目录 freemarker判断对象是否为null使用 ?? 操作符使用 ?has_content 内建函数直接使用 ! 操作符取反 freemarker判断列表是否为空 freemarker判断对象是否为null 在 FreeMarker 模板引擎中,你可以使用内建的指令和条件判断来检测一个对象是否为 null。Free…...
C++ const关键字(八股总结)
作用 const修饰符用来定义常量,具有不可变性。 修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer&…...
Linux 清楚历史命令
在 Linux 中,执行完命令后,如果你想清除终端屏幕上的内容,可以使用以下几种方法: 1. 使用 clear 命令 clear 是 Linux 中最常用的清除屏幕命令。它会将终端屏幕清空,并将光标移动到屏幕左上角。 bash clear 2. 使用快…...
服务器双网卡NCCL通过交换机通信
1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…...
Redis哨兵(sentinel)
是什么 吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务 哨兵的作用 1、监控redis运行状态,包括master和slave 2、当master down机,能自动将slave切换成新master 能干嘛…...
小白学Pytorch
小白学Pytorch 发现一个比较好的教程,对于自己来说比较合适,适合从零开始的教程。 1、搭建一个简单的网络 https://www.cnblogs.com/PythonLearner/p/13587092.html 搭建网络这步说的比较清楚: 我们使用nn包中的Sequential搭建网络&#…...
ros2笔记-2.5.3 多线程与回调函数
本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件,learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程:{threading.get_ident()} 开始下载:{…...
第5章:Go语言错误处理和异常
第5章:Go语言错误处理和异常 5.1 错误类型基础 5.1.1 error接口 // error接口定义 type error interface {Error() string }// 自定义错误 type CustomError struct {Message stringCode int }func (e *CustomError) Error() string {return fmt.Sprintf(&quo…...
题库刷题知识点总结
算法与机器学习相关 支持向量机:是一种有监督的机器学习算法,用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开,最大化两类数据点到超平面的间隔,具有良好的泛化能力和抗噪声能力。机器学习:是…...
GraphRAG:LLM之Graphrag接入milvus
前言 微软目前的graphrag更像个demo,数据量大的时候不是很友好的啊,所以将milvus接入了graphrag,看完这篇文章,其他数据库接入应该也没问题 注:这篇文章只是在search的时候接入进来,index过程或者说整个流…...
adb使用及常用命令
目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥),是 A…...
OrCAD元器件属性管理进阶技巧:用Description属性打造智能BOM清单
OrCAD元器件属性管理进阶技巧:用Description属性打造智能BOM清单 在电子设计领域,元器件管理一直是工程师们面临的挑战之一。随着项目复杂度提升,传统的BOM清单已经难以满足现代设计团队的需求。OrCAD作为行业领先的EDA工具,其强大…...
STM32(H7S7)实战指南:XSPI Octal_flash内存映射配置与优化
1. XSPI与Octal_flash内存映射基础 第一次接触STM32H7S7的XSPI接口时,我被它强大的扩展能力震撼到了。相比传统SPI接口,XSPI就像是从乡间小路升级到了八车道高速公路。Octal_flash内存映射这个功能特别实用,它能将外部Flash直接映射到MCU的地…...
千问3.5-27B轻量级部署方案:单卡A100适配路径与性能衰减评估
千问3.5-27B轻量级部署方案:单卡A100适配路径与性能衰减评估 1. 引言:当大模型遇上单卡部署 如果你手头只有一张A100,却想跑起来一个270亿参数的大模型,是不是觉得有点异想天开?别急着放弃,这篇文章就是为…...
GitHub进阶玩法全解析,零基础可快速上手进阶高手,轻松解决各类常见难题。
GitHub高级使用方法大全:从分支管理到自动化工作流 目录 开篇:超越基础,进入工程化协作高级分支策略:不只是存放代码提交的艺术:让每次提交都有价值Pull Request进阶:打造高效Code Review流程GitHub Acti…...
如何实现uWebSockets认证令牌刷新:自动与手动触发的终极指南
如何实现uWebSockets认证令牌刷新:自动与手动触发的终极指南 【免费下载链接】uWebSockets Simple, secure & standards compliant web server for the most demanding of applications 项目地址: https://gitcode.com/gh_mirrors/uw/uWebSockets uWebSo…...
深度定制夜之城:赛博朋克2077存档编辑器完全指南
深度定制夜之城:赛博朋克2077存档编辑器完全指南 【免费下载链接】CyberpunkSaveEditor A tool to edit Cyberpunk 2077 sav.dat files 项目地址: https://gitcode.com/gh_mirrors/cy/CyberpunkSaveEditor 想要彻底掌控《赛博朋克2077》的游戏体验吗…...
IDM激活脚本终极指南:一键实现永久免费使用的完整教程
IDM激活脚本终极指南:一键实现永久免费使用的完整教程 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 想要免费使用Internet Download Manager&#…...
实习08-Mamba 和 SSM
🔹 第一部分:Mamba 基础概念(先补地基) 1.1 什么是 State Space Model (SSM)? [公式] - SSM 思想 SSM 源自控制理论,核心是一个连续时间系统: # 连续形式(控制理论) h(t)…...
猫抓Cat-Catch:解锁网页媒体资源的终极免费解决方案
猫抓Cat-Catch:解锁网页媒体资源的终极免费解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存心爱的在线视频而苦…...
掌握AI专著撰写技巧,借助工具,轻松打造高质量学术专著
学术专著创作困境与AI工具解决方案 许多学者在撰写学术专著时,常常面临着“有限的精力”与“无限的需求”之间的矛盾。写一本专著通常需要耗费3到5年,甚至更长的时间,而研究者在日常生活中还要兼顾教学、科研和学术交流等多重任务࿰…...
