关于对接农业银行支付的问题

农业银行对接会给一个银企通平台的安装程序,然后找一台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;
}

  

  

  

  

原文地址:https://www.cnblogs.com/leirenyuan/p/11307731.html