springboot-xml请求分装与解析
xml 参数封装
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
public static void main(String[] args) {
Map<String,String> params = new HashMap<String,String>();
String appid = "123";
params.put("appid", appid);
String mch_id = "345";
params.put("mch_id", mch_id);
String out_trade_no = "678";
params.put("out_trade_no", out_trade_no);
String xml = getRequestXML(params,"UTF-8");
System.out.println(xml);
}
public static String getRequestXML(Map<String, String> params,
String charset) {
return formatXML(getRequestXML(params), charset);
}
public static String formatXML(Document document, String charset) {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(charset);
StringWriter sw = new StringWriter();
XMLWriter xw = new XMLWriter(sw, format);
try {
xw.write(document);
xw.flush();
xw.close();
} catch (IOException e) {
e.printStackTrace();
}
return sw.toString();
}
public static Document getRequestXML(Map<String, String> params) {
if (params == null) {
return null;
}
Document document = DocumentHelper.createDocument();
Element root = document.addElement("xml");
Element element;
for (Map.Entry<String, String> entry : params.entrySet()) {
if (entry == null || entry.getValue() == null) {
continue;
}
element = root.addElement(entry.getKey());
element.setText(entry.getValue());
}
return document;
}
微信xml 回调通知模板编写
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.xml.sax.InputSource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.StringTokenizer;
public class WechatNotify {
private String resSuccessXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
private String resFailXml= "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
public void WechatPayNotify(HttpServletRequest request, HttpServletResponse response) {
StringBuffer data = new StringBuffer();
ServletInputStream is = null;
try {
is = request.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(inputStreamReader);
String line = null;
while ((line = br.readLine()) != null) {
data.append(line);
}
is.close();
inputStreamReader.close();
br.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
SAXReader reader = new SAXReader();
Document document = null;
String encoding = getEncoding(data.toString());
InputSource source = new InputSource(new StringReader(data.toString()));
source.setEncoding(encoding);
try {
document = reader.read(source);
} catch (DocumentException e) {
throw new RuntimeException(e);
}
if (document.getXMLEncoding() == null) {
document.setXMLEncoding(encoding);
}
Element root = document.getRootElement();
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream( response.getOutputStream());
out.write(resFailXml.getBytes());
out.flush();
out.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static String getEncoding(String text) {
String result = null;
String xml = text.trim();
if (xml.startsWith("<?xml")) {
int end = xml.indexOf("?>");
String sub = xml.substring(0, end);
StringTokenizer tokens = new StringTokenizer(sub, " =\"'");
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if ("encoding".equals(token)) {
if (!tokens.hasMoreTokens()) {
break;
}
result = tokens.nextToken();
break;
}
}
}
return result;
}
}
参数校验
Document document = DocumentHelper.parseText(xml);
Element root = document.getRootElement();
System.out.println(validWXSign(root, key));
public static boolean validWXSign(Element root, String wx_key) {
Map<String, String> map = new HashMap<String, String>();
for (Object tmpElement : root.elements()) {
String name = ((Element) tmpElement).getName();
if ("sign".equals(name)) {
continue;
}
String value = root.elementText(name);
if (StringUtils.isNotEmpty(value)) {
map.put(name, root.elementText(name));
}
}
String sign = sign(urlParams(map), wx_key);
String srcSign = root.elementText("sign");
return sign.equals(srcSign);
}
public static String sign(String urlParams, String key) {
if (urlParams == null || "".equals(urlParams) || key == null) {
return null;
}
String result = urlParams + "&key=" + key;
result = DigestUtil.MD5WEIXIN(result).toUpperCase();
return result;
}
public static String urlParams(Map<String, String> params) {
if (params == null) {
return null;
}
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
StringBuffer url = new StringBuffer("");
for (String key : keys) {
url.append("&" + key + "=" + params.get(key));
}
String result = url.substring(url.length() > 0 ? 1 : 0);
return result;
}