关于对接农业银行支付的问题
农业银行对接会给一个银企通平台的安装程序,然后找一台window系统的服务器安装作为前置机。
附录:银企通的配置(本地服务器配置银行会提供给,默认TCP协议,HTTP协议虽然有选项但是不支持,默认占用前置机的15999端口,ERP模式下可以自己修改)
然后对接支付的主要问题就是给前置机的IP地址的15999端口发送要求格式的报文就行了,端口会根据报文中的交易码自动判断当前属于什么交易。
报文就不贴了,对接的时候跟银行技术人员多沟通下,问问他们报文的一些注意事项。
//报文拼接可以选择dom4j Element root = DocumentHelper.createElement("ap"); //根节点 root.addElement("CCTransCode").addText("CFRT02");//交易代码 root.addElement("ProductID").addText("ICC");//产品标志 root.addElement("ChannelType").addText("ERP");//渠道标志 return root.asXML();
/** * 请求数据:加密标识(1加密,0不加密) + 请求xml数据的长度(默认7位,不够补空格) + 请求的xml public static String genRequestData(String s) throws Exception { return "0" + String.format("%1$-6s", s.getBytes("gbk").length) + s; } //报文发送时前面会有一个 2-6位的加密标志作为报文头,这个和银行确认下是否加密,要以gbk编码发送给前置机,从网上找的材料意思是前置机是gbk编码的,utf8加密应该会报错
/** * TCP报文发送 * @param url * @param port * @param data * @return * @throws Exception */ public static String socketSendAndReceive(String url, int port, String data) throws Exception { System.out.println("请求数据:" + data); Socket socket = new Socket(url, port); OutputStream bw = socket.getOutputStream(); bw.write(data.getBytes("gbk")); bw.flush(); InputStream ips = socket.getInputStream(); StringBuffer sb = new StringBuffer(); int len = 0; byte[] buf = new byte[1024]; while ((len = ips.read(buf)) != -1) { sb.append(new String(buf, 0, len, "gbk")); } bw.close(); ips.close(); socket.close(); return sb.toString(); }
/** * 把XML无脑解析为MAP * * @param msg * @author jieYW * @date 2018/5/29 * @return com.mind.pay.abc.ap.ApXmlBuilder */ public static Map<String,Object> parseXml(String msg)throws Exception { Map<String,Object> resultMap=new HashMap<>(); msg=msg.substring(msg.indexOf("<")); InputStream inputStream = new ByteArrayInputStream(msg.getBytes("UTF-8")); SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); Element root = document.getRootElement(); List<Element> elementList = root.elements(); // 遍历所有子节点 resultMap=getAllElements(elementList,resultMap); // 释放资源 inputStream.close(); inputStream = null; return resultMap; } private static Map<String, Object> getAllElements(List<Element> childElements,Map<String,Object> mapEle) { for (Element ele : childElements) { mapEle.put(ele.getName(), ele.getText()); if(ele.elements().size()>0){ mapEle = getAllElements(ele.elements(), mapEle); } } return mapEle; }