当前位置: 首页 > news >正文

支付宝实名认证

实名认证后台服务主要涉及两个接口:人脸核身初始化接口、人脸核身结果查询接口

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>

相关文章:

支付宝实名认证

实名认证后台服务主要涉及两个接口&#xff1a;人脸核身初始化接口、人脸核身结果查询接口 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 方法&#xff0c;在任务运…...

kubernetes第五天

1.容器的健康检查Probe&#xff08;探针&#xff09;之readinessProbe就绪探针 1.exec方式检查 #通过rc资源创建了三个pod,然后使用services资源&#xff0c;对外提供三个pod的容器的访问入口。 apiVersion: v1 kind: ReplicationController metadata:name: web-rc-readlinepr…...

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;三&#xff09;&#xff1a;Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 介绍Stable Diffusion之前&…...

JVM调优,参数在哪里设置的?

JVM调优&#xff0c;参数在哪里设置的&#xff1f; 在Java应用程序中&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。 1. JVM参数的位置 JVM参…...

2024年最新Stable Diffusion 新手入门教程,安装使用及模型下载

一、安装要求&#xff1a; ① 操作系统&#xff1a;Windows10以后的系统 ② CPU&#xff1a;不做强制性要求 ③ 内存&#xff1a;推荐8G以上 ④ 显卡&#xff1a;必须是Nvidia的独立显卡&#xff0c;显存最低4G&#xff0c;推荐20系以后&#xff1b;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是啥

有时候各种原因&#xff0c;我们关闭了路由器的Dhcp&#xff0c;比如需要获取的无线IP和有线同一个网段的情况。时间久了&#xff0c;如果没做标记&#xff0c;大部分时候就会忘了路由器原来设置的是什么IP&#xff0c;没有路由器的对应IP&#xff0c;自然也无法进路由器后台去…...

kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration

1.引言 作为一名&#xff08;坦白说有点懒的&#xff09;图像处理方向的研究生&#xff0c;说实话最近新开一个坑&#xff0c;可能是因为要寒假了比较无聊&#xff0c;这次带来的系列是kaggle数据处理竞赛的经典例题&#xff1a;纽约出租车行程时间问题。希望大家多多支持&…...

Freemarker模板进行判空

文章目录 freemarker判断对象是否为null使用 ?? 操作符使用 ?has_content 内建函数直接使用 ! 操作符取反 freemarker判断列表是否为空 freemarker判断对象是否为null 在 FreeMarker 模板引擎中&#xff0c;你可以使用内建的指令和条件判断来检测一个对象是否为 null。Free…...

C++ const关键字(八股总结)

作用 const修饰符用来定义常量&#xff0c;具有不可变性。 修饰变量&#xff0c;说明该变量不可以被改变&#xff1b;修饰指针&#xff0c;分为指向常量的指针&#xff08;pointer to const&#xff09;和自身是常量的指针&#xff08;常量指针&#xff0c;const pointer&…...

Linux 清楚历史命令

在 Linux 中&#xff0c;执行完命令后&#xff0c;如果你想清除终端屏幕上的内容&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用 clear 命令 clear 是 Linux 中最常用的清除屏幕命令。它会将终端屏幕清空&#xff0c;并将光标移动到屏幕左上角。 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主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 哨兵的作用 1、监控redis运行状态&#xff0c;包括master和slave 2、当master down机&#xff0c;能自动将slave切换成新master 能干嘛…...

小白学Pytorch

小白学Pytorch 发现一个比较好的教程&#xff0c;对于自己来说比较合适&#xff0c;适合从零开始的教程。 1、搭建一个简单的网络 https://www.cnblogs.com/PythonLearner/p/13587092.html 搭建网络这步说的比较清楚&#xff1a; 我们使用nn包中的Sequential搭建网络&#…...

ros2笔记-2.5.3 多线程与回调函数

本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件&#xff0c;learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程&#xff1a;{threading.get_ident()} 开始下载&#xff1a;{…...

