zoukankan      html  css  js  c++  java
  • 关于对接农业银行支付的问题

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

      

      

      

      

  • 相关阅读:
    李开复给中国学生的第一封信
    vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)
    高级程序员考试时间安排和参考书推荐
    vc++学习篇(四)—— 指针
    程序员应具备的素质
    Word 2003 长篇文档排版技巧(二)
    Google 技巧集锦
    给中国学生的第二封信
    修复mysql表
    社保相关
  • 原文地址:https://www.cnblogs.com/leirenyuan/p/11307731.html
Copyright © 2011-2022 走看看