Browse Source

汇联支付

xubh 5 years ago
parent
commit
c36c36782e
35 changed files with 1587 additions and 1 deletions
  1. 31 1
      pom.xml
  2. 113 0
      src/main/java/com/huilian/api/open/huilianjavademo/HttpsMain.java
  3. 38 0
      src/main/java/com/huilian/api/open/huilianjavademo/MyConfig.java
  4. 160 0
      src/main/java/com/huilian/api/open/huilianjavademo/SignatureUtils.java
  5. 164 0
      src/main/java/com/huilian/api/open/huilianjavademo/XmlSignUtil.java
  6. 22 0
      src/main/java/com/huilian/api/open/huilianjavademo/XmlSignatureAppendMode.java
  7. 416 0
      src/main/java/com/huilian/api/open/huilianjavademo/XmlUtil.java
  8. 86 0
      src/main/java/com/minpay/common/action/TestMain.java
  9. 70 0
      src/main/java/com/minpay/common/pay/bean/Huilianpay.java
  10. 19 0
      src/main/java/com/minpay/common/service/IHuilianPayService.java
  11. 101 0
      src/main/java/com/minpay/common/service/impl/HuilianPayServiceImpl.java
  12. 9 0
      src/main/resources/xml/ant.mybank.bkmerchantsettle.notifyPayResult.xml
  13. 33 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.dynamicOrder.xml
  14. 27 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.pay.xml
  15. 9 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.payCancel.xml
  16. 10 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.payClose.xml
  17. 9 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.payQuery.xml
  18. 33 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.prePay.xml
  19. 9 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.prePayNotice.xml
  20. 15 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.refund.xml
  21. 9 0
      src/main/resources/xml/ant.mybank.bkmerchanttrade.refundQuery.xml
  22. 10 0
      src/main/resources/xml/ant.mybank.merchantprod.daifu.blance.xml
  23. 22 0
      src/main/resources/xml/ant.mybank.merchantprod.daifu.pay.xml
  24. 11 0
      src/main/resources/xml/ant.mybank.merchantprod.daifu.query.xml
  25. 13 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.addMerchantConfig.xml
  26. 10 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.freeze.xml
  27. 8 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.query.xml
  28. 8 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.register.query.xml
  29. 30 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.register.xml
  30. 10 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.unfreeze.xml
  31. 20 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.updateMerchant.xml
  32. 17 0
      src/main/resources/xml/ant.mybank.merchantprod.merchant.uploadphoto.xml
  33. 18 0
      src/main/resources/xml/ant.mybank.merchantprod.sendsmscode.xml
  34. 13 0
      src/main/resources/xml/head.res.xml
  35. 14 0
      src/main/resources/xml/head.xml

+ 31 - 1
pom.xml

@@ -377,6 +377,17 @@
 		  <artifactId>alipay-sdk-java</artifactId>
 		  <version>3.7.26.ALL</version>
 		</dependency>
+
+		<dependency>
+			<groupId>org.dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>2.0.0</version>
+		</dependency>
+        <dependency>
+            <groupId>org.apache.santuario</groupId>
+            <artifactId>xmlsec</artifactId>
+            <version>2.1.1</version>
+        </dependency>
 	</dependencies>
 	
 	<build>
@@ -408,7 +419,26 @@
 					</compilerArguments>
 			    </configuration>
 			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.5</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+					<encoding>UTF-8</encoding>
+					<compilerArguments>
+						<verbose />
+						<!--suppress UnresolvedMavenProperty -->
+                        <bootclasspath>${JAVA_HOME}/jre/lib/rt.jar${path.separator}${JAVA_HOME}/jre/lib/jce.jar</bootclasspath>
+					</compilerArguments>
+				</configuration>
+			</plugin>
+			<!-- 你项目中需要的其他插件本例忽略 -->
 		</plugins>
+
 	</build>
-	
+
+
+
 </project>

+ 113 - 0
src/main/java/com/huilian/api/open/huilianjavademo/HttpsMain.java

@@ -0,0 +1,113 @@
+package com.huilian.api.open.huilianjavademo;
+
+import javax.net.ssl.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class HttpsMain {
+
+
+    //发送短信请求地址
+    public static String sendSmsUrl = MyConfig.reqUrl + "/sms/sendSmsCode";
+
+    //上传图片:
+    public static String uploadUrl = MyConfig.reqUrl + "/merchant/uploadPhoto";
+
+    //发起支付,预创订单,查询订单,订单退款,关闭订单,撤销订单
+    public static String payUrl = MyConfig.reqUrl + "/pay";
+
+    //商户入驻,支付授权目录配置,关闭商户,开启商户,注册查询,商户信息查询
+    public static String merchantUrl = MyConfig.reqUrl + "/merchant/service";
+
+    //代付下单,代付,余额查询
+    public static String daifuUrl = MyConfig.reqUrl + "/daifu";
+
+    public static String httpsReq(String reqUrl, String param) throws NoSuchAlgorithmException,
+            NoSuchProviderException, IOException,
+            KeyManagementException {
+        URL url = new URL(reqUrl);
+        HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();
+        httpsConn.setHostnameVerifier(new HostnameVerifier() {
+            public boolean verify(String paramString, SSLSession paramSSLSession) {
+                return true;
+            }
+        });
+
+        //创建SSLContext对象,并使用我们指定的信任管理器初始化
+        TrustManager tm = new X509TrustManager() {
+            public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate,
+                                           String paramString) throws CertificateException {
+            }
+
+            public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate,
+                                           String paramString) throws CertificateException {
+            }
+
+            public X509Certificate[] getAcceptedIssuers() {
+                return null;
+            }
+        };
+
+        SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+        sslContext.init(null, new TrustManager[]{tm}, new java.security.SecureRandom());
+
+        //从上述SSLContext对象中得到SSLSocketFactory对象
+        SSLSocketFactory ssf = sslContext.getSocketFactory();
+
+        //创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
+        httpsConn.setSSLSocketFactory(ssf);
+
+        httpsConn.setDoOutput(true);
+        httpsConn.setRequestMethod("POST");
+        httpsConn.setRequestProperty("Content-Type", "application/xml;charset=UTF-8");
+        httpsConn.setRequestProperty("Content-Length", String.valueOf(param.length()));
+
+        OutputStreamWriter out = new OutputStreamWriter(httpsConn.getOutputStream(), "UTF-8");
+        out.write(param);
+        out.flush();
+        out.close();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(
+                httpsConn.getInputStream(), "UTF-8"));
+        String tempLine = "";
+        StringBuffer resultBuffer = new StringBuffer();
+        while ((tempLine = reader.readLine()) != null) {
+            resultBuffer.append(tempLine).append(System.getProperty("line.separator"));
+        }
+        return resultBuffer.toString();
+    }
+
+    public static String httpReq(String urlStr, String param) throws IOException {
+        URL url = new URL(urlStr);
+        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
+
+        httpConn.setDoOutput(true);
+        httpConn.setRequestMethod("POST");
+        httpConn.setRequestProperty("Content-Type", "application/xml;charset=UTF-8");
+        httpConn.setRequestProperty("Content-Length", String.valueOf(param.length()));
+
+        OutputStreamWriter out = new OutputStreamWriter(httpConn.getOutputStream(), "UTF-8");
+        out.write(param);
+        out.flush();
+        out.close();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(
+                httpConn.getInputStream(), "UTF-8"));
+        String tempLine = "";
+        StringBuffer resultBuffer = new StringBuffer();
+        while ((tempLine = reader.readLine()) != null) {
+            resultBuffer.append(tempLine).append(System.getProperty("line.separator"));
+        }
+        return resultBuffer.toString();
+    }
+
+}

