package wx.wechat.service.mp; import lombok.AllArgsConstructor; import lombok.Data; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import wx.wechat.service.WXService; import wx.wechat.utils.XMLUtils; import java.time.Instant; import java.util.List; import java.util.Map; /** * Created by apple on 16/6/13. */ /** * @function 负责对于消息进行处理 * @xml 订阅类消息: * <xml><ToUserName><![CDATA[gh_3e71dcad3d4b]]></ToUserName> * <FromUserName><![CDATA[ormKXjjvAcg8Dpo_TjKVzrmUFTD8]]></FromUserName> * <CreateTime>1465786206</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[subscribe]]></Event> * <EventKey><![CDATA[last_trade_no_4009292001201606127176139580]]></EventKey> * </xml> */ public class MessageService extends WXService { //消息类型 public static enum MsgType { TEXT, //文本类 EVENT //事件类 } @AllArgsConstructor @Data public static class News { //消息名 String title; //消息描述 String description; //消息图片 String picUrl; //消息链接 String url; } //存放XML的文本消息 String message; //消息类型 MsgType msgType; //发送对象 String toUserName; //发送者 String fromUserName; //文本内容 String content; /** * @param message 输入的消息类型 * @function 构造函数 */ public MessageService(String message) { //将消息转化为Map Map<String, Object> messageMap = XMLUtils.XML2Map(message); //判断消息类型 if (messageMap.get("MsgType").equals("event")) { this.msgType = MsgType.EVENT; } else if (messageMap.get("MsgType").equals("text")) { this.msgType = MsgType.TEXT; } //设置消息发送目标 this.toUserName = String.valueOf(messageMap.get("ToUserName")); //设置消息发送者 this.fromUserName = String.valueOf(messageMap.get("FromUserName")); //设置消息内容 if (this.msgType.equals(MsgType.TEXT)) { this.content = String.valueOf(messageMap.get("Content")); } } /** * @param content * @return * @function 生成最终返回的文本消息 */ public String generateTextResponse(String content) { return ""; } /** * @return * @function 生成最终返回的图文消息 */ public String generateNewsResponse(List<News> newsList) { Element rootElement = this.generateResponse(); //添加消息类型 rootElement.addElement("MsgType").addText("news"); //添加消息数量 rootElement.addElement("ArticleCount").addText(String.valueOf(newsList.size())); //添加文章子项目 Element articlesElement = rootElement.addElement("Articles"); //将图文消息依次添加进去 newsList.forEach(news -> { Element itemElement = articlesElement.addElement("item"); itemElement.addElement("Title").addText(news.getTitle()); itemElement.addElement("Description").addText(news.getDescription()); itemElement.addElement("PicUrl").addText(news.getPicUrl()); itemElement.addElement("Url").addText(news.getUrl()); }); return rootElement.asXML(); } private Element generateResponse() { Document document = DocumentHelper.createDocument(); Element root = document.addElement("xml"); //添加目标 root.addElement("ToUserName").addText(this.fromUserName); //添加发送者 root.addElement("FromUserName").addText(this.toUserName); //添加创建时间 root.addElement("CreateTime").addText(String.valueOf(Instant.now().getEpochSecond())); return root; } }