From 13c80294a2bfa6e823a209b8d4f7fa8ca48adca7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 10 Mar 2022 23:59:24 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E3=80=90=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E3=80=91=E5=9B=9E=E8=B0=83=E6=B6=88=E6=81=AF=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E7=B1=BBWxMaMessage=E5=A2=9E=E5=8A=A0allFieldsMap=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E4=BB=A5=E5=AD=98=E5=82=A8=E6=89=80=E6=9C=89?= =?UTF-8?q?xml=E6=B6=88=E6=81=AF=E6=8A=A5=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/common/util/XmlUtils.java | 13 ++- .../wx/miniapp/bean/WxMaMessage.java | 12 ++- .../wx/miniapp/bean/WxMaMessageTest.java | 83 +++++++++++++++++-- 3 files changed, 97 insertions(+), 11 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java index 7f7494431..facf564e3 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java @@ -39,7 +39,18 @@ public class XmlUtils { Element root = doc.getRootElement(); List elements = root.elements(); for (Element element : elements) { - map.put(element.getName(), element2MapOrString(element)); + String elementName = element.getName(); + if (map.containsKey(elementName)) { + if (map.get(elementName) instanceof List) { + ((List) map.get(elementName)).add(element2MapOrString(element)); + } else { + List value = Lists.newArrayList(map.get(elementName)); + value.add(element2MapOrString(element)); + map.put(elementName, value); + } + } else { + map.put(elementName, element2MapOrString(element)); + } } } catch (DocumentException | SAXException e) { throw new WxRuntimeException(e); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java index 1915e4e8b..aa9fd868d 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java @@ -9,6 +9,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; import lombok.Data; import me.chanjar.weixin.common.error.WxRuntimeException; +import me.chanjar.weixin.common.util.XmlUtils; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -17,6 +18,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.nio.charset.StandardCharsets; +import java.util.Map; /** * @author Binary Wang @@ -26,6 +28,11 @@ import java.nio.charset.StandardCharsets; public class WxMaMessage implements Serializable { private static final long serialVersionUID = -3586245291677274914L; + /** + * 使用dom4j解析的存放所有xml属性和值的map. + */ + private Map allFieldsMap; + @SerializedName("Encrypt") @XStreamAlias("Encrypt") @XStreamConverter(value = XStreamCDataConverter.class) @@ -206,9 +213,12 @@ public class WxMaMessage implements Serializable { private WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson uselessMsg; public static WxMaMessage fromXml(String xml) { - return XStreamTransformer.fromXml(WxMaMessage.class, xml); + WxMaMessage message = XStreamTransformer.fromXml(WxMaMessage.class, xml); + message.setAllFieldsMap(XmlUtils.xml2Map(xml)); + return message; } + @Deprecated public static WxMaMessage fromXml(InputStream is) { return XStreamTransformer.fromXml(WxMaMessage.class, is); } diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java index 126973484..098da74e5 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java @@ -3,6 +3,10 @@ package cn.binarywang.wx.miniapp.bean; import me.chanjar.weixin.common.api.WxConsts; import org.testng.annotations.Test; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -33,7 +37,7 @@ public class WxMaMessageTest { WxMaMessage wxMessage = WxMaMessage.fromXml(xml); assertEquals(wxMessage.getToUser(), "toUser"); assertEquals(wxMessage.getFromUser(), "fromUser"); - assertEquals(wxMessage.getCreateTime(),new Integer(1482048670)); + assertEquals(wxMessage.getCreateTime(), new Integer(1482048670)); assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.TEXT); assertEquals(wxMessage.getContent(), "this is a test"); assertEquals(wxMessage.getMsgId(), new Long(1234567890123456L)); @@ -103,13 +107,13 @@ public class WxMaMessageTest { private void checkSubscribeMsgPopupEvent(WxMaMessage wxMessage) { assertEquals(wxMessage.getToUser(), "gh_123456789abc"); assertEquals(wxMessage.getFromUser(), "otFpruAK8D-E6EfStSYonYSBZ8_4"); - assertEquals(wxMessage.getCreateTime(),new Integer(1610969440)); + assertEquals(wxMessage.getCreateTime(), new Integer(1610969440)); assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); assertEquals(wxMessage.getEvent(), "subscribe_msg_popup_event"); assertEquals(wxMessage.getSubscribeMsgPopupEvent().getList().size(), 1); WxMaSubscribeMsgEvent.PopupEvent event = wxMessage.getSubscribeMsgPopupEvent().getList().get(0); assertEquals(event.getTemplateId(), "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc"); - assertEquals(event.getSubscribeStatusString(),"accept"); + assertEquals(event.getSubscribeStatusString(), "accept"); assertEquals(event.getPopupScene(), "0"); } @@ -165,13 +169,13 @@ public class WxMaMessageTest { private void checkSubscribeMsgChangeEvent(WxMaMessage wxMessage) { assertEquals(wxMessage.getToUser(), "gh_123456789abc"); assertEquals(wxMessage.getFromUser(), "o7esq5OI1Uej6Xixw1lA2H7XDVbc"); - assertEquals(wxMessage.getCreateTime(),new Integer(1610968440)); + assertEquals(wxMessage.getCreateTime(), new Integer(1610968440)); assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); assertEquals(wxMessage.getEvent(), "subscribe_msg_change_event"); assertEquals(wxMessage.getSubscribeMsgChangeEvent().getList().size(), 1); WxMaSubscribeMsgEvent.ChangeEvent event = wxMessage.getSubscribeMsgChangeEvent().getList().get(0); assertEquals(event.getTemplateId(), "BEwX0BOT3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8"); - assertEquals(event.getSubscribeStatusString(),"reject"); + assertEquals(event.getSubscribeStatusString(), "reject"); } public void testSubscribeMsgSentEvent() { @@ -212,18 +216,79 @@ public class WxMaMessageTest { wxMessage = WxMaMessage.fromJson(json); checkSubscribeMsgSentEvent(wxMessage); } + private void checkSubscribeMsgSentEvent(WxMaMessage wxMessage) { assertEquals(wxMessage.getToUser(), "gh_123456789abc"); assertEquals(wxMessage.getFromUser(), "o7esq5PHRGBQYmeNyfG064wEFVpQ"); - assertEquals(wxMessage.getCreateTime(),new Integer(1620963428)); + assertEquals(wxMessage.getCreateTime(), new Integer(1620963428)); assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); assertEquals(wxMessage.getEvent(), "subscribe_msg_sent_event"); assertNotNull(wxMessage.getSubscribeMsgSentEvent()); WxMaSubscribeMsgEvent.SentEvent event = wxMessage.getSubscribeMsgSentEvent().getList(); assertEquals(event.getTemplateId(), "BEwX0BO-T3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8"); - assertEquals(event.getMsgId(),"1864323726461255680"); - assertEquals(event.getErrorCode(),"0"); - assertEquals(event.getErrorStatus(),"success"); + assertEquals(event.getMsgId(), "1864323726461255680"); + assertEquals(event.getErrorCode(), "0"); + assertEquals(event.getErrorStatus(), "success"); } + @Test + public void testFromXmlForAllFieldsMap() { + String xml = "\n" + + " \n" + + " \n" + + " 1642658087\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 16\n" + + " 2\n" + + " \n" + + " 1642605533\n" + + " 300001\n" + + " \n" + + " 0\n" + + " 0\n" + + " \n" + + " \n" + + " 1642605533\n" + + " 100001\n" + + " \n" + + " 0\n" + + " 0\n" + + " \n" + + " \n" + + ""; + + WxMaMessage wxMessage = WxMaMessage.fromXml(xml); + Map allFieldsMap = wxMessage.getAllFieldsMap(); + assertThat(allFieldsMap).isNotEmpty() + .containsEntry("ToUserName", "gh_3953b390c11d") + .containsEntry("FromUserName", "ofYMP5JFT4SD7EX1LQv3IWrciBSo") + .containsEntry("CreateTime", "1642658087") + .containsEntry("MsgType", "event") + .containsEntry("Event", "add_express_path") + .containsEntry("DeliveryID", "TEST") + .containsEntry("WayBillId", "01234567894_waybill_id") + .containsEntry("Version", "16") + .containsEntry("Count", "2") + .containsEntry("OrderId", "01234567894"); + + List> actions = (List>) allFieldsMap.get("Actions"); + assertThat(actions).isNotEmpty().hasSize(2); + + assertThat(actions.get(0)) + .containsEntry("ActionTime", "1642605533") + .containsEntry("ActionType", "300001") + .containsEntry("ActionMsg", "揽件阶段-揽件成功") + .containsEntry("Lat", "0") + .containsEntry("Lng", "0"); + + assertThat(actions.get(1)) + .containsEntry("ActionTime", "1642605533") + .containsEntry("ActionType", "100001") + .containsEntry("ActionMsg", "揽件阶段-揽件成功") + .containsEntry("Lat", "0") + .containsEntry("Lng", "0"); + } }