123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- package com.iamberry.wechat.service;
- 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 com.iamberry.wechat.core.entity.wx.Article;
- import com.iamberry.wechat.core.entity.wx.MusicMessage;
- import com.iamberry.wechat.core.entity.wx.NewsMessage;
- import com.iamberry.wechat.core.entity.wx.TextMessage;
- import com.iamberry.wechat.core.entity.wx.TransferCustomer;
- 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 fzh
- */
- public class MessageUtil {
- /**
- * 返回消息类型:文本
- */
- public static final String RESP_MESSAGE_TYPE_TEXT = "text";
- /**
- * 返回消息类型:音乐
- */
- public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
- /**
- * 返回消息类型:图文
- */
- public static final String RESP_MESSAGE_TYPE_NEWS = "news";
- /**
- * 请求消息类型:文本
- */
- public static final String REQ_MESSAGE_TYPE_TEXT = "text";
- /**
- * 请求消息类型:图片
- */
- public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
- /**
- * 请求消息类型:链接
- */
- public static final String REQ_MESSAGE_TYPE_LINK = "link";
- /**
- * 请求消息类型:视频
- */
- public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
- /**
- * 请求消息类型:地理位置
- */
- public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
- /**
- * 请求消息类型:音频
- */
- public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
- /**
- * 请求消息类型:推送
- */
- public static final String REQ_MESSAGE_TYPE_EVENT = "event";
- /**
- * 事件类型:subscribe(订阅)
- */
- public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
- /**
- * 事件类型:unsubscribe(取消订阅)
- */
- public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
- /**
- * 事件类型:CLICK(自定义菜单点击事件)
- */
- public static final String EVENT_TYPE_CLICK = "CLICK";
- /**
- * 解析微信发来的请求(xml)
- * @param request
- * @return
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- 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);
- // 得到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;
- }
- @SuppressWarnings("unchecked")
- public static Map<String, String> parse2Xml(String html) throws Exception {
- // 将解析结果存储在HashMap中
- Map<String, String> map = new HashMap<String, String>();
- // 读取输入流
- SAXReader reader = new SAXReader();
- Document document = reader.read(html);
- // 得到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(TextMessage textMessage) {
- xstream.alias("xml", textMessage.getClass());
- return xstream.toXML(textMessage);
- }
-
- /**
- * 音乐消息对象转换成xml
- * @param musicMessage 音乐消息对象
- * @return xml
- */
- public static String musicMessageToXml(MusicMessage musicMessage) {
- xstream.alias("xml", musicMessage.getClass());
- return xstream.toXML(musicMessage);
- }
-
- /**
- * 图文消息对象转换成xml
- * @param newsMessage 图文消息对象
- * @return xml
- */
- public static String newsMessageToXml(NewsMessage newsMessage) {
- xstream.alias("item", Article.class);
- xstream.alias("xml", newsMessage.getClass());
- return xstream.toXML(newsMessage).replaceAll("com.rat.utils.wx.event.entitys.Article", "item");
- }
-
- /**
- * 多客服消息对象转换成xml
- * @param transferCustomer
- * @return
- */
- public static String transferCustomerToXml(TransferCustomer transferCustomer) {
- xstream.alias("xml", transferCustomer.getClass());
- return xstream.toXML(transferCustomer);
- }
- /**
- * 扩展xstream,使其支持CDATA块
- */
- 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);
- }
- }
- };
- }
- });
-
- }
|