diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
new file mode 100644
index 0000000..3678cc0
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
@@ -0,0 +1,48 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class DlpayReq {
+  private static final String prefix = "<?xml version=\"1.0\" encoding=\"GBK\"?>";
+
+  //HEAD
+  private String jkdm; //<JKDM>接口代码</JKDM>
+  private String jgdm; //<JGDM>结果代码</JGDM>
+  private String fsdw; //<FSDW>发送单位</FSDW>
+  private String jsdw; //<JSDW>接收单位</JSDW>
+  private String czyh; //<CZYH>操作员号</CZYH>
+  private String jyxh; //<JYXH>交易序号</JYXH>
+  private String jyqd; //<JYQD>交易渠道</JYQD>
+  private String yhxx; //<YHXX>安全用户信息</YHXX>
+  private String klxx; //<KLXX>安全口令信息</KLXX>
+
+  //DATA业务参数  <KEY>key值</KEY>
+
+
+  private String getPayXml() {
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<FORMDATA>")
+        //HEAD
+        .append("<HEAD>")
+        .append("<JKDM>").append(jkdm).append("</JKDM>")
+        .append("<JGDM>").append("000000").append("</JGDM>") //发送时填充000000
+        .append("<FSDW>").append(fsdw).append("</FSDW>")
+        .append("<JSDW>").append(jsdw).append("</JSDW>")
+        .append("<CZYH>").append(czyh).append("</CZYH>")
+        .append("<JYXH>").append(jyxh).append("</JYXH>")
+        .append("<JYQD>").append(jyqd).append("</JYQD>")
+        .append("<YHXX>").append(yhxx).append("</YHXX>")
+        .append("<KLXX>").append(klxx).append("</KLXX>")
+        .append("</HEAD>")
+        //DATA
+        .append("<DATA>")
+//        .append("<REFNO>").append("201906211124000011").append("</REFNO>")
+        .append("</DATA>")
+        .append("</FORMDATA>");
+    return String.format("%08d", xml.toString().length()) + xml.toString();
+  }
+
+
+
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java b/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
new file mode 100644
index 0000000..d4521d5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
@@ -0,0 +1,76 @@
+package com.supwisdom.dlpay.util;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.*;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DlpayUtil {
+  /**
+   * socket方式请求农商行
+   */
+  public static String send(String ip, int port, int timeout, String data) throws UnknownHostException, IOException {
+    Socket client = new Socket(ip, port);
+    client.setSoTimeout(timeout * 1000); //timeout秒
+    PrintWriter printWriter = new PrintWriter(client.getOutputStream());
+    // 发送消息
+    printWriter.println(data);
+    printWriter.flush();
+
+    // 读取返回信息
+    InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
+    BufferedReader reader = new BufferedReader(streamReader);
+    StringBuffer content = new StringBuffer(); //存返回信息
+    int ch;
+    while ((ch = reader.read()) != -1) {
+      content.append((char) ch);
+    }
+    reader.close();
+    client.close();
+    return content.toString();
+  }
+
+  /**
+   * XML解析返回Map
+   * */
+  public static Map<String, Object> getXMLValue(String xml, String charset) {
+    if (null == xml) return null;
+    if (null == charset) charset = "UTF-8"; //默认 UTF-8
+    try {
+      byte[] data = xml.getBytes(charset);
+      ByteArrayInputStream bin = new ByteArrayInputStream(data);
+      SAXReader reader = new SAXReader();
+      Document document = reader.read(bin);
+      Element root = document.getRootElement();
+      List<Element> elementList = root.elements();
+      Map<String, Object> map = new HashMap<>(0);
+      for (Element e : elementList) {
+        map.put(e.getName(), getElementValue(e));
+      }
+      return map;
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+
+  private static Object getElementValue(Element root) {
+    if (null == root) return null;
+    if (root.elements().size() > 0) {
+      List<Element> elementList = root.elements();
+      Map<String, Object> map = new HashMap<>(0);
+      for (Element e : elementList) {
+        map.put(e.getName(), getElementValue(e));
+      }
+      return map;
+    } else {
+      return root.getText();
+    }
+  }
+}
