通过建设银行外联平台进行转账/提现操作(Java)

由于公司业务发展,需要对接建行的一些接口,我这边负责的是用户提现功能(从公司账户转账到用户账户的转账操作)。建行那边给了一些资料,下面就详细介绍一下实现过程。
这里写图片描述
以上为建行提供的一些文档和所需要用得到的软件。
从第一个文件开始解释:
CCB_EBSClient_B2BV5.3Build20160618
这个文件就是建行提供的外联平台,需要安装到前置机(服务器)上。
后来建行那边又给了一个2017版本的,说是2016版本的少了一个设置项。。。
龙支付
这个文件与本次讨论关联不大,这里就不再解释。
HDZB_USBKEY_SetupV1.5.1.8.exe
这个是建行网银盾管理工具,后面需要用到的,也是需要安装到前置机上。

jre-1_5_0_22-windows-i586-p.exe

这个相信懂java的老哥应该都知道,这个是外联平台的运行环境,需要安装到前置机上。
下面四个就是文档了。

现在开始安装外联平台,我们将CCB_EBSClient_B2BV5.3Build20160618、jre-1_5_0_22-windows-i586-p.exe、HDZB_USBKEY_SetupV1.5.1.8.exe这几个文件copy到前置机中。首先安装jre,然后安装HDZB_USBKEY_SetupV1.5.1.8.exe。这两个安装好之后,打开CCB_EBSClient_B2BV5.3Build20160618
文件详细如下:
这里写图片描述

说明文档包含:
这里写图片描述

这个外联平台对运行环境是有要求的,要求如下:
这里写图片描述
建行那边的技术人员建议是以上三种安装环境,但是他们也说别的运行环境有的也可以(windows),但是必须是32位的。
这里我安装的是32位xp

我们打开bin文件夹

这里写图片描述

双击设置.bat
这里写图片描述

这里我们需要设置这个外联平台的一些参数。
客户号:这个客户号是找公司财务要的,他说是从公司网银那找的,。。。。。
操作员号:这个操作员号和密码是需要登录公司网银去添加外联平台操作员,要注意的是操作员号只能是以“WLPT”开头。
端口号:这个端口号就是外联平台监听的端口号。
关于这些参数的具体详细说明文档里都有写,这里就不详细解释了。

参数设置好,点击确定,关闭设置界面。

下面需要将建行网银盾插入前置机,是的这个建行网银盾是一个硬件,和我们平常用的电子银行的U盾长的差不多。

这里写图片描述

插入网银盾,打开网银盾管理工具
这里写图片描述
注意第一次插入需要安装一下证书,安装的时候还要设置建行网银盾口令,这个要记好。

安装完成后启动外联平台。

这里写图片描述

启动的过程中需要输入网银盾口令(刚设置的),我记得好像要输入两次。。。不过也可能一次。
到这里算是成功了一大半了,下面就是通过本地代码连接外联平台提交请求了。

文档中给了两种方式:
这里写图片描述

我这里选用的是Socket通讯方式,因为用这种方式签名CA信息外联平台会自动添加。
这里写图片描述

这里展示的是建行跨行单笔转账的报文,还有一个行内转账就不放图了。

下面贴上代码:

package com.jszc.lottery.modules.longpay.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import com.jszc.lottery.common.utils.MakeOrderNumUtil;

public class Client {

	public String go(String xmlInfo) throws UnknownHostException, IOException {

		// 向服务器端发送请求,服务器IP地址和服务器监听的端口号//192.168.1.125
		Socket client = new Socket("192.168.1.125", 12345);
        client.setSoTimeout(10000);
		// 通过printWriter 来向服务器发送消息
		//此处添加连接时长,超时结束
		PrintWriter printWriter = new PrintWriter(client.getOutputStream());
		
		System.out.println("连接已建立...");

		// 发送消息
		printWriter.println(xmlInfo);

		printWriter.flush();

		// InputStreamReader是低层和高层串流之间的桥梁
		// client.getInputStream()从Socket取得输入串流
		InputStreamReader streamReader = new InputStreamReader(
				client.getInputStream());

		// 链接数据串流,建立BufferedReader来读取,将BufferReader链接到InputStreamReder
		BufferedReader reader = new BufferedReader(streamReader);

		StringBuffer content = new StringBuffer();
		int ch;
		while ((ch = reader.read()) != -1) {
			content.append((char) ch);
		}

		reader.close();
		client.close();
		return content.toString();
	}

