当前位置: 首页 > 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>

http://www.lryc.cn/news/516651.html

相关文章:

  • GO随想:GO的并发等待
  • kubernetes第五天
  • 扩散模型论文概述(三):Stability AI系列工作【学习笔记】
  • JVM调优,参数在哪里设置的?
  • 2024年最新Stable Diffusion 新手入门教程,安装使用及模型下载
  • Ubuntu 20.04安装gcc
  • IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥
  • kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration
  • Freemarker模板进行判空
  • C++ const关键字(八股总结)
  • Linux 清楚历史命令
  • 服务器双网卡NCCL通过交换机通信
  • Redis哨兵(sentinel)
  • 小白学Pytorch
  • ros2笔记-2.5.3 多线程与回调函数
  • 第5章:Go语言错误处理和异常
  • 题库刷题知识点总结
  • GraphRAG:LLM之Graphrag接入milvus
  • adb使用及常用命令
  • omnipeek分析beacon帧
  • Java数组问题
  • salesforce 可以为同一个简档的同一个 recordtype 的对象设置多种页面布局吗
  • 使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
  • 五、包图
  • 关于重构一点简单想法
  • kafka使用以及基于zookeeper集群搭建集群环境
  • GAN对抗生成网络(二)——算法及Python实现
  • 并发线程(21)——线程池
  • 基于32单片机的智能语音家居
  • VScode怎么重启