医保移动支付加密解密请求工具封装【国密SM2SM4】

news2024/11/28 12:37:05

文章目录

      • 医保移动支付加密解密请求工具封装
      • 一、项目背景
      • 二、使用方法
      • 三、接口调用
      • 四、源码介绍
      • 五、下载地址

医保移动支付加密解密请求工具封装

定点医药机构向地方移动支付中心发起费用明细上传、支付下单、医保退费等交易时需要发送密文,由于各大医疗机构厂商的开发语各不相同,可能要有java的、c#的、python的、pb的、nodjs的、php的、还可能有Delphi的等。。。。很多开发语言在实现SM2签名SM4加密算法没有现成的库,让我等开发人员苦不堪言;鉴于此,本屌丝特意开发了这个小demo,可以直接使用http请求实现加密解密过程,让您不必为了实现加密解密过程而废寝忘食不得其解,该demo可同时支持微信和支付宝渠道的接入。

该demo为springboot开发导出的jar包,直接运行该jar包即可运行服务,请提前安装好ava8环境。文末提供网盘下载地址!

一、项目背景

image-20240120181915750
虽然过期了,但是我前期太忙了,没时间整理哦!

二、使用方法

  • 下载资料包解压后得到如下目录
    image-20240120184645999
  • 配置文件说明【数据已脱敏处理】

对照移动支付第三方渠道接入反馈单配置 config/application.yaml 文件

image-20240120203004924

=================【支付宝测试环境配置说明】================================
小程序名称:xxx医院
APPID:2021002000069869
PID:208800007461
org_app_id【定点医药机构小程序/H5应用ID】[appid]:1GD00000000000561E0
org_code【定点医药机构编码】:H341xxxxxxxx445
ol_biz_type_code【线上业务类型】:04107-医保移动支付业务 04106-线上身份核验业务
org_chnl_crtf_code【机构渠道认证编码】:BqK1kMStlhVDgN2000000000000000000swxWFS9blhtcf6EPJu
【定点医药机构小程序/H5应用名称】:安徽涵博健康集团医院-皖东医院
【数字密钥】[appSecret]:1GD2SB7D000000000000004F842
【渠道私钥】[privateKey]:ANNEIfrVuLzv000000000000000GpAxYHpi
【渠道公钥】[pubKey]:BNvtt6Vy5l2ozmsk00000000000000000000000000000000PbI4eMC7oDanfXnSf5PtSlN9g=
【平台公钥】[publickey]:BOIfzplFtfjtsMau00000000000000000000000000000000000000LclJij4jfRqs4q2nDcSEhpa/3cGJw=
定点机构编号:H3000000000045
  • 运行工具

    执行 java -jar ./ybydzd-enc.jar --server.port=8888 端口请自行修改

    启动效果如下

    image-20240120191456835

三、接口调用

  • 支付宝加密接口

接口地址 /ali_encr_data
请求方式 POST

请求效果
image-20240120192939097

  • 支付宝解密接口

接口地址 /ali_decr_data
请求方式 POST

请求效果
image-20240120193709902

  • 微信加密

接口地址 /weichat_encr_data
请求方式 POST

请求效果
在这里插入图片描述

  • 微信解密

接口地址 /weichat_decr_data
请求方式 POST

请求效果
image-20240120193532181

四、源码介绍

有兴趣的小伙伴可以下载源码整合到自己的java项目中,这样可以有效减少http请求。

  • 支付宝 AliProcessData.java
package com.abc.tresff;

import com.abc.tresff.dao.Ali;
import com.abc.tresff.response.Resp;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tencent.mip.DataHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;

@RestController
public class AliProcessData {

   @Autowired
   private Ali configParams;
   private DataHandler dataHandler;
   private String message;

   @PostConstruct
   public void init()
   {
       // DataHandler dataHandler = DataHandler.newInstance(appId, appSecret, publicKey, privateKey); // 初始化
       try
       {
           message+=configParams.getAppid()+"\r\n"+configParams.getApp_secret()+"\r\n"+configParams.getPublic_key()+"\r\n"+configParams.getPrivate_key();
           dataHandler = DataHandler.newInstance (configParams.getAppid(), configParams.getApp_secret(), configParams.getPublic_key(),configParams.getPrivate_key());
           System.out.println("APPID:"+configParams.getAppid());
           System.out.println("APPsecret:"+configParams.getApp_secret());
           System.out.println("Publickey:"+configParams.getPublic_key());
           System.out.println("PrivateKey:"+configParams.getPrivate_key());
       }
       catch(Exception ex)
       {
           //return Resp.error(500,"初始化对象发生了异常"+ex.getMessage());
           message += "初始化对象发生了异常"+ex.getMessage()+message;
       }

   }
   /*
    * 加密函数处理中加密调用
    *
    * */

