springboot整合银联支付B2C

article/2025/10/9 0:44:27

springboot整合银联支付B2C

前期准备

需要注册银联,登录,下载相关的sdk
这里是整合B2C
在这里插入图片描述

注册,登录

注册登录地址

https://open.unionpay.com/tjweb/login

下载sdk

sdk下载地址:

https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=448

下载完之后,点击我要测试
在这里插入图片描述

在这里插入图片描述

获取证书及商户号

在测试参数里,把那6个证书下载下来。
商户号也复制出来。替换掉代码里原来的
在这里插入图片描述

整合代码

创建项目

创建一个springboot项目,将官方的一些个类复制过去,并处理下(需要导入jar包,修改类路径等)
把下面红框里的类复制到新的boot项目中
在这里插入图片描述

复制好如下:
在这里插入图片描述

pom.xml

主要是加了commons-codec和org.slf4j

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zjy</groupId><artifactId>pay</artifactId><version>0.0.1-SNAPSHOT</version><name>pay</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.31</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
添加jar包

在这里插入图片描述

下载下来的sdk会带几个jar包。把他们添加到boot项目中就好
单加上这两个依赖还不足以启动服务。还是会报错。还得需要添加官网自带的jar包
在这里插入图片描述

修改配置文件

将acp_sdk.properties配置文件里的证书路径,改成之前下载好的证书路径
在这里插入图片描述

修改application.properties

server.port=2080

RunConfig

创建RunConfig。主要是启动项目的时候加载acp_sdk.properties里的一些相关配置

package com.zjy.pay.config;import com.zjy.pay.utils.SDKConfig;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Component
@Order(value = 1)
public class RunConfig implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {SDKConfig.getConfig().loadPropertiesFromSrc();}
}
PayController

其实主要是把原来的doPost方法拿过来就可以了。
注意:商户ID换成自己测试的就可以