File diff suppressed because it is too large
+ 38 - 0
src/main/java/com/huilian/api/open/huilianjavademo/MyConfig.java


+ 160 - 0
src/main/java/com/huilian/api/open/huilianjavademo/SignatureUtils.java

@@ -0,0 +1,160 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2016 All Rights Reserved.
+ */
+package com.huilian.api.open.huilianjavademo;
+
+import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
+import com.sun.org.apache.xml.internal.security.utils.Constants;
+import org.apache.commons.io.IOUtils;
+import org.apache.xml.security.signature.XMLSignature;
+import org.apache.xml.security.transforms.Transforms;
+import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.io.ByteArrayOutputStream;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+/**
+ * 签名/验签工具类,包含以下功能
+ * <pre>
+ * 1. 获取RSA的公钥
+ * 2. 获取RSA的私钥
+ * 3. 进行RSA签名
+ * 4. 进行RS验签
+ * </pre>
+ * 
+ * @author jin.xie
+ * @version $Id: SignatureUtils.java, v 0.1 2016年2月1日 上午10:49:06 jin.xie Exp $
+ */
+public class SignatureUtils {
+    static {
+        org.apache.xml.security.Init.init();
+    }
+
+    /**
+     * 根据String获取私钥 - RSA
+     * 
+     * @param encodePrivateKey
+     * @return
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeySpecException
+     */
+    public static PrivateKey getPrivateKey(String encodePrivateKey)
+                                                                   throws NoSuchAlgorithmException,
+                                                                   InvalidKeySpecException {
+        byte[] privateKeyBytes = Base64.decode(encodePrivateKey);
+        KeyFactory kf = KeyFactory.getInstance("RSA"); // or "EC" or whatever
+        PrivateKey privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
+        return privateKey;
+    }
+
+    /**
+     * 根据String获取公钥 - RSA
+     * 
+     * @param encodePublicKey
+     * @return
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeySpecException
+     */
+    public static PublicKey getPublicKey(String encodePublicKey) throws NoSuchAlgorithmException,
+                                                                InvalidKeySpecException {
+        byte[] publicKeyKeyBytes = Base64.decode(encodePublicKey);
+        KeyFactory kf = KeyFactory.getInstance("RSA"); // or "EC" or whatever
+        PublicKey publicKey = kf.generatePublic(new X509EncodedKeySpec(publicKeyKeyBytes));
+        return publicKey;
+    }
+
+    /**
+     * XML签名
+     * @param elementTagName 续签签名的Tag名称
+     * @param algorithm 签名算法 {@link XMLSignature} 支持下列算法
+     * <ul>
+     * <li>XMLSignature.ALGO_ID_SIGNATURE_RSA</li>
+     * <li>XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1</li>
+     * <li>XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256</li>
+     * <li>XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA384</li>
+     * <li>XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA512</li>
+     * </ul>
+     * @param signatureAppendMode 签名节点的附加模式
+
+     * <ul>
+     * <li>作为子节点: XmlSignatureAppendMode.AS_CHILDREN</li>
+     * <li>作为兄弟节点:XmlSignatureAppendMode.AS_BROTHER</li>
+     * </ul>
+     * @return 签名后的文档 string
+     * @throws Exception the exception
+     */
+    public static String signXmlElement(PrivateKey privateKey, Document xmlDocument,
+                                        String elementTagName, String algorithm,
+                                        int signatureAppendMode) throws Exception {
+        XMLSignature xmlSignature = new XMLSignature(xmlDocument, xmlDocument.getDocumentURI(),
+            algorithm);
+
+        NodeList nodeList = xmlDocument.getElementsByTagName(elementTagName);
+        if (nodeList == null || nodeList.getLength() - 1 < 0) {
+            throw new Exception("Document element with tag name " + elementTagName + " not fount");
+        }
+
+        Node elementNode = nodeList.item(0);
+        if (elementNode == null) {
+            throw new Exception("Document element with tag name " + elementTagName + " not fount");
+        }
+
+        elementNode.appendChild(xmlSignature.getElement());
+        if (signatureAppendMode == XmlSignatureAppendMode.AS_CHILDREN) {
+            elementNode.appendChild(xmlSignature.getElement());
+        } else if (signatureAppendMode == XmlSignatureAppendMode.AS_BROTHER) {
+            elementNode.getParentNode().appendChild(xmlSignature.getElement());
+        } else {
+            throw new IllegalArgumentException("Illegal Append Mode");
+        }
+
+        Transforms transforms = new Transforms(xmlDocument);
+        transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
+        xmlSignature.addDocument("", transforms, Constants.ALGO_ID_DIGEST_SHA1);
+
+        xmlSignature.sign(privateKey);
+
+        ByteArrayOutputStream os = null;
+        try {
+            os = new ByteArrayOutputStream();
+            XMLUtils.outputDOM(xmlDocument, os);
+            return os.toString("UTF-8");
+        } finally {
+            IOUtils.closeQuietly(os);
+        }
+    }
+
+    /**
+     * 验证XML签名
+     *
+     * @return 签名验证结果 boolean
+     * @throws Exception the exception
+     */
+    public static boolean verifyXmlElement(PublicKey publicKey, Document xmlDocument)
+                                                                                     throws Exception {
+        NodeList signatureNodes = xmlDocument.getElementsByTagNameNS(Constants.SignatureSpecNS,
+            "Signature");
+        if (signatureNodes == null || signatureNodes.getLength() < 1) {
+            throw new Exception("Signature element not found!");
+        }
+
+        Element signElement = (Element) signatureNodes.item(0);
+        if (signElement == null) {
+            throw new Exception("Signature element  not found");
+        }
+
+        XMLSignature signature = new XMLSignature(signElement, "");
+        return signature.checkSignatureValue(publicKey);
+    }
+}

+ 164 - 0
src/main/java/com/huilian/api/open/huilianjavademo/XmlSignUtil.java

