您的位置:首页 > 编程语言 > Java开发

App支付java后台使用EBS5_外联平台对账

2019-02-18 17:04 417 查看

手机支付也称为移动支付,因为有支付功能,所以相应的也需要有支付对账功能。
这里介绍的是以建设银行为主账号,在window上使用EBS5_外联平台中的5W1002商户支付流水查询对支付订单进行对账。

外联平台通过https通讯方式与网银系统后台进行通讯。

企业财务软件接口与外联平台采用两种通讯方式,一是TCP/IP的Socket通讯方式,二是http通讯方式。
我们选择方式一,使用Socket方式从本地连接外联平台

按操作文档启动外联平台

  1. 获取商户号,操作员号,密码
private static final String CUST_ID = "商户号";//商户号
private static final String USER_ID = "操作员号";//操作员号
private static final String PASSWORD = "密码";//密码

注意:需要把上面代码中的中文替换为自己的账号密码

  1. 建立socket服务器
public String go(String xmlInfo) throws IOException {

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

System.out.println("连接已建立...");

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

InputStreamReader streamReader = new InputStreamReader(
client.getInputStream(),"GB18030");

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

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

注意:需要填入自己的服务器ip地址与端口号,来替换掉上面代码中的中文

  1. 设置请求序列码,必须要纯数字,这里用当前时间的毫秒数作为序列码
private String makeOrderNum(){
Date date=new Date();
return String.valueOf(date.getTime());
}
  1. 拼接xml报文,这里选用5W1002接口
public String selectOrder(String order)
throws IOException {
// 拼接xml报文
StringBuilder sb = new StringBuilder();
String num = 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>" + CUST_ID + "</CUST_ID>");// 客户号
sb.append("<USER_ID>" + USER_ID + "</USER_ID>");// 操作员号
sb.append("<PASSWORD>" + PASSWORD + "</PASSWORD>");// 密码
sb.append("<TX_CODE>5W1002</TX_CODE>");// 交易请求码
sb.append("<LANGUAGE>CN</LANGUAGE>");// 语言
sb.append("<TX_INFO>");
sb.append("<START></START>");
sb.append("<STARTHOUR></STARTHOUR>");
sb.append("<STARTMIN></STARTMIN>");
sb.append("<END></END>");
sb.append("<ENDHOUR></ENDHOUR>");
sb.append("<ENDMIN></ENDMIN>");
sb.append("<KIND>1</KIND>");//流水类型,0:未结流水  1:已结流水
sb.append("<ORDER>"+order+"</ORDER>");
sb.append("<ACCOUNT></ACCOUNT>");
sb.append("<DEXCEL>2</DEXCEL>");
sb.append("<MONEY></MONEY> ");
sb.append("<NORDERBY>1</NORDERBY>");
sb.append("<PAGE></PAGE>");
sb.append(" <POS_CODE></POS_CODE>");
sb.append("<STATUS>3</STATUS>");
sb.append("<Mrch_No></Mrch_No>");
sb.append("</TX_INFO>");
sb.append("</TX>");
//        }
PayUtil c = new PayUtil();
String advice = c.go(sb.toString());
System.out.println("接收到服务器的消息 :" + advice);
return advice;
}
  1. 调用方法
@RequestMapping(value = "/doSearchAccountByOrder",method = RequestMethod.POST)
@ResponseBody
@ApiOperation("按订单号查询流水详情")
@IgnoreClientToken
@IgnoreUserToken
public ObjectRestResponse<String> doSearchAccountByOrder( String order){
PayUtil c = null;
String result="";
try {
c = new PayUtil();
result= c.selectOrder(order);

} catch (IOException e) {
e.printStackTrace();
return new ObjectRestResponse<>(500,"获取失败");
}catch (DocumentException e){
e.printStackTrace();
return new ObjectRestResponse<>(500,"解析失败");
}catch (Exception e){
e.printStackTrace();
return new ObjectRestResponse<>(500,"服务异常");
}
return new ObjectRestResponse<>(200,"获取成功").data(result);
}

最终获取到的result是一段xml字段。解析这个字段,即可进行对账。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: