微信公众号接收消息自动回复
接收
@PostMapping("/weixin")
public String message(HttpServletRequest request, HttpServletResponse response) throws IOException {
Map<String,String> map = weixin.acceptMessage(request);
System.out.println("接收到的信息:"+JsonUtil.ObjectToJson(map));
String format = "<xml>\n" + "<ToUserName><![CDATA[%1$s]]></ToUserName>\n"
+ "<FromUserName><![CDATA[%2$s]]></FromUserName>\n"
+ "<CreateTime>%3$s</CreateTime>\n"
+ "<MsgType><![CDATA[%4$s]]></MsgType>\n"
+ "<Content><![CDATA[%5$s]]></Content>\n"
+ "</xml>";
return String.format(format, map.get("FromUserName"), map.get("ToUserName"), new Date(), map.get("MsgType"),"飞流直下三千尺,疑是银河落九天!");
}
处理
@Override
public Map<String,String> acceptMessage(HttpServletRequest request) {
try {
// 处理接收消息
InputStream in = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = in.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
in.close();
byte[] bytes = outSteam.toByteArray();
outSteam.close();
String xmltext = new String(bytes, StandardCharsets.UTF_8);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmltext);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
HashMap<String,String> map = new HashMap<>();
map.put("ToUserName",root.getElementsByTagName("ToUserName").item(0).getTextContent());
map.put("FromUserName",root.getElementsByTagName("FromUserName").item(0).getTextContent());
map.put("CreateTime",root.getElementsByTagName("CreateTime").item(0).getTextContent());
map.put("MsgType",root.getElementsByTagName("MsgType").item(0).getTextContent());
map.put("Content",root.getElementsByTagName("Content").item(0).getTextContent());
map.put("MsgId",root.getElementsByTagName("MsgId").item(0).getTextContent());
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
附录:
网上使用xstream的例子:
XStream是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象。XStream是自由软件,可以在BSD许可证的许可下分发。
Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁琐。
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.17</version>
</dependency>
https://blog.csdn.net/u014703502/article/details/54911554