package cn.ksource.web.controller.wechat.util;
|
|
import java.io.InputStream;
|
import java.io.Writer;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import org.dom4j.Document;
|
import org.dom4j.Element;
|
import org.dom4j.io.SAXReader;
|
|
import cn.ksource.web.controller.wechat.response.RspTextMessage;
|
|
import com.thoughtworks.xstream.XStream;
|
import com.thoughtworks.xstream.core.util.QuickWriter;
|
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
|
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
|
import com.thoughtworks.xstream.io.xml.XppDriver;
|
|
|
/**
|
* 消息工具类
|
*
|
* @author jiangxiaolei
|
*/
|
@SuppressWarnings("unchecked")
|
public class MessageUtil {
|
/**
|
* 返回消息类型:文本
|
*/
|
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
|
|
/**
|
* 请求消息类型:推送 event
|
*/
|
public static final String REQ_MESSAGE_TYPE_EVENT = "event";
|
|
|
|
|
|
|
/**
|
* 解析微信发来的请求(XML)
|
*
|
* @param request
|
* @return
|
* @throws Exception
|
*/
|
|
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
|
// 将解析结果存储在HashMap中
|
Map<String, String> map = new HashMap<String, String>();
|
|
// 从request中取得输入流
|
InputStream inputStream = request.getInputStream();
|
|
// 读取输入流
|
SAXReader reader = new SAXReader();
|
Document document = reader.read(inputStream);
|
|
System.out.println("微信用户向公众号发送的消息:");
|
System.out.println(document.asXML());
|
// 得到xml根元素
|
Element root = document.getRootElement();
|
// 得到根元素的所有子节点
|
List<Element> elementList = root.elements();
|
|
// 遍历所有子节点
|
for (Element e : elementList) {
|
map.put(e.getName(), e.getText());
|
}
|
|
// 释放资源
|
inputStream.close();
|
inputStream = null;
|
|
return map;
|
}
|
|
public static Map<String, String> parseStreamXml(InputStream xml) throws Exception {
|
// 将解析结果存储在HashMap中
|
Map<String, String> map = new HashMap<String, String>();
|
// 读取输入流
|
SAXReader reader = new SAXReader();
|
Document document = reader.read(xml);
|
// 得到xml根元素
|
Element root = document.getRootElement();
|
// 得到根元素的所有子节点
|
List<Element> elementList = root.elements();
|
|
// 遍历所有子节点
|
for (Element e : elementList) {
|
map.put(e.getName(), e.getText());
|
}
|
|
return map;
|
}
|
|
/**
|
* 文本消息对象转换成xml
|
*
|
* @param textMessage 文本消息对象
|
* @return xml
|
*/
|
public static String textMessageToXml(RspTextMessage textMessage) {
|
xstream.alias("xml", textMessage.getClass());
|
return xstream.toXML(textMessage);
|
}
|
|
|
|
/**
|
* 扩展xstream,使其支持CDATA块
|
*
|
* @date 2013-05-19
|
*/
|
private static XStream xstream = new XStream(new XppDriver() {
|
public HierarchicalStreamWriter createWriter(Writer out) {
|
return new PrettyPrintWriter(out) {
|
// 对所有xml节点的转换都增加CDATA标记
|
boolean cdata = true;
|
|
@SuppressWarnings("unchecked")
|
public void startNode(String name, Class clazz) {
|
super.startNode(name, clazz);
|
}
|
|
protected void writeText(QuickWriter writer, String text) {
|
if (cdata) {
|
writer.write("<![CDATA[");
|
writer.write(text);
|
writer.write("]]>");
|
} else {
|
writer.write(text);
|
}
|
}
|
};
|
}
|
});
|
|
}
|