第5章:Go语言错误处理和异常

第5章&#xff1a;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…...

题库刷题知识点总结

算法与机器学习相关 支持向量机&#xff1a;是一种有监督的机器学习算法&#xff0c;用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开&#xff0c;最大化两类数据点到超平面的间隔&#xff0c;具有良好的泛化能力和抗噪声能力。机器学习&#xff1a;是…...

GraphRAG:LLM之Graphrag接入milvus

前言 微软目前的graphrag更像个demo&#xff0c;数据量大的时候不是很友好的啊&#xff0c;所以将milvus接入了graphrag&#xff0c;看完这篇文章&#xff0c;其他数据库接入应该也没问题 注&#xff1a;这篇文章只是在search的时候接入进来&#xff0c;index过程或者说整个流…...

adb使用及常用命令

目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥)&#xff0c;是 A…...

Redis——主从哨兵配置

目录 基础概念 ‌一、核心原理‌ ‌二、核心特性‌ ‌三、技术意义与应用价值‌ ‌四、典型应用场景‌ 案例部署 ‌一、主从复制配置命令‌ ‌二、哨兵模式部署命令‌ ‌关键注意事项‌ 基础概念 ‌一、核心原理‌ ‌内存存储与高性能‌ Redis 所有数据存储于内存中&…...

【RAG召回】BM25算法示例

rank-bm25 功能示例 本篇将通过多个示例&#xff0c;快速展示 rank-bm25 库的核心功能。不使用jieba。 准备工作 首先&#xff0c;确保您已经安装了 rank-bm25。 pip install rank-bm25接下来&#xff0c;我们定义一个通用的中文语料库和分词函数。这里我们使用简单的单字切…...

surfer15安装

安装文件 安装包和破解文件 安装 破解及汉化 打开软件...

idea 启动jar程序并调试

添加一个JAR 应用程序&#xff0c;填写以下内容&#xff1a; JAR路径&#xff1a;填写你要启动的jar程序的绝对路径 虚拟机选项&#xff1a;-Xmx1G -Xms1G -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 程序实参&#xff08;可选&#xff0c;minecraft专用…...

Web后端开发(SpringBootWeb、HTTP、Tomcat快速入门)

目录 SpringBootWeb入门 Spring 需求&#xff1a; 步骤&#xff1a; HTTP协议&#xff1a; 概述&#xff1a; 请求协议&#xff1a; 响应协议&#xff1a; 协议解析&#xff1a; Web服务器-Tomcat&#xff1a; 简介&#xff1a; 基本使用&#xff1a; SpringBootWeb…...

503 Service Unavailable:服务器暂时无法处理请求,可能是超载或维护中如何处理?

处理 "503 Service Unavailable" 错误是服务器管理者面临的常见挑战之一。这种错误通常表示服务器暂时无法处理请求&#xff0c;可能是由于服务器超载、维护中或其他临时性问题导致的。在本文中&#xff0c;我将介绍如何处理 "503 Service Unavailable" 错…...

【在线五子棋对战】二、websocket 服务器搭建

文章目录 Ⅰ. WebSocket1、简介2、特点3、原理解析4、报文格式 Ⅱ. WebSocketpp1、认识2、常用接口3、websocketpp库搭建服务器搭建流程主体框架填充回调函数细节 4、编写 makefile 文件5、websocket客户端 Ⅰ. WebSocket 1、简介 WebSocket 是从 HTML5 开始支持的一种网页端…...

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!

一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI&#xff0c;理由是此举能提升性能和安全性&#xff0c;同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…...

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习&#xff0c;需要学习如何预处理原始数据&#xff0c;这里用到pandas&#xff0c;将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…...

UserAgent包名识别工具

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景具体实现 背景 为了更准确地分析用户下单行为的来源渠道&#xff0c;并实现精细化运营与风险控制&#xff0c;我们希望在用户下单时&#xff0c;能够通过请求中…...