@@ -0,0 +1,164 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2016 All Rights Reserved.
+ */
+package com.huilian.api.open.huilianjavademo;
+
+
+import org.apache.xml.security.signature.XMLSignature;
+import org.apache.xml.security.transforms.Transforms;
+import org.apache.xml.security.utils.Constants;
+import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.*;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+/**
+ * 进行签名验签的测试
+ * 
+ * @author jin.xie
+ * @version $Id: XmlSignTest.java, v 0.1 2016年2月1日 上午10:51:39 jin.xie Exp $
+ */
+public class XmlSignUtil {
+
+    private static final String CHARSET            = "UTF-8";
+    private static final String SIGN_ALGORITHM     = "SHA256withRSA";
+    private static final String XML_ALGORITHM      = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
+    private static final String REQUEST_TAG_NAME   = "request";
+    private static final String RESPONSE_TAG_NAME  = "response";
+    private static final String SIGNATURE_TAG_NAME = "Signature";
+
+     /**
+     * 签名- XML
+     * 
+     * @throws Exception
+     */
+    public static String sign(String xmlContent,String RsaPrivateKey) throws Exception {
+        Document doc = parseDocumentByString(xmlContent);
+        PrivateKey privateKey = SignatureUtils.getPrivateKey(RsaPrivateKey);
+        String result = SignatureUtils.signXmlElement(privateKey, doc, "request",
+            XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256, 2);
+        return result;
+    }
+
+    public static String signRes(String xmlContent,String RsaPrivateKey) throws Exception {
+        Document doc = parseDocumentByString(xmlContent);
+        PrivateKey privateKey = SignatureUtils.getPrivateKey(RsaPrivateKey);
+        String result = SignatureUtils.signXmlElement(privateKey, doc, "response",
+                XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256, 2);
+        return result;
+    }
+
+
+    /**
+     * 私钥签名应答报文
+     *
+     * @param responseMessage
+     * @param privateKey
+     * @return
+     * @throws Exception
+     */
+    public static String signResponseMessage(String responseMessage, PrivateKey privateKey)
+            throws Exception {
+        return signXmlMessage(responseMessage, RESPONSE_TAG_NAME, privateKey);
+    }
+
+
+    /**
+     * 私钥签名
+     *
+     * @param xmlMessageSource 待签名的XML
+     * @param elementTagName
+     * @param privateKey
+     * @return
+     * @throws Exception
+     */
+    public static String signXmlMessage(String xmlMessageSource, String elementTagName,
+                                        PrivateKey privateKey) throws Exception {
+
+        //org.apache.xml.security.Init.init();
+
+        Document xmlDocument = getDocument(xmlMessageSource);
+        XMLSignature xmlSignature = new XMLSignature(xmlDocument, xmlDocument.getDocumentURI(),
+                XML_ALGORITHM);
+
+        NodeList nodeList = xmlDocument.getElementsByTagName(elementTagName);
+        if (nodeList == null || nodeList.getLength() != 1) {
+            throw new Exception("Document element with tag name " + elementTagName + " not fount");
+        }
+        Node elementNode = nodeList.item(0);
+        elementNode.getParentNode().appendChild(xmlSignature.getElement());
+
+        Transforms transforms = new Transforms(xmlDocument);
+        transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
+        xmlSignature.addDocument("", transforms, Constants.ALGO_ID_DIGEST_SHA1);
+
+        xmlSignature.sign(privateKey);
+
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        XMLUtils.outputDOM(xmlDocument, os);
+        return os.toString(CHARSET);
+    }
+
+    /**
+     * 解析XML字符串
+     *
+     * @param xmlMessageSource
+     * @return
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws IOException
+     * @throws UnsupportedEncodingException
+     */
+    private static Document getDocument(String xmlMessageSource)
+            throws ParserConfigurationException,
+            SAXException, IOException,
+            UnsupportedEncodingException {
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        Document xmlDocument = builder.parse(new InputSource(new ByteArrayInputStream(
+                xmlMessageSource.getBytes(CHARSET))));
+        return xmlDocument;
+    }
+
+    /**
+     * 验签 - XML
+     * 
+     * @throws Exception
+     */
+    public static boolean verify(String xmlContent,String RsaPublicKey) throws Exception {
+        Document doc = parseDocumentByString(xmlContent);
+        PublicKey publicKey = SignatureUtils.getPublicKey(RsaPublicKey);
+
+        return SignatureUtils.verifyXmlElement(publicKey, doc);
+    }
+
+    /**
+     * 解析XML
+     * 
+     * @param xmlContent
+     * @return
+     * @throws SAXException
+     * @throws IOException
+     * @throws ParserConfigurationException
+     */
+    private static Document parseDocumentByString(String xmlContent) throws Exception {
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);// 否则无法识别namespace
+        return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xmlContent)));
+    }
+
+
+}

+ 22 - 0
src/main/java/com/huilian/api/open/huilianjavademo/XmlSignatureAppendMode.java

@@ -0,0 +1,22 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2016 All Rights Reserved.
+ */
+package com.huilian.api.open.huilianjavademo;
+
+/**
+ * 
+ * @author simon.xxm
+ * @version $Id: XmlSignatureAppendMode.java, v 0.1 2016年2月17日 下午6:05:27 simon.xxm Exp $
+ */
+public class XmlSignatureAppendMode {
+
+    /**
+     * 签名节点作为签名元素的子节点
+     */
+    public static final int AS_CHILDREN = 1;
+    /**
+     * 签名节点作为签名元素的兄弟节点
+     */
+    public static final int AS_BROTHER  = 2;
+}

+ 416 - 0
src/main/java/com/huilian/api/open/huilianjavademo/XmlUtil.java