package com.zjy.pay.controller;import com.zjy.pay.bean.DemoBase;
import com.zjy.pay.utils.AcpService;
import com.zjy.pay.utils.LogUtil;
import com.zjy.pay.utils.SDKConfig;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/pay")
public class PayController {/*** 银联支付,只是把原来的doPost方法拿过来了* @param txnAmt	金额 单位是分* @throws ServletException* @throws IOException*/@RequestMapping("/yinglian")public void yinglian(@RequestParam String txnAmt, HttpServletResponse resp) throws IOException {resp.setContentType("text/html; charset="+ DemoBase.encoding);String merId = "自己的测试商户ID";Map<String, String> requestData = new HashMap<String, String>();/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/requestData.put("version", DemoBase.version);   			  //版本号,全渠道默认值requestData.put("encoding", DemoBase.encoding); 			  //字符集编码,可以使用UTF-8,GBK两种方式requestData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法requestData.put("txnType", "01");               			  //交易类型 ,01:消费requestData.put("txnSubType", "01");            			  //交易子类型, 01:自助消费requestData.put("bizType", "000201");           			  //业务类型,B2C网关支付,手机wap支付requestData.put("channelType", "07");           			  //渠道类型,这个字段区分B2C网关支付和手机wap支付;07:PC,平板  08:手机/***商户接入参数***/requestData.put("merId", merId);    	          			  //商户号码,请改成自己申请的正式商户号或者open上注册得来的777测试商户号requestData.put("accessType", "0");             			  //接入类型,0:直连商户requestData.put("orderId",DemoBase.getOrderId());             //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则requestData.put("txnTime", DemoBase.getCurrentTime());        //订单发送时间,取系统时间,格式为yyyyMMddHHmmss,必须取当前时间,否则会报txnTime无效requestData.put("currencyCode", "156");         			  //交易币种(境内商户一般是156 人民币)requestData.put("txnAmt", txnAmt);             			      //交易金额,单位分,不要带小数点//requestData.put("reqReserved", "透传字段");        		      //请求方保留域,如需使用请启用即可;透传字段(可以实现商户自定义参数的追踪)本交易的后台通知,对本交易的交易状态查询交易、对账文件中均会原样返回,商户可以按需上传,长度为1-1024个字节。出现&={}[]符号时可能导致查询接口应答报文解析失败,建议尽量只传字母数字并使用|分割,或者可以最外层做一次base64编码(base64编码之后出现的等号不会导致解析失败可以不用管)。requestData.put("riskRateInfo", "{commodityName=测试商品名称}");//前台通知地址 (需设置为外网能访问 http https均可),支付成功后的页面 点击“返回商户”按钮的时候将异步通知报文post到该地址//如果想要实现过几秒中自动跳转回商户页面权限,需联系银联业务申请开通自动返回商户权限//异步通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知requestData.put("frontUrl", DemoBase.frontUrl);//后台通知地址(需设置为【外网】能访问 http https均可),支付成功后银联会自动将异步通知报文post到商户上送的该地址,失败的交易银联不会发送后台通知//后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知//注意:1.需设置为外网能访问,否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码//    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200,那么银联会间隔一段时间再次发送。总共发送5次,每次的间隔时间为0,1,2,4分钟。//    5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败requestData.put("backUrl", DemoBase.backUrl);// 订单超时时间。// 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。// 此时间建议取支付时的北京时间加15分钟。// 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。requestData.put("payTimeout", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date().getTime() + 15 * 60 * 1000));//////       报文中特殊用法请查看 special_use_purchase.txt/////**请求参数设置完毕,以下对请求参数进行签名并生成html表单,将表单写入浏览器跳转打开银联页面**/Map<String, String> submitFromData = AcpService.sign(requestData,DemoBase.encoding);  //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。String requestFrontUrl = SDKConfig.getConfig().getFrontRequestUrl();  //获取请求银联的前台地址:对应属性文件acp_sdk.properties文件中的acpsdk.frontTransUrlString html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData,DemoBase.encoding);   //生成自动跳转的Html表单LogUtil.writeLog("打印请求HTML,此为请求报文,为联调排查问题的依据:"+html);//将生成的html写到浏览器中完成自动跳转打开银联支付页面;这里调用signData之后,将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改,如果修改会导致验签不通过resp.getWriter().write(html);}
}
PayApplication

创建boot项目自动生成的。没有修改

package com.zjy.pay;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class PayApplication {public static void main(String[] args) {SpringApplication.run(PayApplication.class, args);}}

到此代码就粘完了。启动项目开始测试

测试

方法一

启动项目。postman请求,会返回一个html
在这里插入图片描述

将html复制出来。放到boot项目中的.html文件中,再用浏览器打开
在这里插入图片描述

打开浏览器,直接跳转到支付页面
在这里插入图片描述

付款

付款卡号,参考测试参数里的信息
在这里插入图片描述

支付成功!

在这里插入图片描述

方法二

还有种更简单的,直接在浏览器访问:
http://localhost:2080/pay/yinglian?txnAmt=50
会直接跳到付款页面。

在测试交易中查询刚才的交易信息,可以查到!
在这里插入图片描述

至此测试OK!
欢迎大神指导,可以留言交流!

======================
本人原创文章,转载注明出入!

=================


http://chatgpt.dhexx.cn/article/rM6FtYNU.shtml

相关文章

银联支付接口申请流程-傲付宝

公司的业务主要是帮企业申请各种支付接口&#xff0c;申请得多就慢慢熟悉了一些门道&#xff0c;其实银联支付申请还是比较简单的&#xff08;不用上传app截图什么的&#xff09;&#xff0c;只是申请比较难&#xff0c;还有填写的资料比较多。下面我给大家介绍下银联支付接口中…

PHP对接银联电子支付接口开发

PHP对接银联电子支付接口开发 提示:https://service.chinapay.com/OSIWeb/plogin/toLogin.action#银联在线,注册用户,签约成为商户。成为商户后银联会发邮件到你的邮箱,内容有插件、企业门户控台证书申请、logo、cp.cer、商户接入手册,和商户号ID。 企业门户控台证书申请…

PHP银联支付接口

同事整理的银联支付接口&#xff1a; 链接&#xff1a;http://pan.baidu.com/s/1boMJ2z1 密码&#xff1a;qxcx 1.首先导入Api银联支付接口到项目的Aip目录下。 2.前端创建如下相对应页面 2-1 2-2 3.填写如上图2-2的真实个人信息数据。发form表单或者ajax到后台方法中。 如下图…

银联支付接口+支付宝接口统一支付功能

这个demo发出来已经比较久了&#xff0c;后面发现陆续还有同学找到我&#xff0c;我这里说下现在的情况。 这个接口中的银联支付接口实际也是走的支付宝接口&#xff0c;不需要单独申请银联了。但是&#xff01;支付宝的这个接口已经下架了&#xff0c;以前已经接入的此接口还可…

#DNS比较(北京联通宽带) @FDDLC

阿里&#xff1a;223.5.5.5 腾讯&#xff1a;119.29.29.29 百度&#xff1a;180.76.76.76 北京联通&#xff1a;202.106.46.151 北京联通&#xff1a;202.106.195.68

牛啊,全国DNS服务器IP地址都在这里了

各省公共DNS服务器IP大全 欢迎关注微信公众号【厦门微思网络】。www.xmws.cn专业IT认证培训19周年主要课程&#xff1a;思科、华为、红帽、ORACLE、VMware、CISP、PMP等认证培训及考证 名称各省公共DNS服务器IP大全114 DNS114.114.114.114114.114.115.115阿里 AliDNS223.5.5.52…

教育网系统服务器域名地址,北京教育网dns服务器地址

北京教育网dns服务器地址 内容精选 换一换 默认部署在VPC下的应用可以调用API。如果域名解析失败&#xff0c;则参考配置内网DNS&#xff0c;在当前终端节点上配置DNS服务器。配置完成后&#xff0c;部署在VPC下的应用可以调用API。配置DNS需要配置“/etc”目录下的resolv.conf…

全国DNS地址大全

电信DNS&#xff1a; 北京DNS地址&#xff1a; 202.96.199.133 202.96.0.133 202.106.0.20 202.106.148.1 202.97.16.195 上海DNS地址&#xff1a; 202.96.199.132 202.96.199.133 202.96.209.5 202.96.209.6 202.96.209.133 天津DNS地址&#xff1a; 202.99.96.68 10.10.64.68…

【EtherCAT】基础概念

一、定义 EtherCAT&#xff08;以太网控制自动化技术&#xff09;是最初由德国倍福&#xff08;Beckhoff&#xff09;公司开发的实时&#xff08;real—time&#xff09;工业以太网&#xff08;Ethernet&#xff09;技术&#xff0c;它是一种以以太网为基础的现场总线系统&…

EtherCAT是如何工作的

来源https://blog.csdn.net/u014311679/article/details/90713554 若有侵权&#xff0c;请联系删除。 这次讨论一下ETHERCAT是如何工作的&#xff1a; 应用层-数据链路层-物理层 物理层&#xff1a; RJ45标准连接器&#xff1b;TX to FX转换器&#xff1b;LVDS&#xff1a;低电…

IgH详解十、EtherCAT DC(1)理论

(Distributed Clocks) 分布式时钟 分布式时钟相当于每个节点都有一个时钟&#xff0c;在同一时刻&#xff0c;触发所有节点做给定的动作&#xff0c;要达到同一时刻触发就要求大家的时钟保持一致&#xff0c;也就是同步。 比如每个人都有手机&#xff0c;只要手机接入网络&…

EtherCAT 之邮箱

EtherCAT特点 由于工作需要&#xff0c; 最近在学习EtherCAT总线&#xff0c;对于主站和从站的通信&#xff0c;发表一下我个人的理解。 1. EtherCAT为保证低延迟高响应&#xff0c;不可能像MODBUS一样用软件解析数据包再转发的模式&#xff0c;而是采用“高速火车”不停车上下…

IgH详解八、EtherCAT SDO原理

主站通过使用 SDO对对象字典进行读取/写入操作,完成对从站设备进行参数设置&#xff64;状态监视等&#xff61; 从站SDO的读写是非实时的&#xff0c;所以需要多次访问来确保数据操作的正确性。 如下图写入操作&#xff0c;主站把数据发送到从站&#xff0c;从站返回WC确保数…

Ethercat学习笔记

1、EtherCAT原理介绍 EtherCAT从站设备在报文经过其节点时读取相应的数据报文&#xff0c;同样输入数据也是在报文经过时插入到报文中。整个过程报文只有几纳秒的时间延迟&#xff0c;实时性获得极大提高 EtherCAT作为一种工业以太网总线&#xff0c;充分利用了以太网的全双工…

igh ethercat主站文档(中文翻译上)

此翻译主要是用翻译软件翻译&#xff0c;部分自己修改&#xff0c;若有不当之处&#xff0c;可以下方评论或私聊我提醒修改&#xff0c;若转载&#xff0c;请注明出处 本文是&#xff11;&#xff0d;&#xff14;章节。 1 The IgH EtherCAT Master 本章介绍有关EtherCAT主站…

EtherCAT设备协议详解五、Modular Device Profile

ETG.5001.1: General MDP Device ModelETG5001定义了通用的模块设备模型&#xff0c;现在远程可扩展的IO模块基本都使用本协议实现 从总线上看是一个从站&#xff0c;实际上可以扩展多个卡片式IO模块 一个从站对应多个插槽&#xff0c;插槽可随机插入不同型号的卡片IO&#xff…

[工业互联-17]:常见EtherCAT主站与实现方法

目录 第1章 EtherCAT入门 1.1 简介 1.2 EtherCAT通信架构 第2章 EtherCAT主站方案 2.1 方案概述 2.2 主站配置步骤 2.3 EtherCAT主站软件 第3章 Windows操作系统支持EtherCAT的基本步骤 第4章 常见主站软件介绍&#xff1a;TwinCAT 4.1 简介 4.2 软件架构 4.3 应…

EtherCAT设备协议详解二、EtherCAT状态机及配置流程

EtherCAT状态机&#xff08;ESM&#xff09; EtherCAT状态机定义了每个EtherCAT从站设备的分步设置&#xff0c;并指示了可用的功能。设备可以拒绝来自主站的状态请求&#xff0c;并通过错误指示&#xff08;AL 状态寄存器中的错误标志&#xff09;和相关错误代码&#xff08;A…

Ethercat解析(十一)之分布时钟

驱动代码中&#xff0c;同步时钟涉及到如下几个概念&#xff1a; ⑴ 本地时钟&#xff1a;每一个支持DC的从站都有一个纳秒级分辨率的本地时钟寄存器。 每次从机上电&#xff0c;则寄存器从0开始计时&#xff0c;这就意味着不同的从机因为上电开机的时间不同而本地时钟也会有…

EtherCAT简介

EtherCAT&#xff08;用于控制自动化技术的以太网&#xff09;是Beckhoff&#xff08;倍福&#xff09;在2003年开发的实时以太网网络。它基于CANOPEN协议和以太网&#xff0c;但是与Internet通信或网络通信不同之处在于&#xff0c;它专门针对工业自动化控制进行了优化。这些标…