	public String Transfer(String recv_accno, String recv_acc_name,
			String recv_ubankno, String recv_openacc_dept, String amount)
			throws UnknownHostException, IOException {
		// 拼接xml报文
		StringBuilder sb = new StringBuilder();
		MakeOrderNumUtil makeOrderNumUtil = new MakeOrderNumUtil();
		String num = makeOrderNumUtil.makeOrderNum();
		sb.append("<?xml version='1.0' encoding='GB2312' standalone='yes' ?>");
		sb.append("<TX>");
		sb.append("<REQUEST_SN>" + num + "</REQUEST_SN>");// 请求序列码
		sb.append("<CUST_ID>" + CcbTransferfig.CUST_ID + "</CUST_ID>");// 客户号
		sb.append("<USER_ID>" + CcbTransferfig.USER_ID + "</USER_ID>");// 操作员号
		sb.append("<PASSWORD>" + CcbTransferfig.PASSWORD + "</PASSWORD>");// 密码
		if("中国建设银行".equals(recv_openacc_dept)){//建行--->建行
			sb.append("<TX_CODE>6W8010</TX_CODE>");// 交易请求码
			sb.append("<LANGUAGE>CN</LANGUAGE> ");// 语言
			sb.append("<TX_INFO>");
			sb.append("<PAY_ACCNO>" + CcbTransferfig.PAY_ACCNO + "</PAY_ACCNO>");// 转出账户号
			sb.append("<RECV_ACCNO>" + recv_accno + "</RECV_ACCNO>");// 转入账户号
			sb.append("<RECV_ACC_NAME>" + recv_acc_name + "</RECV_ACC_NAME>");// 转入账户名称
			sb.append("<CHK_RECVNAME>1</CHK_RECVNAME>");//收款账户户名校验
			sb.append("<RECV_OPENACC_DEPT>中国建设银行</RECV_OPENACC_DEPT>");//转入账户开户机构名称
			sb.append("<AMOUNT>" + amount + "</AMOUNT>");// 转账金额
			sb.append("<CUR_TYPE>01</CUR_TYPE>");// 01:人民币 该接口仅支持人民币转账 
			sb.append("<CST_PAY_NO></CST_PAY_NO>");// 客户方流水号
			sb.append("<USEOF>用途</USEOF>"); 
			sb.append("<REM1>备注1</REM1>"); 
			sb.append("<REM2>备注2</REM2>"); 
			sb.append("</TX_INFO>");
			sb.append("<SIGN_INFO></SIGN_INFO>");// 签名信息
			sb.append("<SIGNCERT></SIGNCERT>");// 签名CA信息 客户采用socket连接时,建行客户端自动添加
			sb.append("</TX>");
		}else{//建行--->他行
			sb.append("<TX_CODE>" + CcbTransferfig.TX_CODE + "</TX_CODE>");// 交易请求码
			sb.append("<LANGUAGE>CN</LANGUAGE> ");// 语言
			sb.append("<TX_INFO>");
			sb.append("<TRAN_TYPE>0</TRAN_TYPE>");// 交易类型 0-建行转他行,预留标志
			sb.append("<PAY_ACCNO>" + CcbTransferfig.PAY_ACCNO + "</PAY_ACCNO>");// 转出账户号
			sb.append("<RECV_ACCNO>" + recv_accno + "</RECV_ACCNO>");// 转入账户号
			sb.append("<RECV_ACC_NAME>" + recv_acc_name + "</RECV_ACC_NAME>");// 转入账户名称
			sb.append("<RECV_UBANKNO>"+recv_ubankno+"</RECV_UBANKNO> ");// 联行号recv_ubankno
			sb.append("<RECV_OPENACC_DEPT>"+recv_openacc_dept+"</RECV_OPENACC_DEPT>");// recv_openacc_dept
			sb.append("<AMOUNT>" + amount + "</AMOUNT>");// 转账金额
			sb.append("<CUR_TYPE>01</CUR_TYPE>");// 01:人民币 该接口仅支持人民币转账 
			sb.append("<USEOF>用户提现转账</USEOF>");// 用途
			sb.append("<CST_PAY_NO></CST_PAY_NO>");// 客户方流水号
			sb.append("</TX_INFO>");
			sb.append("<SIGN_INFO></SIGN_INFO>");// 签名信息
			sb.append("<SIGNCERT></SIGNCERT>");// 签名CA信息 客户采用socket连接时,建行客户端自动添加
			sb.append("</TX>");
		}
		
		/*
		 * String utf8 = new String(sb.toString().getBytes("UTF-8")); String
		 * unicode = new String(utf8.getBytes(), "UTF-8"); String gbk = new
		 * String(unicode.getBytes("GB2312"));
		 */
		Client c = new Client();
		String advice = c.go(sb.toString());
		System.out.println("接收到服务器的消息 :" + advice);
		return advice;
	}

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		Client c = new Client();
		String recv_accno = "";// 转入账户号
		String recv_acc_name = "";// 转入账户名称
		String recv_ubankno = ""; // 联行号
		String recv_openacc_dept = ""; // 转入账户开户机构名称 中国邮政储蓄银行
		String amount = "";// 金额
		c.Transfer(recv_accno, recv_acc_name, recv_ubankno, recv_openacc_dept,
				amount);
	}
}

