对接建行支付

article/2025/10/6 6:21:39

              前两篇文章介绍了对接微信支付和农行支付的方法,这篇文章介绍一下建行支付。

使用场景:

        在微信公众号中调用微信付款,或者公众号内页面调用龙支付或者H5页面支付。

一、微信支付

        参考建行给的接口文档

 交易流程如下:

 按照接口要求拼接参数之后,使用post方式提交参数到https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?CCB_IBSVersion=V6,示例代码如下:

public Map<String, String> ccbWxOrder(String orderNo, String openId, String totalFee, String body) {try {//请求建行平台String url = URL + "&" + getPayRequestStr(orderNo, NumberUtil.roundStr(Double.parseDouble(totalFee) / 100, 2), openId, body, "wx");String post = HttpRequest.post(url).execute().body();System.out.println("建行微信下单步骤1:" + post);Map<String, String> map = JsonHelper.jsonToBean(Map.class, post);if ("true".equals(map.get("SUCCESS"))) {//请求成功String payUrl = map.get("PAYURL");System.out.println("payUrl:" + payUrl);String s = HttpClientUtil.get(payUrl);System.out.println("建行微信下单请求步骤2:" + s);Map<String, String> result = JsonHelper.jsonToBean(Map.class, s);if ("000000".equals(result.get("ERRCODE"))) {//下单成功return result;} else {log.info("建行微信支付下单接口二阶段请求失败,原因:{}", result.get("ERRMSG"));}} else {//请求失败log.info("建行微信支付下单接口一阶段请求失败");}} catch (Exception e) {log.error("建行微信请求下单异常:{}", e);}return new HashMap<>();}

//拼接请求参数,上面是微信下单接口参数,下面是龙支付h5请求参数
public String getPayRequestStr(String orderId, String money, String openId, String body, String type) {String str = "";if ("wx".equals(type)) {str = "MERCHANTID=" + MERCHANTID + "&POSID=" + POSID + "&BRANCHID=" + BRANCHID + "&ORDERID=" + orderId + "&PAYMENT="+ money + "&CURCODE=01&TXCODE=530590&REMARK1=&REMARK2=&TYPE=1&PUB=" + PUB.substring(PUB.length() - 30) +"&GATEWAY=0&CLIENTIP=39.101.1.11&REGINFO=&PROINFO=" + "&REFERER=&TRADE_TYPE=JSAPI&SUB_APPID=" + systemConfig.getGzhAppId()+ "&SUB_OPENID=" + openId;} else {str = "MERCHANTID=" + MERCHANTID + "&POSID=" + POSID + "&BRANCHID=" + BRANCHID + "&ORDERID=" + orderId + "&PAYMENT="+ money + "&CURCODE=01&TXCODE=SDK005&REMARK1=&REMARK2=&TYPE=1&PUB=" + PUB.substring(PUB.length() - 30) +"&GATEWAY=0&CLIENTIP=39.101.1.11&REGINFO=&PROINFO=" + "&REFERER=";}String MAC = MD5Helper.MD5Encode(str);return str.replaceAll("&PUB=" + PUB.substring(PUB.length() - 30), "") + "&MAC=" + MAC;}

接收返回参数如下,按照要求就可以调起微信支付控件进行支付了。

 二、建行龙支付H5

        这个很简单,示例代码如下:

public String ccbDragonOrder(String orderNo, String totalFee, String body) {String dragonUrl = URL + "&" + getPayRequestStr(orderNo, NumberUtil.roundStr(Double.parseDouble(totalFee) / 100, 2), null, body, "dragon");System.out.println(dragonUrl);return dragonUrl;}

拿到接口的url直接访问就行了。注意,H5龙支付需要建行设置商户白名单,否则就是这样

 三、建行支付回调

        首先需要在建行商户后台设置通知地址(具体路径:商户服务平台-服务管理-实时反 馈地址修改)。建行会对返回参数进行数字签名,商户接收到建行发送的商户通知后,需要对接收到的参数数据进行数字签名的验签。建行有SDK提供(netpay.jar)。示例代码如下:

 @RequestMapping(value = "/ccb.api")public void ccbNotify(@RequestBody String str){System.out.println("-------接收到建行回调信息------"+str);commonPayService.ccbNotify(str);}
public void ccbNotify(String str) {String now = DateUtil.now();//签名校验String[] split = str.split("&SIGN=");String src = split[0];String sign = split[1];RSASig rsaSig = new RSASig();rsaSig.setPublicKey(PUB);boolean b = rsaSig.verifySigature(sign, src);if (b) {//签名验证成功Map<String, String> map = new HashMap<>();Arrays.stream(src.split("&")).map(s -> s.split("=")).filter(v -> v.length > 1).forEach((m) -> map.put(m[0], m[1]));//商户柜台代码String posId = map.get("POSID");//分行代码String branchId = map.get("BRANCHID");//订单号String orderId = map.get("ORDERID");//付款金额(元转分)String payment = Double.parseDouble(map.get("PAYMENT")) * 100 + "";//币种String curCode = map.get("CURCODE");//账户类型String accType = map.get("ACC_TYPE");//成功标志String success = map.get("SUCCESS");//接口类型String type = map.get("TYPE");//客户端IPString clientIp = map.get("CLIENTIP");//系统记账日期String accDate = map.get("ACCDATE");                      //处理订单,业务逻辑} else {log.error("建行支付回调验签失败------{}", now);}}

四、退款、查询订单

        建行这点很变态的,订单查询和退款需要额外部署一个外联平台,大致就是发送一笔退款请求到外联平台,然后外联平台转发给建行服务器,建行服务器处理请求之后告诉外联平台,然后外联平台再通知商户,等于通过外联平台中转了一下。外联平台的部署参考:

外联平台的一些功能在这里面都有说明的,按照要求来做就行了


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

相关文章

聚合支付介绍—简单明了一目了然

现在大家去买东西&#xff0c;支付宝和微信已经成为必备的支付工具了。商超、饭馆、菜场、打车、坐公交、去医院等&#xff0c;几乎都可以使用支付宝或者微信。随着移动支付的迅猛普及&#xff0c;一种新型的支付方式开始流行&#xff0c;这就是聚合支付。 什么是聚合支付&…

什么是聚合支付?

关于这个问题&#xff0c;相信有不少商家仍保有疑惑&#xff0c;甚至更多的人对它闻所未闻。和扫码支付一样&#xff0c;聚合支付已经融入大多数人的生活&#xff0c;同时也成为了未来的趋势。 聚合支付也被称为融合支付&#xff0c;是指借助银行、非银支付机构或清算组织的支付…

记录IDEA导包不能导入的问题

记录IDEA导包不能导入的问题 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;…

电脑重启后IDEA导包报错

电脑重启后IDEA导包报错

Idea的自动导包设置

idea的自动导包对jdk1.8有时候不是很管用。但是对高版本的jdk很有用&#xff0c;比如jdk17。当然这些的前提是&#xff0c;必须是要导包的类只有一个包&#xff0c;如果有 多个包中都有相同的类名的话&#xff08;如&#xff1a;java.util.Date和java.sql.Date&#xff09;&…

Idea导包自动去除Import xxx.*里的星号

一、打开Idea > File > Settings 二、在settings界面中依次打开Editor>Code Style>Java&#xff0c;在Scheme下拉框中选择Default 1.将Class count to use import with ‘*’ &#xff08;导入同一个包的类超过该数值时自动变为 *&#xff09;的值改成99 2.将Nam…

idea中导包方法

目录 java SE &#xff08;idea 中添加jar包)java EE (idea 2020.3 中添加架包) java SE &#xff08;idea 中添加jar包) 新建一个java se项目 在src文件下新建一个package,名字任意 然后把想要添加的jar包粘贴进去 对该文件右键&#xff0c;选择add as library ok就完事了…

idea自动导包错误

最近在使用idea时由于错误操作&#xff0c;导致我在new List子类时报错&#xff0c;查看导入后发现是如下错误 import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List; 解决方式如下&#xff1a; 点击 idea菜单栏的 file -> settings -> General -> Auto …

解决IDEA导包时自动使用*号替代具体类名问题

一、问题 开发过程中IDEA导包时会自动使用*号替代具体类名&#xff0c;后期有编码要求显示引用的具体类型的需要 默认导包格式>>> 需要的导包格式>>> 二、解决办法 1、更改IDEA默认的Class count to use import with *‘为99 2、自动替换项目中所有使用*表…

Idea导包正确还是显示标红(错误)

问题描述 idea引入新的类&#xff0c;import不了&#xff0c;依赖都是正确的&#xff0c;手动加入import还是标红&#xff0c;但是编译、打包都是通过的。 解决方案 方案一 更新一下Maven&#xff0c;可能是因为没有更新Maven&#xff0c;所以依赖不存在&#xff0c;这种情…

关于IDEA导包出现错误,爆红的情况

Cannot resolve symbol WorkreportService&#xff0c;也就是导包爆红 如果JDK和Maven都设置没问题的话&#xff0c;清理IDEA的缓存 “File” -> “Invalidate Caches / Restart”&#xff0c;然后点击对话框中的 “Invalidate and Restart”&#xff0c;清空 cache 并且重…

Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号

Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号 一、问题描述 1、在使用idea开发时&#xff0c;经常会出现导入的包自动变成 xx.*的情况&#xff0c;比如下面代码&#xff1a; public String read(MultipartFile file) throws IOException…

JAVA的使用idea导包

最近我在学java&#xff0c;对Java也非常无奈&#xff0c;为了让大家避坑&#xff0c;我提出了几点建议&#xff0c;希望对你们有帮助。 1.如果下载jdk&#xff0c;eclipse的话&#xff0c;建议去网上搜一下下哪个版本&#xff0c;可以不用下最新的 2.初期可能会让你们用cmd运行…

idea导包失败解决

两种失败的表现 1.pom爆红 2.pom没问题&#xff0c;但是点开源码无法查看 可以尝试的几种方式 解决&#xff1a; 1.搜索.lastUpdated后缀的文件&#xff0c;删除对应的包名&#xff0c;重新下载 .lastUpdated文件是下载失败后的遗留文件 2.删除maven本地仓库中报错的jar包…

IntelliJ IDEA中包的导入以及注意事项

包&#xff08;package&#xff09;的导入及注意事项 文章目录 IntelliJ IDEA中包的导入前言一、包&#xff08;package&#xff09;的导入二、包&#xff08;package&#xff09;导入的注意事项 1.导包的具体操作2.导包的注意事项总结 前言 例如&#xff1a;随着JAVA语言的不…

NodeList和HTMLCollection

首先NodeList和HTMLCollection都是DOM节点的集合。 NodeList中包含的节点类型可能是Element/Text/Comment/Document/DocumentFragment等&#xff0c;我们知道nodeType的种类有12种。NodeList由Node.childNodes和document.querySelectorAll()返回&#xff0c;不同的是node.Chil…

nodelist与HTMLCollection

转自&#xff1a;http://www.jianshu.com/p/f6ff5ebe45fd 这篇博客起源于我对一道作业题的思考&#xff0c;在DOM课程中&#xff0c;第二道作业题是&#xff1a; elem.children和elem.childNodes的区别&#xff1f; 那么这两者的区别究竟是什么呢&#xff1f;当时我在回答的时候…

HTMLCollection vs NodeList

原文地址&#xff1a;HTMLCollection vs NodeList 作者&#xff1a;HungerLyndon 来源&#xff1a;简书 正文 >>> 引文 这篇博客起源于我对一道作业题的思考&#xff0c;在DOM课程中&#xff0c;第二道作业题是&#xff1a; elem.children和elem.childNodes的区别&…

php nodelist,了解NodeList、HTMLCollection以及NamedNodeMap的使用(代码)

本篇文章给大家带来的内容是关于了解NodeList、HTMLCollection以及NamedNodeMap的使用(代码)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。 这三个都是类数组对象。HTMLCollection只包含元素节点&#xff0c;而NodeList包含…

ArrayList转NodeList

废物不多说&#xff0c;直接上代码 let oldList let toNodeList function (arrayOfNodes) {let fragment document.createDocumentFragment();arrayOfNodes.forEach(function (item) {fragment.appendChild(item.cloneNode());});return fragment.childNodes;};let playLisT…