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

2024-01-21 03:12

本文主要是介绍医保移动支付加密解密请求工具封装【国密SM2SM4】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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

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

定点医药机构向地方移动支付中心发起费用明细上传、支付下单、医保退费等交易时需要发送密文,由于各大医疗机构厂商的开发语各不相同,可能要有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 {@Autowiredprivate Ali configParams;private DataHandler dataHandler;private String message;@PostConstructpublic 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.0String 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.0String 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 {@Autowiredprivate Weichat configParams;private DataHandler dataHandler;private String message;@PostConstructpublic 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.0String 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.0String 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

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

在这里插入图片描述

这篇关于医保移动支付加密解密请求工具封装【国密SM2SM4】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628200

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须