關於對接農業銀行支付的問題


農業銀行對接會給一個銀企通平台的安裝程序,然后找一台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;
}

  

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM