/** * */ package org.hamster.weixinmp.controller.util; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.hamster.weixinmp.constant.WxMsgTypeEnum; import org.hamster.weixinmp.dao.entity.auth.WxAuthReq; import org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity; import org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity; import org.hamster.weixinmp.dao.entity.item.WxItemImageEntity; import org.hamster.weixinmp.dao.entity.item.WxItemPicDescEntity; import org.hamster.weixinmp.dao.entity.item.WxItemThumbEntity; import org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity; import org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgVideoEntity; import org.hamster.weixinmp.dao.entity.msg.WxMsgVoiceEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespImageEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespMusicEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespPicDescEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespTextEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespVideoEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespVoiceEntity; import org.hamster.weixinmp.util.WxUtil; /** * @author grossopaforever@gmail.com * @version Jul 28, 2013 * */ public class WxXmlUtil { private WxXmlUtil() { } public static WxAuthReq getAuthReq(String signature, String timestamp, String nonce, String echostr) { WxAuthReq result = new WxAuthReq(); result.setSignature(signature); result.setTimestamp(timestamp); result.setNonce(nonce); result.setEchostr(echostr); return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></ * FromUserName> <br /> *   <CreateTime>1348831860</CreateTime><br /> *   <MsgType><![CDATA[text]]></MsgType><br /> *   <Content><![CDATA[this is a * test]]></Content><br /> *   <MsgId>1234567890123456</MsgId><br /> * </xml><br /> * </code> * * @param xmlstr * @return * @throws DocumentException */ public static WxMsgTextEntity getMsgText(Element ele) throws DocumentException { WxMsgTextEntity result = msgEntityFactory(WxMsgTextEntity.class, ele); result.setMsgId(longVal(ele, "MsgId")); result.setContent(strVal(ele, "Content")); return result; } /** * <code> * <xml> *   <ToUserName><![CDATA[toUser]]></ToUserName> *   <FromUserName><![CDATA[fromUser]]></FromUserName> *   <CreateTime>1348831860</CreateTime> *   <MsgType><![CDATA[image]]></MsgType> *   <PicUrl><![CDATA[this is a url]]></PicUrl> *   <MediaId><![CDATA[media_id]]></MediaId> *   <MsgId>1234567890123456</MsgId> * </xml> * </code> * * @param xmlstr * @return * @throws DocumentException */ public static WxMsgImageEntity getMsgImage(Element ele) throws DocumentException { WxMsgImageEntity result = msgEntityFactory(WxMsgImageEntity.class, ele); WxItemImageEntity image = new WxItemImageEntity(); image.setMediaId(strVal(ele, "MediaId")); image.setPicUrl(strVal(ele, "PicUrl")); result.setImage(image); return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>1357290913</CreateTime><br /> *   <MsgType><![CDATA[voice]]></MsgType><br /> *   <MediaId><![CDATA[media_id]]></MediaId><br /> *   <Format><![CDATA[Format]]></Format><br /> *   <MsgId>1234567890123456</MsgId><br /> * </xml> * </code> * * @param ele * @return * @throws DocumentException */ public static WxMsgVoiceEntity getMsgVoice(Element ele) throws DocumentException { WxMsgVoiceEntity result = msgEntityFactory(WxMsgVideoEntity.class, ele); WxItemVoiceEntity voice = new WxItemVoiceEntity(); voice.setMediaId(strVal(ele, "MediaId")); voice.setFormat(strVal(ele, "Format")); if (!StringUtils.isEmpty(ele.elementText("Recognition"))) { voice.setRecognition(strVal(ele, "Recognition")); } result.setVoice(voice); return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>1357290913</CreateTime><br /> *   <MsgType><![CDATA[video]]></MsgType><br /> *   <MediaId><![CDATA[media_id]]></MediaId><br /> *   <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><br /> *   <MsgId>1234567890123456</MsgId><br /> * </xml> * </code> * @param ele * @return * @throws DocumentException */ public static WxMsgVideoEntity getMsgVideo(Element ele) throws DocumentException { WxMsgVideoEntity result = msgEntityFactory(WxMsgVideoEntity.class, ele); WxItemVideoEntity video = new WxItemVideoEntity(); video.setMediaId(strVal(ele, "MediaId")); WxItemThumbEntity thumb = new WxItemThumbEntity(); thumb.setMediaId(strVal(ele, "ThumbMediaId")); video.setThumb(thumb); result.setVideo(video); return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>1351776360</CreateTime><br /> *   <MsgType><![CDATA[location]]></MsgType><br /> *   <Location_X>23.134521</Location_X><br /> *   <Location_Y>113.358803</Location_Y><br /> *   <Scale>20</Scale><br /> *   <Label><![CDATA[Location Information]]></Label><br /> *   <MsgId>1234567890123456</MsgId><br /> * </xml> * </code> * * * @param xmlstr * @return * @throws DocumentException */ public static WxMsgLocEntity getMsgLoc(Element ele) throws DocumentException { WxMsgLocEntity result = msgEntityFactory(WxMsgLocEntity.class, ele); result.setLabel(strVal(ele, "Label")); result.setLocationX(doubleVal(ele, "Location_X")); result.setLocationY(doubleVal(ele, "Location_Y")); result.setScale(doubleVal(ele, "Scale")); return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>1351776360</CreateTime><br /> *   <MsgType><![CDATA[link]]></MsgType><br /> *   <Title><![CDATA[公众平台官网链接]]></Title><br /> *   <Description><![CDATA[公众平台官网链接]]></Description><br /> *   <Url><![CDATA[url]]></Url><br /> *   <MsgId>1234567890123456</MsgId><br /> * </xml> * </code> * * @param xmlstr * @return * @throws DocumentException */ public static WxMsgLinkEntity getMsgLink(Element ele) throws DocumentException { WxMsgLinkEntity result = msgEntityFactory(WxMsgLinkEntity.class, ele); result.setTitle(strVal(ele, "Title")); result.setDescription(strVal(ele, "Description")); result.setUrl(strVal(ele, "Url")); return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[FromUser]]></FromUserName><br /> *   <CreateTime>123456789</CreateTime><br /> *   <MsgType><![CDATA[event]]></MsgType><br /> *   <Event><![CDATA[EVENT]]></Event><br /> *   <EventKey><![CDATA[EVENTKEY]]></EventKey><br /> * </xml> * </code> * * @param xmlstr * @return * @throws DocumentException */ public static WxMsgEventEntity getMsgEvent(Element ele) throws DocumentException { WxMsgEventEntity result = msgEntityFactory(WxMsgEventEntity.class, ele); result.setEvent(strVal(ele, "Event")); if (ele.elementText("EventKey") != null) { result.setEventKey(strVal(ele, "EventKey")); } if (ele.elementText("Ticket") != null) { result.setEventKey(strVal(ele, "Ticket")); } return result; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>12345678</CreateTime><br /> *   <MsgType><![CDATA[text]]></MsgType><br /> *   <Content><![CDATA[content]]></Content><br /> *   <FuncFlag>0</FuncFlag><br /> * </xml> * </code> * * @param respText * @return * @throws DocumentException */ public static Element getRespTextXML(WxRespTextEntity respText) throws DocumentException { Element ele = respEntityFactory(respText); ele.addElement("Content").addCDATA(respText.getContent()); return ele; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>12345678</CreateTime><br /> *   <MsgType><![CDATA[image]]></MsgType><br /> *   <Image><br /> *     <MediaId><![CDATA[media_id]]></MediaId><br /> *   </Image><br /> * </xml><br /> * </code> * * @param respImage * @return * @throws DocumentException */ public static Element getRespImage(WxRespImageEntity respImage) throws DocumentException { Element ele = respEntityFactory(respImage); Element imageEle = ele.addElement("Image"); imageEle.addElement("MediaId").addCDATA(respImage.getImage().getMediaId()); return ele; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>12345678</CreateTime><br /> *   <MsgType><![CDATA[voice]]></MsgType><br /> *   <Voice><br /> *     <MediaId><![CDATA[media_id]]></MediaId><br /> *   </Voice><br /> * </xml><br /> * </code> * * @param respVoice * @return * @throws DocumentException */ public static Element getRespVoice(WxRespVoiceEntity respVoice) throws DocumentException { Element ele = respEntityFactory(respVoice); Element voiceEle = ele.addElement("Voice"); voiceEle.addElement("MediaId").addCDATA(respVoice.getVoice().getMediaId()); return ele; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>12345678</CreateTime><br /> *   <MsgType><![CDATA[video]]></MsgType><br /> *   <Video><br /> *     <MediaId><![CDATA[media_id]]></MediaId><br /> *     <Title><![CDATA[title]]></Title><br /> *     <Description><![CDATA[description]]></Description><br /> *   </Video><br /> * </xml><br /> * </code> * * @param respVideo * @return * @throws DocumentException */ public static Element getRespVideo(WxRespVideoEntity respVideo) throws DocumentException { Element ele = respEntityFactory(respVideo); Element videoEle = ele.addElement("Video"); videoEle.addElement("MediaId").addCDATA(respVideo.getVideo().getMediaId()); videoEle.addElement("Title").addCDATA(StringUtils.defaultString(respVideo.getVideo().getTitle())); videoEle.addElement("Description").addCDATA(StringUtils.defaultString(respVideo.getVideo().getDescription())); return ele; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>12345678</CreateTime><br /> *   <MsgType><![CDATA[music]]></MsgType><br /> *   <Music><br /> *     <Title><![CDATA[TITLE]]></Title><br /> *     <Description><![CDATA[DESCRIPTION]]></Description><br /> *     <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl><br /> *     <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl><br /> *     <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId><br /> *   </Music><br /> *   <FuncFlag>0</FuncFlag><br /> * </xml> * </code> * * @param respMusic * @return * @throws DocumentException */ public static Element getRespMusic(WxRespMusicEntity respMusic, WxItemThumbEntity thumb) throws DocumentException { Element ele = respEntityFactory(respMusic); Element musicEle = ele.addElement("Music"); musicEle.addElement("Title").addCDATA(StringUtils.defaultString(respMusic.getMusic().getTitle())); musicEle.addElement("Description").addCDATA(StringUtils.defaultString(respMusic.getMusic().getDescription())); musicEle.addElement("MusicUrl").addCDATA(StringUtils.defaultString(respMusic.getMusic().getMusicUrl())); musicEle.addElement("HQMusicUrl").addCDATA(StringUtils.defaultString(respMusic.getMusic().getHqMusicUrl())); musicEle.addElement("ThumbMediaId").addCDATA(thumb.getMediaId()); return ele; } /** * <code> * <xml><br /> *   <ToUserName><![CDATA[toUser]]></ToUserName><br /> *   <FromUserName><![CDATA[fromUser]]></FromUserName><br /> *   <CreateTime>12345678</CreateTime><br /> *   <MsgType><![CDATA[news]]></MsgType><br /> *   <ArticleCount>2</ArticleCount><br /> *   <Articles><br /> *     <item><br /> *       <Title><![CDATA[title1]]></Title><br /> *       <Description><![CDATA[description1]]></Description><br /> *       <PicUrl><![CDATA[picurl]]></PicUrl><br /> *       <Url><![CDATA[url]]></Url><br /> *     </item><br /> *     <item><br /> *       <Title><![CDATA[title]]></Title><br /> *       <Description><![CDATA[description]]></Description><br /> *       <PicUrl><![CDATA[picurl]]></PicUrl><br /> *       <Url><![CDATA[url]]></Url><br /> *     </item><br /> *   </Articles><br /> *   <FuncFlag>1</FuncFlag><br /> * </xml> * </code> * * @param respPicDesc * @return * @throws DocumentException */ public static Element getRespPicDesc(WxRespPicDescEntity respPicDesc) throws DocumentException { Element ele = respEntityFactory(respPicDesc); ele.addElement("ArticleCount").addText(String.valueOf(respPicDesc.getArticles().size())); Element articlesEle = ele.addElement("Articles"); for (WxItemPicDescEntity item : respPicDesc.getArticles()) { Element itemEle = articlesEle.addElement("item"); itemEle.addElement("Title").addCDATA(item.getTitle()); itemEle.addElement("Description").addCDATA(item.getDescription()); itemEle.addElement("PicUrl").addCDATA(item.getPicUrl()); itemEle.addElement("HQMusicUrl").addCDATA(item.getUrl()); } return ele; } public static Element toXML(String xmlstr) throws DocumentException { Document doc = DocumentHelper.parseText(xmlstr); return doc.getRootElement(); } public static WxMsgTypeEnum getReqType(Element ele) { String type = ele.element("MsgType").getTextTrim(); return WxMsgTypeEnum.inst(type); } ////////////////////////////////////////////////// // Private Methods // ////////////////////////////////////////////////// @SuppressWarnings("unchecked") private static <T> T msgEntityFactory( Class<? extends WxBaseMsgEntity> clazz, Element ele) { WxBaseMsgEntity result; try { result = clazz.newInstance(); result.setToUserName(strVal(ele, "ToUserName")); result.setFromUserName(strVal(ele, "FromUserName")); result.setCreateTime(longVal(ele, "CreateTime")); result.setCreatedDate(new Date()); result.setMsgType(strVal(ele, "MsgType")); if (ele.element("MsgId") != null) { result.setMsgId(longVal(ele, "MsgId")); } return (T) result; } catch (Exception e) { // never occurs return null; } } private static Element respEntityFactory(WxBaseRespEntity entity) { Element ele = DocumentHelper.createElement("xml"); ele.addElement("ToUserName").addCDATA(entity.getToUserName()); ele.addElement("FromUserName").addCDATA(entity.getFromUserName()); String createTime = String.valueOf(entity.getCreateTime()); if (StringUtils.isBlank(createTime)) { Long currentTime = WxUtil.currentTimeInSec(); entity.setCreateTime(currentTime); createTime = String.valueOf(currentTime); } ele.addElement("CreateTime").setText(createTime); ele.addElement("MsgType").addCDATA(entity.getMsgType()); ele.addElement("FuncFlag").setText(String.valueOf(entity.getFuncFlag())); return ele; } private static String strVal(Element ele, String name) { return ele.element(name).getStringValue(); } private static Long longVal(Element ele, String name) { return Long.valueOf(ele.element(name).getStringValue()); } private static Double doubleVal(Element ele, String name) { return Double.valueOf(ele.element(name).getStringValue()); } }