diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java index 4e5fe8ac..cbd69705 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.bean.message; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; +import java.util.Map; import org.apache.commons.io.IOUtils; @@ -11,6 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamConverter; import lombok.Data; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.util.XmlUtils; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import me.chanjar.weixin.mp.api.WxMpConfigStorage; import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil; @@ -33,6 +35,11 @@ import me.chanjar.weixin.mp.util.xml.XStreamTransformer; public class WxMpXmlMessage implements Serializable { private static final long serialVersionUID = -3586245291677274914L; + /** + * 使用dom4j解析的存放所有xml属性和值的map. + */ + private Map allFieldsMap; + /////////////////////// // 以下都是微信推送过来的消息的xml的element所对应的属性 /////////////////////// @@ -562,7 +569,9 @@ public class WxMpXmlMessage implements Serializable { public static WxMpXmlMessage fromXml(String xml) { //修改微信变态的消息内容格式,方便解析 xml = xml.replace("", ""); - return XStreamTransformer.fromXml(WxMpXmlMessage.class, xml); + final WxMpXmlMessage xmlMessage = XStreamTransformer.fromXml(WxMpXmlMessage.class, xml); + xmlMessage.setAllFieldsMap(XmlUtils.xml2Map(xml)); + return xmlMessage; } public static WxMpXmlMessage fromXml(InputStream is) { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java index 2224329b..e741e931 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java @@ -1,8 +1,13 @@ package me.chanjar.weixin.mp.bean.message; -import me.chanjar.weixin.common.api.WxConsts; +import java.util.List; +import java.util.Map; + import org.testng.annotations.*; +import me.chanjar.weixin.common.api.WxConsts; + +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.*; @Test @@ -170,4 +175,85 @@ public class WxMpXmlMessageTest { assertEquals(wxMessage.getSendLocationInfo().getPoiName(), "wo de poi"); } + public void testFromXml_MASSSENDJOBFINISH() { + //xml样例来自 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21 + String xml = "\n" + + "\n" + + "\n" + + "1481013459\n" + + "\n" + + "\n" + + "1000001625\n" + + "\n" + + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "\n" + + "2\n" + + "\n" + + "\n" + + "1\n" + + "0\n" + + "2\n" + + "\n" + + "1\n" + + "1\n" + + "1\n" + + "1\n" + + "\n" + + "\n" + + "2\n" + + "0\n" + + "2\n" + + "\n" + + "1\n" + + "1\n" + + "1\n" + + "1\n" + + "\n" + + "\n" + + "2\n" + + "\n" + + ""; + WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml); + assertEquals(wxMessage.getToUser(), "gh_4d00ed8d6399"); + assertEquals(wxMessage.getFromUser(), "oV5CrjpxgaGXNHIQigzNlgLTnwic"); + assertEquals(wxMessage.getCreateTime(), new Long(1481013459)); + assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); + assertEquals(wxMessage.getEvent(), "MASSSENDJOBFINISH"); + assertEquals(wxMessage.getMsgId(), new Long(1000001625L)); + assertEquals(wxMessage.getStatus(), "err(30003)"); + assertEquals(wxMessage.getTotalCount(), new Integer(0)); + assertEquals(wxMessage.getFilterCount(), new Integer(0)); + assertEquals(wxMessage.getSentCount(), new Integer(0)); + assertEquals(wxMessage.getErrorCount(), new Integer(0)); + + final Map allFields = wxMessage.getAllFieldsMap(); + assertThat(allFields).isNotNull(); + final Map copyrightCheckResult = (Map) allFields.get("CopyrightCheckResult"); + List> resultList = (List>) ((Map) copyrightCheckResult.get("ResultList")).get("item"); + assertThat(copyrightCheckResult).isNotNull(); + + assertThat(copyrightCheckResult.get("Count")).isEqualTo("2"); + assertThat(copyrightCheckResult.get("CheckState")).isEqualTo("2"); + + assertThat(resultList.get(0).get("ArticleIdx")).isEqualTo("1"); + assertThat(resultList.get(0).get("UserDeclareState")).isEqualTo("0"); + assertThat(resultList.get(0).get("AuditState")).isEqualTo("2"); + assertThat(resultList.get(0).get("OriginalArticleUrl")).isEqualTo("Url_1"); + assertThat(resultList.get(0).get("OriginalArticleType")).isEqualTo("1"); + assertThat(resultList.get(0).get("CanReprint")).isEqualTo("1"); + assertThat(resultList.get(0).get("NeedReplaceContent")).isEqualTo("1"); + assertThat(resultList.get(0).get("NeedShowReprintSource")).isEqualTo("1"); + + assertThat(resultList.get(1).get("ArticleIdx")).isEqualTo("2"); + assertThat(resultList.get(1).get("UserDeclareState")).isEqualTo("0"); + assertThat(resultList.get(1).get("AuditState")).isEqualTo("2"); + assertThat(resultList.get(1).get("OriginalArticleUrl")).isEqualTo("Url_2"); + assertThat(resultList.get(1).get("OriginalArticleType")).isEqualTo("1"); + assertThat(resultList.get(1).get("CanReprint")).isEqualTo("1"); + assertThat(resultList.get(1).get("NeedReplaceContent")).isEqualTo("1"); + assertThat(resultList.get(1).get("NeedShowReprintSource")).isEqualTo("1"); + } }