对接建行支付

news2025/8/7 3:23:13

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

使用场景:

        在微信公众号中调用微信付款,或者公众号内页面调用龙支付或者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 = "/ccbNotify.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");
            //客户端IP
            String clientIp = map.get("CLIENTIP");
            //系统记账日期
            String accDate = map.get("ACCDATE");                      
                 
            //处理订单,业务逻辑
               
           
        } else {
            log.error("建行支付回调验签失败------{}", now);
        }
    }

四、退款、查询订单

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

 

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

 

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

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

相关文章

sync_binlog和innodb_flush_log_at_trx_commit的区别

innodb_flush_log_at_trx_commi 这个指的是写redo及后续操作&#xff0c;ib_logfile这个文件的刷新方式。 sync_binlog纯粹指的是binlog &#xff0c;如 mysql-bin0003等。 基于innodb_flush_log_at_trx_commit 的三个参数的解释。 Innodb_flush_log_at_trx_commit 0 redolo…

代码随想录59——单调栈:503下一个更大元素II、42接雨水

文章目录1.503下一个更大元素II1.1.题目1.2.解答2.42接雨水2.1.题目2.2.解答2.2.1.双指针for循环解法2.2.3.单调栈解法1.503下一个更大元素II 参考&#xff1a;代码随想录&#xff0c;503下一个更大元素II&#xff1b;力扣题目链接 1.1.题目 1.2.解答 做本题之前建议先做 73…

Spring Boot 集成freemarker模板引擎

前言 J2EE的领域中包含5大引擎&#xff0c;分别为模板引擎、流程引擎、搜索引擎、规则引擎、报表引擎。每种引擎都能解决某一方面的问题&#xff0c;模板引擎解决的是用户界面与业务数据分离&#xff0c;流程引擎解决的是驱动业务按照一定的流程执行&#xff0c;搜索引擎解决的…

局部线性分析(机器学习)

目录 局部线性嵌入&#xff08;LLE&#xff09; 局部线性嵌入&#xff08;LLE&#xff09;算法的主要步骤分为三步 效果如下 局部线性嵌入&#xff08;LLE&#xff09; 局部线性嵌入&#xff08;LLE&#xff09;是一种非线性降维算法 它能够使降维后的数据较好地保持原有流…

大学生HTML个人网页作业作品:基于html css实现围棋网页(带报告4800字)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

动静态链接动静态库制作与使用

前置知识 程序的编译与链接&#xff1a;动静态库属于程序链接阶段的概念&#xff0c;如果对程序的编译链接过程不太熟悉&#xff0c;可以先看一下着篇文章gcc&动静态链接&#xff1a;这篇文章讲解了如何在Linux环境下用gcc完成编译链接的每一步操作 链接库 在链接的过程…

Java对象内存结构和创建过程

文章目录对象的内存布局对象头Mark WordKlass Pointer实例数据对齐数据对象的创建总结对象的内存布局 我们的对象一般存储在我们的堆内存中&#xff0c;我们把实例对象可以划分为对象头&#xff0c;实例数据&#xff0c;对齐填充 对象头&#xff08;object header&#xff09…

SpringBoot+Vue项目流浪狗领养管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

图像运算和图像增强十

图像运算和图像增强十 图像锐化之 Sobel、Laplacian 算子实现边缘检测 &#xff08;1&#xff09;Sobel算子(一阶微分算子) Sobel算子是一种用于边缘检测的离散微分算子&#xff0c;它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值&#xff0c;根据图像边缘旁…

top命令应用(查看进程实时动态信息)

记录&#xff1a;321 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;top命令是查看进程实时动态信息工具。查看进程状态、进程使用内存状况、进程使用CPU状况、进程PID等。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 1.top命令介绍 top命令&#xff0c;查看…

内存、指针与数组

C语言的指针可以当成一个特殊的数据类型&#xff08;像int一样的数据类型&#xff09;&#xff0c;可以说其唯一的作用就是为了存储地址&#xff0c;其他的都可以当作它的衍生用法。 指针的诸多功能都是基于其能直接操作指定内存空间存储的值&#xff0c;每个程序运行都会由操作…

git新建仓库提交项目代码+常用命令

一&#xff1a;新建仓库 输入一下仓库名称&#xff0c;归属和路径都是生成的不需要自己去编辑 点击创建就创建了一个新的仓库&#xff0c;下面就是仓库刚创建好的样子 二&#xff1a;向仓库里提交项目代码 首先打开你要提交的项目文件&#xff1a; 根据官方的提示去提交代码&…

Linux:shell编程2(内含:1.设置环境变量+2.位置参数变量+3.预定义变量+运算符+4.条件判断)

写在开头&#xff1a; 小技巧&#xff1a;除了赋值不加空格&#xff0c;其他的&#xff0c;例如是[ ] ()等都需要空格&#xff01; 1.设置环境变量&#xff1a; 注&#xff1a;类似于C语言全局变量 案例1&#xff1a;在/etc/profile文件中定义TOMCAT_HOME环境变量。 解释&…

洛谷 模拟 普及-

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;一、快乐水&#x1f914;一、题意及思路:&#x1f60e;二、源码&#xff1a;&#x1f62e;三、代码分析&#xff1a;&#x1f4a5;二、漂亮的绝杀&#x1f914;一、题意及思路:&#x1f60e;二、源码&#xff1a;&…

小学生python游戏编程arcade----坦克大战2

小学生python游戏编程arcade----坦克大战2前言多摄象头显得分&#xff0c;title地图加载&#xff0c;精灵分层管理&#xff0c;移动精灵1、提示框制作1.1养眼绿色1.2 画距形提示框1.3 效果图1.4 提示框加提示2、子弹计数问题2.1 初始时给一定的子弹量2.2 发射子弹时进行控制2.3…

hevc 半像素

1 分数像素精度运动估计 物体在连续帧间的运动是连续的&#xff0c;而像素本身是离散的&#xff0c;这种现象带来了一个问题&#xff0c;当前帧中图像块的最佳参考块不一定位于参考帧的证书像素点位置&#xff0c;为了更加精确的预测当前带编码的图像块&#xff0c;有必要在非整…

海运整柜出口操作流程有哪些注意事项?

货物运输时&#xff0c;海运是一种非常常见的形式&#xff0c;根据货物的不同&#xff0c;海运也有很多形式的货物装运&#xff0c;海运整柜就是其中之一。 海运整柜大致分为20GP/40/GP/40HQ。是指只有一个发货人将整箱货物运到目的港&#xff0c;比较容易竞争。发货人负责装箱…

IntentService 源码理解

一、概述 本篇文章讲解的是分析IntentService源码并使用&#xff0c;安卓API迭代更新的太快&#xff0c;IntentService已经在Android8.0 (API 26)之后就不推荐使用了&#xff0c;在Android API 30正式弃用&#xff0c;官方建议用JobIntentService 或 WorkManager替代&#xff0…

为什么要少用全局变量

为什么要少用全局变量&#xff1f;甚至有些公司禁止用全局变量。有一个说法是这样的&#xff0c;全局变量的最佳前缀是什么&#xff1f;答&#xff1a;// 接下来就粗略说说这个问题。 1、全局变量和局部变量 &#xff08;1&#xff09;全局变量&#xff1a;定义在函数外&…

RocketMQ NameServer 概览

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2022年11月18日 &#…