以上代码是一个测试类,实现了建行行内转账和跨行转账功能。
说明
1、CcbTransferfig这个类呢里面写的是一些参数,像客户号,操作员号什么的,也不贴出来了,自己可以根据需要修改。
2、MakeOrderNumUtil 这个是一个工具类,作用是生成一个纯数字的字符串,还需要说明的一点事,报文中的请求序列号只能用一次!这个工具类也不贴出来了,自己可以按照自己的需要生成,不过必须是纯数字的。
3、在进行跨行转账的时候有一个联行号,通过6W0201可查询“银行联行号”及“银行名称”信息,用以填写在6W8060的“转入账户联行号”、“转入账户开户机构名称”字段。这个需要你先查询出来,存在本地,需要的时候自己添加上的。

运行此测试代码,建行的响应报文如下:

<?xmlversion="1.0" encoding="GB2312" standalone="yes" ?> 
<TX> 
  <REQUEST_SN>请求序列码</REQUEST_SN> 
  <CUST_ID>客户号</CUST_ID> 
  <TX_CODE>6W8060</TX_CODE> 
  <RETURN_CODE>返回码</RETURN_CODE> 
  <RETURN_MSG>返回码说明</RETURN_MSG> 
  <LANGUAGE>CN</LANGUAGE> 
  <TX_INFO> 
    <CREDIT_NO>凭证号</CREDIT_NO> 
    <DEAL_TYPE>处理方式</DEAL_TYPE> 
    <FEE>手续费</FEE> 
    <VALID_CODE>验证码</VALID_CODE> 
    <CST_PAY_NO>客户方流水号</CST_PAY_NO>  
  </TX_INFO> 
</TX> 


这里需要注意的是RETURN_CODE和DEAL_TYPE这两个,我们来看一下文档中对这两个字段的说明:
RETURN_CODE:
这里写图片描述
DEAL_TYPE:
这里写图片描述
我们要确认此次转账交易是否成功要综合这两个字段来看,如果只是RETURN_CODE为000000并不能够说明此次交易成功,只能说明请求成功。交易成功与否还要看DEAL_TYPE。另外对这个DEAL_TYPE需要说明的一点是,有的时候这个DEAL_TYPE返回的是9,此种情况需要你再去调用6W0600查询处理结果,具体用法文档里有详细说明。

大致就是以上这些了,由于水平有限,有些地方可能存在差错。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值