   @RequestMapping(value = "/ali_encr_data",method= RequestMethod.POST)
   public Resp<JSONObject> EncrData(@RequestBody JSONObject json) {
       try
       {
           dataHandler.setVersion(configParams.getVersion()); // 可以根据需要修改版本号,默认是2.0.0
           String reqData = dataHandler.buildReqData(json);
           return Resp.success(JSON.parseObject(reqData));
       }
       catch(Exception ex)
       {
           return Resp.error(500,"调用业务发生了异常"+ex.getMessage()+message);
       }

   }


   /*
    * 加密函数处理中加密调用
    *
    * */

   @RequestMapping(value = "/ali_deccr_data",method= RequestMethod.POST)
   public Resp<JSONObject> DecrData(@RequestBody JSONObject json){
       try
       {
           dataHandler.setVersion(configParams.getVersion()); // 可以根据需要修改版本号,默认是2.0.0
           String rspData = dataHandler.processRspData(json.toJSONString());
           return Resp.success(JSON.parseObject(rspData));
       }
       catch(Exception ex)
       {
           return Resp.error(500,"调用业务发生了异常"+ex.getMessage());
       }

   }
}

  • 微信 WeichatProcessData.java
package com.abc.tresff;

import com.abc.tresff.dao.Ali;
import com.abc.tresff.dao.Weichat;
import com.abc.tresff.response.Resp;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tencent.mip.DataHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;

@RestController
public class WeichatProcessData {



   @Autowired
   private Weichat configParams;
   private DataHandler dataHandler;
   private String message;

   @PostConstruct
   public void init()
   {
       // DataHandler dataHandler = DataHandler.newInstance(appId, appSecret, publicKey, privateKey); // 初始化
       try
       {
           dataHandler = DataHandler.newInstance (configParams.getAppid(), configParams.getApp_secret(), configParams.getPublic_key(),configParams.getPrivate_key());

       }
       catch(Exception ex)
       {
           //return Resp.error(500,"初始化对象发生了异常"+ex.getMessage());
           message = "初始化对象发生了异常"+ex.getMessage();
       }

   }
   /*
    * 加密函数处理中加密调用
    *
    * */

   @RequestMapping(value = "/weichat_encr_data",method= RequestMethod.POST)
   public Resp<JSONObject> EncrData(@RequestBody JSONObject json) {
       try
       {
           dataHandler.setVersion(configParams.getVersion()); // 可以根据需要修改版本号,默认是2.0.0
           String reqData = dataHandler.buildReqData(json);
           return Resp.success(JSON.parseObject(reqData));
       }
       catch(Exception ex)
       {
           return Resp.error(500,"调用业务发生了异常"+ex.getMessage());
       }

   }


   /*
    * 加密函数处理中加密调用
    *
    * */

   @RequestMapping(value = "/weichat_deccr_data",method= RequestMethod.POST)
   public Resp<JSONObject> DecrData(@RequestBody JSONObject json){
       try
       {
           dataHandler.setVersion(configParams.getVersion()); // 可以根据需要修改版本号,默认是2.0.0
           String rspData = dataHandler.processRspData(json.toJSONString());
           return Resp.success(JSON.parseObject(rspData));
       }
       catch(Exception ex)
       {
           return Resp.error(500,"调用业务发生了异常"+ex.getMessage());
       }

   }
}

五、下载地址

资源下载地址
链接:https://pan.baidu.com/s/1BYSPGRSGZsPJDP7HBQhqLA
提取码:s2mi

为什么我觉得很简单的内容要写这么久。写博客真是太苦了!

在这里插入图片描述

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

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

相关文章

揭秘AI换脸技术:从原理到应用

随着人工智能技术的不断发展&#xff0c;AI换脸技术逐渐成为人们关注的焦点。这项神奇的技术能够将一张图像或视频中的人脸替换成另一张人脸&#xff0c;让人不禁惊叹科技的神奇。那么&#xff0c;AI换脸技术究竟是如何实现的呢&#xff1f;本文将带您深入了解AI换脸技术的原理…

python系列-输入输出关系运算符算术运算符

&#x1f308;个人主页: 会编程的果子君​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 注释的语法 注释的规范 输入输出 通过控制台输出 通过控制台输入 运算符 算术运算符 关系运算符 注释的语法 python中有两种注释风格&#xff1a; 1.注释行&#xff1a;…

无人机打击激光器

激光器的应用非常广泛&#xff0c;涵盖了多个领域。以下是一些主要的激光器应用&#xff1a; 医疗领域&#xff1a;激光器在医疗行业中有着重要应用&#xff0c;比如用于激光手术&#xff08;如眼科手术&#xff09;、皮肤治疗、牙科治疗、肿瘤治疗等。 工业制造&#xff1a;在…

(菜鸟自学)初学脚本编程

&#xff08;菜鸟自学&#xff09;初学脚本编程 Bash脚本概述编写一个测试在线主机的脚本程序 Python脚本概述编写一个与Netcat功能类似的脚本程序 C语言脚本概述编写C语言脚本程序&#xff08;Hello World&#xff09; Bash脚本概述 Bash脚本是一种基于Bash&#xff08;Bourn…

图片批量建码怎么用?每张图片快速生成二维码