@@ -0,0 +1,416 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2016 All Rights Reserved.
+ */
+package com.huilian.api.open.huilianjavademo;
+
+
+import org.dom4j.*;
+import org.dom4j.dom.DOMElement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.*;
+
+/**
+ * @author simon.xxm
+ * @version $Id: XmlUtil.java, v 0.1 2016年1月25日 下午1:54:52 simon.xxm Exp $
+ */
+public class XmlUtil {
+    public static Logger log = LoggerFactory.getLogger(XmlUtil.class);
+
+    public static void main(String[] args) throws IOException {
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("key", "value");
+        map.put("key1", "value1");
+        String xmlText = XmlUtil.createXml("data", map, "GBK");
+        System.out.println(xmlText);
+//      System.out.println(XmlUtil.readXml(xmlText).get("key"));
+//      try {
+//          File file = new File("D:/申请开通的商户号.xml");
+//          InputStream in = new FileInputStream(file);
+//          byte[] b = new byte[in.available()];
+//          in.read(b);
+//          String text = new String(b,"GBK");
+//          Map<String, String> map = XmlUtil.readXml(text);
+//          System.out.println(map.get("hmac"));
+//          System.out.println(map.get("order_Id"));
+//          in.close();
+//      } catch (Exception e) {
+//          // TODO Auto-generated catch block
+//          e.printStackTrace();
+//      }
+    }
+
+    /**
+     * 描  叙: 生成xml报文
+     * <p>
+     * 作  者: 徐新明<br>
+     * 时  间: 2015年4月17日 下午6:39:18
+     */
+    public static String createXml(String element, Map<String, String> map, String encoding) {
+        Document document = DocumentHelper.createDocument();
+        if (encoding != null) {
+            document.setXMLEncoding(encoding);
+        }
+        Element newspaperElement = document.addElement(element);
+
+        Iterator<String> it = map.keySet().iterator();
+        while (it.hasNext()) {
+            String key = it.next();
+            newspaperElement.addElement(key).setText(map.get(key));
+        }
+
+        return document.asXML();
+    }
+
+    /**
+     * 描  叙: 解析xml报文
+     * <p>
+     * 作  者: 徐新明<br>
+     * 时  间: 2015年4月17日 下午6:39:00
+     */
+    public static Map<String, String> readXml(String xmlText) {
+        Map<String, String> map = new HashMap<String, String>();
+        Document document;
+        try {
+            document = DocumentHelper.parseText(xmlText);
+            Element root = document.getRootElement();
+            List<Element> list = root.elements();
+            for (Element e : list) {
+                parseXmlElement(map, e);
+            }
+        } catch (DocumentException e) {
+            log.error("解析xml报文出错" + xmlText, e);
+        }
+        return map;
+    }
+
+    public static void parseXmlElement(Map<String, String> map, Element e) {
+        if (e.elementIterator().hasNext()) {
+            Iterator<Element> it = e.elementIterator();
+            while (it.hasNext()) {
+                e = it.next();
+                parseXmlElement(map, e);
+            }
+        } else {
+            map.put(e.getName(), e.getText());
+        }
+    }
+
+    //读取报文格式
+    public String sendStyle(String function) {
+        InputStream is = getClass().getResourceAsStream("/xml/" + function + ".xml");
+        return getStyle(is);
+    }
+
+    //读取报文格式
+    public String receiveStyle(String function) {
+        InputStream is = getClass().getResourceAsStream("/xml/" + function + ".xml");
+        return getStyle(is);
+    }
+
+    public String getStyle(InputStream is) {
+        BufferedReader br = null;
+        StringBuffer sb = new StringBuffer();
+        try {
+            br = new BufferedReader(new InputStreamReader(is));
+            String s = "";
+            while ((s = br.readLine()) != null) {
+                sb.append(s);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (br != null) br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return sb.toString();
+    }
+
+    //封装报文
+    public String format(Map<String, String> form, String function) throws DocumentException {
+        //报文头
+        Element headElement = formatHead(form);
+        //报文体
+        Element bodyElement = formatBody(form, function);
+
+        Document docRes = DocumentHelper.createDocument();
+        Element rootElement = docRes.addElement("document");
+        Element requestElement = rootElement.addElement("request").addAttribute("id", "request");
+        requestElement.add(headElement);
+        requestElement.add(bodyElement);
+
+        String out = docRes.asXML();
+        return out;
+    }
+
+    //TODO 封装响应报文
+    public String formatRes(Map<String, String> form, String function, int type) throws DocumentException {
+        //响应报文头
+        Element headElement = formatResHead(form);
+        //响应报文体
+        //1为响应支付通知,2为打款通知
+        Element bodyElement;
+        if (type == 1) {
+            bodyElement = formatResBody(form, function);
+        } else {
+            bodyElement = formatBody(form, function);
+        }
+
+        Document docRes = DocumentHelper.createDocument();
+        Element rootElement = docRes.addElement("document");
+        Element requestElement = rootElement.addElement("response").addAttribute("id", "response");
+        requestElement.add(headElement);
+        requestElement.add(bodyElement);
+
+        String out = docRes.asXML();
+        return out;
+    }
+
+    private void sign(Document doc) {
+        String xml = doc.getRootElement().element("response").asXML();
+        //return RSA.sign(xml, privateKey);
+    }
+
+    //封装报文头
+    public Element formatHead(Map<String, String> form) throws DocumentException {
+        Document docStyle = DocumentHelper.parseText(sendStyle("head"));
+        Element headStyle = docStyle.getRootElement();
+        List<Element> list = headStyle.elements();
+        Element headElement = new DOMElement("head");
+        for (int i = 0; i < list.size(); i++) {
+            Element e = list.get(i);
+            String tagName = e.attributeValue("tagName");
+            String value = form.get(tagName);
+
+            if(tagName.equals("Appid")){
+                value = e.attributeValue("defaultValue");
+            }
+
+            if (value == null) {
+                String defaultValue = e.attributeValue("defaultValue");
+                if (defaultValue != null) {
+                    value = defaultValue;
+                }
+            }
+            if (value != null) {
+                headElement.addElement(tagName).setText(value);
+            }
+        }
+        return headElement;
+    }
+
+    //封装报文体
+    public Element formatBody(Map<String, String> form, String function) throws DocumentException {
+        Document docStyle = DocumentHelper.parseText(sendStyle(function));
+        Element bodyStyle = docStyle.getRootElement();
+        List<Element> list = bodyStyle.elements();
+        Element bodyElement = new DOMElement("body");
+        for (int i = 0; i < list.size(); i++) {
+            Element e = list.get(i);
+            String tagName = e.attributeValue("tagName");
+            String value = form.get(tagName);
+            if (value == null) {
+                String defaultValue = e.attributeValue("defaultValue");
+                if (defaultValue != null) {
+                    value = defaultValue;
+                }
+            }
+            if (value != null) {
+                bodyElement.addElement(tagName).setText(value);
+            }
+        }
+        return bodyElement;
+    }
+
+    //封装签名数据
+    public Element formatSign(Map<String, String> form) {
+        Namespace dsNamespace = new Namespace("ds", "http://www.w3.org/2000/09/xmldsig#");
+        Element signature = new DOMElement(new QName("Signature", dsNamespace));
+        Element signatureValue = signature.addElement(new QName("SignatureValue", dsNamespace));
+        signatureValue.setText("签名数据");
+        return signature;
+    }
+
+    //解析报文
+    public Map<String, Object> parse(String response, String function) throws DocumentException {
+        Map<String, Object> returnMap = new HashMap<String, Object>();
+        Document docStyle = DocumentHelper.parseText(response);
+        List<Element> headList = docStyle.getRootElement().element("response").element("head").elements();
+        Map<String, Object> headMap = parseHead(headList);
+
+        List<Element> bodyList = docStyle.getRootElement().element("response").element("body").elements();
+        Map<String, Object> bodyMap = parseBody(bodyList);
+
+
+        returnMap.putAll(headMap);
+        returnMap.putAll(bodyMap);
+        return returnMap;
+    }
+
+    //解析报文
+    public Map<String, Object> parseReceive(String request, String function) throws DocumentException {
+        Map<String, Object> returnMap = new HashMap<String, Object>();
+        Document docStyle = DocumentHelper.parseText(request);
+        List<Element> headList = docStyle.getRootElement().element("request").element("head").elements();
+        Map<String, Object> headMap = parseHead(headList);
+
+        List<Element> bodyList = docStyle.getRootElement().element("request").element("body").elements();
+        Map<String, Object> bodyMap = parseBody(bodyList);
+
+
+        returnMap.putAll(headMap);
+        returnMap.putAll(bodyMap);
+        return returnMap;
+    }
+
+    //解析报文头
+    private Map<String, Object> parseHead(List<Element> list) throws DocumentException {
+        Map<String, Object> headMap = new HashMap<String, Object>();
+        for (int i = 0; i < list.size(); i++) {
+            Element e = list.get(i);
+            if (e.getText() != null && !"".equals(e.getText()))
+                headMap.put(e.getName(), e.getText());
+        }
+        return headMap;
+    }
+
+    //解析报文体
+    private Map<String, Object> parseBody(List<Element> list) throws DocumentException {
+        Map<String, Object> bodyMap = new HashMap<String, Object>();
+        for (int i = 0; i < list.size(); i++) {
+            Element e = list.get(i);
+            //包含子元素
+            if (e.elements().size() != 0) {
+                //重复标签合并成list
+                if (bodyMap.containsKey(e.getName())) {
+                    Object o = bodyMap.get(e.getName());
+                    if (o instanceof ArrayList) {
+                        ArrayList<Object> oList = (ArrayList<Object>) o;
+                        oList.add(parseBody(e.elements()));
+                    } else {
+                        ArrayList<Object> oList = new ArrayList<Object>();
+                        oList.add(o);
+                        oList.add(parseBody(e.elements()));
+                        bodyMap.put(e.getName(), oList);
+                    }
+                } else {
+                    bodyMap.put(e.getName(), parseBody(e.elements()));
+                }
+                //无子元素且非空
+            } else if (e.getText() != null && !"".equals(e.getText())) {
+                //重复标签合并成list
+                if (bodyMap.containsKey(e.getName())) {
+                    Object o = bodyMap.get(e.getName());
+                    if (o instanceof ArrayList) {
+                        ArrayList<Object> oList = (ArrayList<Object>) o;
+                        oList.add(e.getText());
+                    } else {
+                        ArrayList<Object> oList = new ArrayList<Object>();
+                        oList.add(o);
+                        oList.add(e.getText());
+                        bodyMap.put(e.getName(), oList);
+                    }
+                } else {
+                    bodyMap.put(e.getName(), e.getText());
+                }
+            }
+        }
+        return bodyMap;
+    }
+
+    public void addDs() throws IOException, DocumentException {
+        InputStream is = XmlUtil.class.getResourceAsStream("originMessage.txt");
+        BufferedReader br = new BufferedReader(new InputStreamReader(is));
+        StringBuffer sb = new StringBuffer();
+        String s = "";
+        while ((s = br.readLine()) != null) {
+            sb.append(s);
+        }
+        s = sb.toString();
+        Document document = DocumentHelper.parseText(s);
+        String out = document.asXML();
+        System.out.println(out);
+
+        Element root = document.getRootElement();
+
+        Namespace dsNamespace = new Namespace("ds", "http://www.w3.org/2000/09/xmldsig#");
+        Element signature = root.addElement(new QName("Signature", dsNamespace));
+        Element signedInfo = signature.addElement(new QName("SignedInfo", dsNamespace));
+        signedInfo.addElement(new QName("CanonicalizationMethod", dsNamespace))
+                .addAttribute("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315");
+        signedInfo.addElement(new QName("SignatureMethod", dsNamespace))
+                .addAttribute("Algorithm", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
+        Element reference = signedInfo.addElement(new QName("Reference", dsNamespace));
+        reference.addAttribute("URI", "");
+        reference.addElement(new QName("Transforms", dsNamespace))
+                .addElement(new QName("Transform", dsNamespace))
+                .addAttribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#enveloped-signature");
+        reference.addElement(new QName("DigestMethod", dsNamespace))
+                .addAttribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#sha1");
+        reference.addElement(new QName("DigestValue", dsNamespace))
+                .setText("MD5值");
+
+        Element signatureValue = signature.addElement(new QName("SignatureValue", dsNamespace));
+        signatureValue.setText("签名数据");
+
+        out = document.asXML();
+        System.out.println(out);
+    }
+
+
+    public Element formatResBody(Map<String, String> form, String function) throws DocumentException {
+        Document docStyle = DocumentHelper.parseText(sendStyle(function));
+        Element bodyStyle = docStyle.getRootElement();
+        List<Element> list = bodyStyle.elements();
+        Element bodyElement = new DOMElement("body");
+        Element respInfoElement = bodyElement.addElement("RespInfo");
+        for (int i = 0; i < list.size(); i++) {
+            Element e = list.get(i);
+            String tagName = e.attributeValue("tagName");
+            String value = form.get(tagName);
+            if (value == null) {
+                String defaultValue = e.attributeValue("defaultValue");
+                if (defaultValue != null) {
+                    value = defaultValue;
+                }
+            }
+            if (value != null) {
+                respInfoElement.addElement(tagName).setText(value);
+            }
+        }
+        return bodyElement;
+    }
+
+
+    public Element formatResHead(Map<String, String> form) throws DocumentException {
+        Document docStyle = DocumentHelper.parseText(sendStyle("head.res"));
+        Element headStyle = docStyle.getRootElement();
+        List<Element> list = headStyle.elements();
+        Element headElement = new DOMElement("head");
+        for (int i = 0; i < list.size(); i++) {
+            Element e = list.get(i);
+            String tagName = e.attributeValue("tagName");
+            String value = form.get(tagName);
+            if (value == null) {
+                String defaultValue = e.attributeValue("defaultValue");
+                if (defaultValue != null) {
+                    value = defaultValue;
+                }
+            }
+            if (value != null) {
+                headElement.addElement(tagName).setText(value);
+            }
+        }
+        return headElement;
+    }
+
+}

+ 86 - 0
src/main/java/com/minpay/common/action/TestMain.java

@@ -0,0 +1,86 @@
+package com.minpay.common.action;
+
+import com.huilian.api.open.huilianjavademo.HttpsMain;
+import com.huilian.api.open.huilianjavademo.MyConfig;
+import com.huilian.api.open.huilianjavademo.XmlSignUtil;
+import com.huilian.api.open.huilianjavademo.XmlUtil;
+import com.sun.jmx.snmp.Timestamp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TestMain {
+
+    public static void main(String arr[]) throws Exception {
+        String function = "ant.mybank.bkmerchanttrade.prePay";
+        XmlUtil xmlUtil = new XmlUtil();
+
+        Map<String, String> form = new HashMap<>();
+//        form.put("OutTradeNo", UUID.randomUUID().toString().replaceAll("-", ""));
+        form.put("OutTradeNo", "123123");
+        form.put("Body", "反扫测试");
+        form.put("TotalAmount", "1");
+        form.put("Currency", "CNY");
+        form.put("HlMerchantId", MyConfig.hlMerchantId);
+        form.put("IsvOrgId", MyConfig.isvOrgId);
+        form.put("ProviderType", "09");
+        if("WX".equals("WX")){
+            form.put("ChannelType", "WX");
+            form.put("OpenId", "of9YbuKGuW4Ips4XRMX6cNwEGEyo");
+        }else{
+            form.put("ChannelType","ALI");
+            form.put("OpenId", "2088122712647839");
+        }
+        form.put("DeviceCreateIp", "127.0.0.1");
+        form.put("SettleType", "T1");
+        form.put("SubAppId", MyConfig.newAppid);
+
+        //可选参数
+        form.put("GoodsTag", "test");
+        form.put("GoodsDetail", "test");
+        form.put("OperatorId", "test");
+        form.put("StoreId", "test");
+        form.put("DeviceId", "1");
+        form.put("ExpireExpress", "5");
+        form.put("NotifyUrl", "http://1k7s239485.51mypc.cn/pay/notify");
+        form.put("Attach", "test");
+
+
+        form.put("Function", function);
+        form.put("ReqTime", new Timestamp(System.currentTimeMillis()).toString());
+        //reqMsgId每次报文必须都不一样
+//        form.put("ReqMsgId", UUID.randomUUID().toString());
+        form.put("ReqMsgId", "12321312");
+
+        //封装报文
+        String param = xmlUtil.format(form, function);
+        if (MyConfig.isSign) {//生产环境需进行rsa签名
+            param = XmlSignUtil.sign(param, MyConfig.myRsaPrivateKey);
+
+        }
+        //发送请求
+        //https
+       //log.info("请求报文{}", param);
+        System.out.println("请求报文{}"+param);
+        String response = HttpsMain.httpReq(HttpsMain.payUrl, param);
+
+        //log.info("返回报文response{}", response);
+        System.out.println("返回报文response{}"+ response);
+        if (MyConfig.isSign) {//生产环境需进行rsa验签
+            if (!XmlSignUtil.verify(response, MyConfig.huiLianRsaPublicKey)) {
+                throw new Exception("验签失败");
+            }
+        }
+        //解析报文
+        Map<String, Object> resMap = xmlUtil.parse(response, function);
+        System.out.println("得到返回值:" + resMap.toString());
+        if("ALI".equals("WX")){
+        }else{
+            //结果消息
+            String payInfo = (String) resMap.get("ResultMsg");
+//            log.info("payInfo:{}", payInfo);
+        }
+    }
+
+
+}

+ 70 - 0
src/main/java/com/minpay/common/pay/bean/Huilianpay.java

@@ -0,0 +1,70 @@
+package com.minpay.common.pay.bean;
+
+public class Huilianpay {
+
+    /**订单号*/
+    private String				outTradeNo;
+    /**渠道 WX微信 ALI 支付宝*/
+    private String				channel;
+    /**openId*/
+    private String				openId;
+    /**回调地址*/
+    private String				notifyUrl;
+    /**支付金额*/
+    private String				totalAmount;
+    /** 渠道类型。01:网商 02:随行付 08:汇付天下 09:合利宝*/
+    private String				providerType;
+
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    public String getChannel() {
+        return channel;
+    }
+
+    public void setChannel(String channel) {
+        this.channel = channel;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String getNotifyUrl() {
+        return notifyUrl;
+    }
+
+    public void setNotifyUrl(String notifyUrl) {
+        this.notifyUrl = notifyUrl;
+    }
+
+    public String getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(String totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public String getProviderType() {
+        return providerType;
+    }
+
+    public void setProviderType(String providerType) {
+        this.providerType = providerType;
+    }
+
+
+
+
+
+}

+ 19 - 0
src/main/java/com/minpay/common/service/IHuilianPayService.java

@@ -0,0 +1,19 @@
+package com.minpay.common.service;
+
+import com.minpay.common.exception.BusinessCodeException;
+import com.minpay.common.pay.bean.Huilianpay;
+import com.minpay.common.pay.bean.PrePay;
+import com.startup.minpay.frame.exception.MINBusinessException;
+import com.startup.minpay.frame.service.base.IMINLocalService;
+
+import java.util.Map;
+
+/**
+ * 汇联支付
+ * @author XBH
+ */
+public interface IHuilianPayService extends IMINLocalService {
+
+	public Map<String, Object> prePay(Huilianpay huilianpay) throws Exception;
+
+}

+ 101 - 0
src/main/java/com/minpay/common/service/impl/HuilianPayServiceImpl.java

@@ -0,0 +1,101 @@
+package com.minpay.common.service.impl;
+
+
+import com.huilian.api.open.huilianjavademo.HttpsMain;
+import com.huilian.api.open.huilianjavademo.MyConfig;
+import com.huilian.api.open.huilianjavademo.XmlSignUtil;
+import com.minpay.common.pay.bean.Huilianpay;
+import com.minpay.common.pay.bean.PrePay;
+import com.minpay.common.service.IHuilianPayService;
+import com.startup.minpay.frame.exception.MINBusinessException;
+import com.startup.minpay.frame.target.MINComponent;
+import com.huilian.api.open.huilianjavademo.XmlUtil;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import com.sun.jmx.snmp.Timestamp;
+
+/**
+ * @author ZHANGZZ
+ *
+ */
+@MINComponent
+public class HuilianPayServiceImpl implements IHuilianPayService {
+
+
+    @Override
+    public Map<String, Object>  prePay(Huilianpay huilianpay) throws Exception {
+        String function = "ant.mybank.bkmerchanttrade.prePay";
+        XmlUtil xmlUtil = new XmlUtil();
+
+        Map<String, String> form = new HashMap<>();
+//        form.put("OutTradeNo", UUID.randomUUID().toString().replaceAll("-", ""));
+
+        form.put("OutTradeNo", huilianpay.getOutTradeNo());
+        form.put("Body", "反扫测试");
+        form.put("TotalAmount", huilianpay.getTotalAmount());
+        form.put("Currency", "CNY");
+        form.put("HlMerchantId", MyConfig.hlMerchantId);
+        form.put("IsvOrgId", MyConfig.isvOrgId);
+
+        form.put("ProviderType", huilianpay.getProviderType());
+        form.put("ChannelType", huilianpay.getChannel());
+        form.put("OpenId", huilianpay.getOpenId());
+        form.put("NotifyUrl", huilianpay.getNotifyUrl());
+
+        form.put("DeviceCreateIp", "127.0.0.1");
+        form.put("SettleType", "T1");
+        form.put("SubAppId", MyConfig.newAppid);
+
+        //可选参数
+        form.put("GoodsTag", "test");
+        form.put("GoodsDetail", "test");
+        form.put("OperatorId", "test");
+        form.put("StoreId", "test");
+        form.put("DeviceId", "1");
+        form.put("ExpireExpress", "5");
+
+        form.put("Attach", "test");
+
+        form.put("Function", function);
+        form.put("ReqTime", new Timestamp(System.currentTimeMillis()).toString());
+        //reqMsgId每次报文必须都不一样
+        form.put("ReqMsgId", UUID.randomUUID().toString());
+        form.put("ReqMsgId", "12321312");
+
+        //封装报文
+        String param = xmlUtil.format(form, function);
+        if (MyConfig.isSign) {//生产环境需进行rsa签名
+            param = XmlSignUtil.sign(param, MyConfig.myRsaPrivateKey);
+
+        }
+        //发送请求
+        //https
+        //log.info("请求报文{}", param);
+        System.out.println("请求报文{}"+param);
+        String response = HttpsMain.httpReq(HttpsMain.payUrl, param);
+
+        //log.info("返回报文response{}", response);
+        System.out.println("返回报文response{}"+ response);
+        if (MyConfig.isSign) {//生产环境需进行rsa验签
+            if (!XmlSignUtil.verify(response, MyConfig.huiLianRsaPublicKey)) {
+                throw new Exception("验签失败");
+            }
+        }
+        //解析报文
+        Map<String, Object> resMap = xmlUtil.parse(response, function);
+        System.out.println("得到返回值:" + resMap.toString());
+        if("ALI".equals("WX")){
+        }else{
+            //结果消息
+            //String payInfo = (String) resMap.get("PayInfo");
+//            log.info("payInfo:{}", payInfo);
+        }
+//返回错误时例子: {Function=ant.mybank.bkmerchanttrade.prePay, InputCharset=UTF-8, RespTimeZone=UTC+8, ReqMsgId=12321312, Appid=11001, Version=1.0.0, Currency=CNY, HlMerchantId=1162162410001, RespInfo={ResultStatus=F, ResultMsg=商户报备未成功,请联系服务商处理后重试, ResultCode=9000}, IsvOrgId=11621}
+        return resMap;
+    }
+
+
+
+}

+ 9 - 0
src/main/resources/xml/ant.mybank.bkmerchantsettle.notifyPayResult.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--5.2.19	打款结果通知接口< ant.mybank.bkmerchantsettle.notifyPayResult>-->
+
+<body>
+    <xmlTag tagName="IsvOrgId"></xmlTag>
+    <xmlTag tagName="ResponseCode"></xmlTag>
+</body>

+ 33 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.dynamicOrder.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.7	移动刷卡支付(被扫)接口< ant.mybank.bkmerchanttrade.pay > -->
+<body>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="Goodsid"></xmlTag>
+    <xmlTag tagName="Body"></xmlTag>
+    <xmlTag tagName="GoodsDetail"></xmlTag>
+    <xmlTag tagName="Currency" defaultValue="CNY"></xmlTag>
+    <xmlTag tagName="TotalAmount"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+    <xmlTag tagName="IsvOrgId"></xmlTag>
+    <xmlTag tagName="ChannelType"></xmlTag>
+    <xmlTag tagName="OperatorId"></xmlTag>
+    <xmlTag tagName="StoreId"></xmlTag>
+    <xmlTag tagName="DeviceId"></xmlTag>
+    <xmlTag tagName="DeviceCreateIp"></xmlTag>
+    <xmlTag tagName="ExpireExpress"></xmlTag>
+    <xmlTag tagName="SettleType"></xmlTag>
+    <xmlTag tagName="Attach"></xmlTag>
+    <xmlTag tagName="PayLimit"></xmlTag>
+    <xmlTag tagName="DiscountableAmount"></xmlTag>
+    <xmlTag tagName="UndiscountableAmount"></xmlTag>
+    <xmlTag tagName="AlipayStoreId"></xmlTag>
+    <xmlTag tagName="SysServiceProviderId"></xmlTag>
+    <xmlTag tagName="CheckLaterNm"></xmlTag>
+    <xmlTag tagName="SubAppId"></xmlTag>
+    <xmlTag tagName="SpecifySubMerchId"></xmlTag>
+    <xmlTag tagName="ChannelId"></xmlTag>
+    <xmlTag tagName="SubMerchId"></xmlTag>
+</body>
+

+ 27 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.pay.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.7	移动刷卡支付(被扫)接口< ant.mybank.bkmerchanttrade.pay > -->
+<body>
+<xmlTag tagName="IsvOrgId"></xmlTag>
+<xmlTag tagName="AuthCode"></xmlTag>
+<xmlTag tagName="OutTradeNo"></xmlTag>
+<xmlTag tagName="Body"></xmlTag>
+<xmlTag tagName="GoodsTag"></xmlTag>
+<xmlTag tagName="GoodsDetail"></xmlTag>
+<xmlTag tagName="TotalAmount"></xmlTag>
+<xmlTag tagName="Currency" defaultValue="CNY"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+<xmlTag tagName="ChannelType"></xmlTag>
+<xmlTag tagName="OperatorId"></xmlTag>
+<xmlTag tagName="StoreId"></xmlTag>
+<xmlTag tagName="DeviceId"></xmlTag>
+<xmlTag tagName="DeviceCreateIp"></xmlTag>
+<xmlTag tagName="ExpireExpress"></xmlTag>
+<xmlTag tagName="SettleType"></xmlTag>
+<xmlTag tagName="Attach"></xmlTag>
+<xmlTag tagName="ChannelId"></xmlTag>
+<xmlTag tagName="SubMerchId"></xmlTag>
+<xmlTag tagName="SpecifySubMerchId"></xmlTag>
+<xmlTag tagName="SplitBunch"></xmlTag>
+</body>

+ 9 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.payCancel.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.12	订单撤销接口<ant.mybank.bkmerchanttrade.payCancel> -->
+<body>
+<xmlTag tagName="IsvOrgId"></xmlTag>
+<xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+</body>

+ 10 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.payClose.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--
+4.2.11	订单关闭接口<ant.mybank.bkmerchanttrade.payClose> -->
+<body>
+<xmlTag tagName="IsvOrgId"></xmlTag>
+<xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+</body>

+ 9 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.payQuery.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.10   订单查询接口<ant.mybank.bkmerchanttrade.payQuery> -->
+<body>
+<xmlTag tagName="IsvOrgId"></xmlTag>
+<xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+</body>

+ 33 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.prePay.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.7	移动刷卡支付(被扫)接口< ant.mybank.bkmerchanttrade.pay > -->
+<body>
+    <xmlTag tagName="IsvOrgId"></xmlTag>
+    <xmlTag tagName="AuthCode"></xmlTag>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="Body"></xmlTag>
+    <xmlTag tagName="GoodsTag"></xmlTag>
+    <xmlTag tagName="GoodsDetail"></xmlTag>
+    <xmlTag tagName="TotalAmount"></xmlTag>
+    <xmlTag tagName="Currency" defaultValue="CNY"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+    <xmlTag tagName="ChannelType"></xmlTag>
+    <xmlTag tagName="OperatorId"></xmlTag>
+    <xmlTag tagName="StoreId"></xmlTag>
+    <xmlTag tagName="DeviceId"></xmlTag>
+    <xmlTag tagName="DeviceCreateIp"></xmlTag>
+    <xmlTag tagName="ExpireExpress"></xmlTag>
+    <xmlTag tagName="SettleType"></xmlTag>
+    <xmlTag tagName="Attach"></xmlTag>
+    <xmlTag tagName="OpenId"></xmlTag>
+    <xmlTag tagName="NotifyUrl"></xmlTag>
+    <xmlTag tagName="SubAppId"></xmlTag>
+    <xmlTag tagName="PayLimit"></xmlTag>
+    <xmlTag tagName="RespInfo">
+        <xmlTag tagName="ResultStatus"></xmlTag>
+        <xmlTag tagName="ResultCode"></xmlTag>
+        <xmlTag tagName="ResultMsg"></xmlTag>
+    </xmlTag>
+    <xmlTag tagName="SplitBunch"></xmlTag>
+</body>

+ 9 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.prePayNotice.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--5.2.12支付结果异步通知<ant.mybank.bkmerchanttrade.prePayNotice> -->
+<body>
+    <xmlTag tagName="ResultStatus"></xmlTag>
+    <xmlTag tagName="ResultCode"></xmlTag>
+    <xmlTag tagName="ResultMsg"></xmlTag>
+</body>

+ 15 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.refund.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.13	退款接口<ant.mybank.bkmerchanttrade.refund> -->
+<body>
+<xmlTag tagName="IsvOrgId" defaultValue="202210000000000001025"></xmlTag>
+<xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+<xmlTag tagName="OutRefundNo"></xmlTag>
+<xmlTag tagName="RefundAmount"></xmlTag>
+<xmlTag tagName="RefundReason"></xmlTag>
+<xmlTag tagName="OperatorId"></xmlTag>
+<xmlTag tagName="DeviceId"></xmlTag>
+<xmlTag tagName="DeviceCreateIp"></xmlTag>
+</body>

+ 9 - 0
src/main/resources/xml/ant.mybank.bkmerchanttrade.refundQuery.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.14	退款查询<ant.mybank.bkmerchanttrade.refundQuery> -->
+<body>
+<xmlTag tagName="IsvOrgId"></xmlTag>
+<xmlTag tagName="OutRefundNo"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+</body>

+ 10 - 0
src/main/resources/xml/ant.mybank.merchantprod.daifu.blance.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<body>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+    <xmlTag tagName="RespInfo">
+        <xmlTag tagName="ResultStatus"></xmlTag>
+        <xmlTag tagName="ResultCode"></xmlTag>
+        <xmlTag tagName="ResultMsg"></xmlTag>
+    </xmlTag>
+</body>

+ 22 - 0
src/main/resources/xml/ant.mybank.merchantprod.daifu.pay.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<body>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+    <xmlTag tagName="Name"></xmlTag>
+    <xmlTag tagName="CardNo"></xmlTag>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="Purpose"></xmlTag>
+    <xmlTag tagName="Amount"></xmlTag>
+    <xmlTag tagName="IdCardNo"></xmlTag>
+    <xmlTag tagName="Summary"></xmlTag>
+    <xmlTag tagName="PhoneNo"></xmlTag>
+    <xmlTag tagName="ResponseUrl"></xmlTag>
+    <xmlTag tagName="BusinessType"></xmlTag>
+    <xmlTag tagName="NotifyUrl"></xmlTag>
+    <xmlTag tagName="AdminKey"></xmlTag>
+    <xmlTag tagName="RespInfo">
+        <xmlTag tagName="ResultStatus"></xmlTag>
+        <xmlTag tagName="ResultCode"></xmlTag>
+        <xmlTag tagName="ResultMsg"></xmlTag>
+    </xmlTag>
+</body>

+ 11 - 0
src/main/resources/xml/ant.mybank.merchantprod.daifu.query.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<body>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="RespInfo">
+        <xmlTag tagName="ResultStatus"></xmlTag>
+        <xmlTag tagName="ResultCode"></xmlTag>
+        <xmlTag tagName="ResultMsg"></xmlTag>
+    </xmlTag>
+</body>

+ 13 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.addMerchantConfig.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--5.2.4	微信子商户支付配置接口	<ant.mybank.merchantprod.merchant.addMerchantConfig> -->
+<body>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="IsvOrgId"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+    <xmlTag tagName="PaymentAppId"></xmlTag>
+    <xmlTag tagName="Path"></xmlTag>
+    <xmlTag tagName="SubscribeAppid"></xmlTag>
+    <xmlTag tagName="SubscribeAppidType"></xmlTag>
+</body>

+ 10 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.freeze.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.4	商户信息查询接口<ant.mybank.merchantprod.merchant.query> -->
+<body>
+  <xmlTag tagName="IsvOrgId"></xmlTag>
+  <xmlTag tagName="HlMerchantId"></xmlTag>
+  <xmlTag tagName="FreezeReason"></xmlTag>
+  <xmlTag tagName="OutTradeNo"></xmlTag>
+</body>

+ 8 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.query.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.4	商户信息查询接口<ant.mybank.merchantprod.merchant.query> -->
+<body>
+  <xmlTag tagName="IsvOrgId"></xmlTag>
+  <xmlTag tagName="HlMerchantId"></xmlTag>
+</body>

+ 8 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.register.query.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.2	商户入驻结果查询<ant.mybank.merchantprod.merchant.service.query> -->
+<body>
+  <xmlTag tagName="IsvOrgId"></xmlTag>
+  <xmlTag tagName="OrderNo"></xmlTag>
+</body>

+ 30 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.register.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.1	商户入驻申请接口<ant.mybank.merchantprod.merchant.service> -->
+<body>
+  <xmlTag tagName="IsvOrgId"></xmlTag>
+  <xmlTag tagName="OutMerchantId"></xmlTag>
+  <xmlTag tagName="MerchantName"></xmlTag>
+  <xmlTag tagName="MerchantType"></xmlTag>
+  <xmlTag tagName="DealType"></xmlTag>
+  <xmlTag tagName="SupportPrepayment"></xmlTag>
+  <xmlTag tagName="SettleMode"></xmlTag>
+  <xmlTag tagName="Mcc"></xmlTag>
+  <xmlTag tagName="MerchantDetail"></xmlTag>
+  <xmlTag tagName="TradeTypeList"></xmlTag>
+  <xmlTag tagName="PayChannelList"></xmlTag>
+  <xmlTag tagName="DeniedPayToolList"></xmlTag>
+  <xmlTag tagName="FeeParamList"></xmlTag>
+  <xmlTag tagName="BankCardParam"></xmlTag>
+  <xmlTag tagName="AuthCode"></xmlTag>
+  <xmlTag tagName="OutTradeNo"></xmlTag>
+  <xmlTag tagName="PartnerType"></xmlTag>
+  <xmlTag tagName="StlTyp"></xmlTag>
+  <xmlTag tagName="ServiceFee"></xmlTag>
+  <xmlTag tagName="WechatChannel"></xmlTag>
+  <xmlTag tagName="Path"></xmlTag>
+  <xmlTag tagName="IsSendMes"></xmlTag>
+  <xmlTag tagName="WeChatID"></xmlTag>
+  <xmlTag tagName="QQID"></xmlTag>
+</body>

+ 10 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.unfreeze.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.6	商户开启接口<ant.mybank.merchantprod.merchant.unfreeze> -->
+<body>
+  <xmlTag tagName="IsvOrgId"></xmlTag>
+  <xmlTag tagName="HlMerchantId"></xmlTag>
+  <xmlTag tagName="UnfreezeReason"></xmlTag>
+  <xmlTag tagName="OutTradeNo"></xmlTag>
+</body>

+ 20 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.updateMerchant.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.2.6	商户开启接口<ant.mybank.merchantprod.merchant.unfreeze> -->
+<body>
+  <xmlTag tagName="IsvOrgId"></xmlTag>
+  <xmlTag tagName="DealType"></xmlTag>
+  <xmlTag tagName="SupportPrepayment"></xmlTag>
+  <xmlTag tagName="SettleMode"></xmlTag>
+  <xmlTag tagName="Mcc"></xmlTag>
+  <xmlTag tagName="MerchantDetail"></xmlTag>
+  <xmlTag tagName="TradeTypeList"></xmlTag>
+  <xmlTag tagName="PayChannelList"></xmlTag>
+  <xmlTag tagName="DeniedPayToolList"></xmlTag>
+  <xmlTag tagName="FeeParamList"></xmlTag>
+  <xmlTag tagName="BankCardParam"></xmlTag>
+  <xmlTag tagName="OutTradeNo"></xmlTag>
+  <xmlTag tagName="PartnerType"></xmlTag>
+
+</body>

+ 17 - 0
src/main/resources/xml/ant.mybank.merchantprod.merchant.uploadphoto.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--5.1.2	图片上传接口<ant.mybank.merchantprod.merchant.uploadphoto > -->
+<body>
+    <xmlTag tagName="PhotoUrl"></xmlTag>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <xmlTag tagName="Function"></xmlTag>
+    <xmlTag tagName="Appid"></xmlTag>
+    <xmlTag tagName="IsvOrgId"></xmlTag>
+    <xmlTag tagName="ReqTime"></xmlTag>
+    <xmlTag tagName="ReqMsgId"></xmlTag>
+    <xmlTag tagName="RespInfo">
+        <xmlTag tagName="ResultStatus"></xmlTag>
+        <xmlTag tagName="ResultCode"></xmlTag>
+        <xmlTag tagName="ResultMsg"></xmlTag>
+    </xmlTag>
+</body>

+ 18 - 0
src/main/resources/xml/ant.mybank.merchantprod.sendsmscode.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!--4.1.1	短信验证码发送接口<ant.mybank.merchantprod.sendsmscode> -->
+<body>
+    <xmlTag tagName="IsvOrgId"></xmlTag>
+    <xmlTag tagName="OutTradeNo"></xmlTag>
+    <!-- 短信业务类型。本短信验证码对应的业务。可选值:
+    01:开通银行账户
+    02:换绑银行卡
+    03:更换银行预留手机号
+    04:商户入驻申请
+    05:余利宝提现
+     -->
+    <xmlTag tagName="BizType"></xmlTag>
+    <xmlTag tagName="Mobile"></xmlTag>
+    <xmlTag tagName="HlMerchantId"></xmlTag>
+</body>

+ 13 - 0
src/main/resources/xml/head.res.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<head>
+	<xmlTag tagName="Version" defaultValue="1.0.0"></xmlTag>
+	<xmlTag tagName="Appid"></xmlTag>
+	<xmlTag tagName="Function"></xmlTag>
+	<xmlTag tagName="RespTime"></xmlTag>
+	<xmlTag tagName="RespTimeZone" defaultValue="UTC+8"></xmlTag>
+	<xmlTag tagName="ReqMsgId"></xmlTag>
+	<xmlTag tagName="RsaType"></xmlTag>
+	<xmlTag tagName="Reserve"></xmlTag>
+	<xmlTag tagName="SignType"></xmlTag>
+	<xmlTag tagName="InputCharset" defaultValue="UTF-8"></xmlTag>
+</head>

+ 14 - 0
src/main/resources/xml/head.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<head>
+	<xmlTag tagName="Version" defaultValue="1.0.0"></xmlTag>
+	<xmlTag tagName="Appid" defaultValue="11001"></xmlTag>
+	<xmlTag tagName="HlMerchantId"></xmlTag>
+	<xmlTag tagName="Function"></xmlTag>
+	<xmlTag tagName="ReqTime"></xmlTag>
+	<xmlTag tagName="ReqTimeZone" defaultValue="UTC+8"></xmlTag>
+	<xmlTag tagName="ReqMsgId"></xmlTag>
+    <xmlTag tagName="RsaType"></xmlTag>
+	<xmlTag tagName="Reserve"></xmlTag>
+	<xmlTag tagName="ProviderType" defaultValue="01"></xmlTag>
+	<xmlTag tagName="InputCharset" defaultValue="UTF-8"></xmlTag>
+</head>