当我们需要给每个人分别下发对应的个人证件类图片信息&#xff0c;比如制作工牌、荣誉展示或者负责人信息展示时&#xff0c;现在都开始使用二维码的方法来展示员工信息。那么如何快速将每个人员的信息图片分别制作成二维码图片呢&#xff0c;最简单的方法就是使用图片批量建码…

vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

文章目录 一、v-model是什么二、什么是语法糖三、v-model常见的用法1、对于输入框&#xff08;input&#xff09;&#xff1a;2、对于复选框&#xff08;checkbox&#xff09;&#xff1a;3、对于选择框&#xff08;select&#xff09;&#xff1a;4、对于组件&#xff08;comp…

群发邮件效果追踪:掌握数据,优化营销策略

我们在邮件群发结束后&#xff0c;如果想要了解到这次群发活动的效果怎么样&#xff0c;就需要通过一些数据。比如说邮件达到率、打开率、跳出率、退订率等。这些信息可以将收件人的行为数据化&#xff0c;让我们可以更清晰地对活动进行深入分析让我们及时地找出问题和优点&…

C语言数据结构——顺序表

&#xff08;图片由AI生成&#xff09; 0.前言 在程序设计的世界里&#xff0c;数据结构是非常重要的基础概念。本文将专注于C语言中的一种基本数据结构——顺序表。我们将从数据结构的基本概念讲起&#xff0c;逐步深入到顺序表的内部结构、分类&#xff0c;最后通过一个实…

网络安全:守护数字世界的盾牌

在当今数字化的时代&#xff0c;网络已经渗透到我们生活的方方面面。从社交媒体到在线银行&#xff0c;从在线购物到工作文件传输&#xff0c;网络几乎无处不在。然而&#xff0c;随着网络的普及&#xff0c;网络安全问题也日益凸显。那么&#xff0c;如何确保我们的数字资产安…

Vue2的双向数据绑定

Vue2的双向数据绑定 Observer&#xff1a;观察者&#xff0c;这里的主要工作是递归地监听对象上的所有属性&#xff0c;在属性值改变的时候&#xff0c;触发相应的watcher。 Watcher&#xff1a;订阅者&#xff0c;当监听的数据值修改时&#xff0c;执行响应的回调函数&#x…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的&#xff0c;所以所有的部署操…

【Github搭建网站】零基础零成本搭建个人Web网站~

Github网站&#xff1a;https://github.com/ 这是我个人搭建的网站&#xff1a;https://xf2001.github.io/xf/ 大家可以搭建完后发评论区看看&#xff01;&#xff01;&#xff01; 搭建教程&#xff1a;https://www.bilibili.com/video/BV1xc41147Vb/?spm_id_from333.999.0.0…

2023.12 电子学会青少年软件编程(Python) 等级考试试卷(三级)

2023年12月 电子学会青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 38 一、单选题(共 25 题&#xff0c; 共 50 分) 1. 一个非零的二进制正整数&#xff0c; 在其末尾添加两个“0” &#xf…

【排序算法】六、快速排序(C/C++)

「前言」文章内容是排序算法之快速排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 快速排序1.1 原理1.2 Hoare版本&#xff08;单趟&#xff09;1.3 快速排序完整代码&…

70.Redis缓存优化实践(基于分类树场景)

文章目录 前言第一次优化第二次优化第三次优化第四次优化第五次优化 前言 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在电商系统中。 而在实际工作中&#xff0c;这样一个分类树查询&#xff0c;我们都不断的改进了好几次。这是为什么呢&…

Lite AD的安装

1、Lite AD的安装及配置 Lite AD流程&#xff1a; &#xff08;1&#xff09;创建一个新的Windows 10&#xff0c;安装tools&#xff0c;再安装ITA组件&#xff08;安装Lite AD会自动安装VAG/VLB&#xff09; &#xff08;2&#xff09;创建一个新的Windows 10&#xff0c;安…

【GNN报告】“青源Talk”-图可信学习与图大模型研究进展

北航王啸-图自监督学习 简介 介绍 浙大杨洋-探索大图模型预训练 总括 介绍 参考 Yang Yang - Zhejiang University dgraph-web DGraph: ALarge-Scale Financial Dataset for Graph Anomaly Detection All in One: Multi-task Prompting for Graph Neural Networks&#xf…

Spring Boot实现统一异常处理的技术解析

引言 在软件开发过程中&#xff0c;异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题&#xff0c;提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架&#xff0c;提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍…

神器yakit之web fuzzer功能

前言 yakit并不像burp一样单独设置爆破模块&#xff0c;但是yakit也是可以爆破的&#xff0c;并且更好用&#xff08;个人感觉&#xff09;。 手工测试场景中需要渗透人员对报文进行反复的发送畸形或者特定的payload进行查看服务器的反馈并以此来进行下一步的判断。 Fuzz标签便…

动态规划:完全背包问题

本题力扣上没有&#xff0c;是刷的卡码网第52题52. 携带研究材料感兴趣的小伙伴可以去刷一下&#xff0c;是ACM模式。 题目&#xff1a; 题目描述&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带…