Browse Source

:art: 【小程序】回调消息解析类WxMaMessage增加allFieldsMap属性,以存储所有xml消息报文

Binary Wang 3 years ago
parent
commit
13c80294a2

+ 12 - 1
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<Element> 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<Object>) map.get(elementName)).add(element2MapOrString(element));
+          } else {
+            List<Object> 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);

+ 11 - 1
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 <a href="https://github.com/binarywang">Binary Wang</a>
@@ -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<String, Object> 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);
   }

+ 74 - 9
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 = "<xml>\n" +
+      "    <ToUserName><![CDATA[gh_3953b390c11d]]></ToUserName>\n" +
+      "    <FromUserName><![CDATA[ofYMP5JFT4SD7EX1LQv3IWrciBSo]]></FromUserName>\n" +
+      "    <CreateTime>1642658087</CreateTime>\n" +
+      "    <MsgType><![CDATA[event]]></MsgType>\n" +
+      "    <Event><![CDATA[add_express_path]]></Event>\n" +
+      "    <DeliveryID><![CDATA[TEST]]></DeliveryID>\n" +
+      "    <WayBillId><![CDATA[01234567894_waybill_id]]></WayBillId>\n" +
+      "    <Version>16</Version>\n" +
+      "    <Count>2</Count>\n" +
+      "    <Actions>\n" +
+      "        <ActionTime>1642605533</ActionTime>\n" +
+      "        <ActionType>300001</ActionType>\n" +
+      "        <ActionMsg><![CDATA[揽件阶段-揽件成功]]></ActionMsg>\n" +
+      "        <Lat>0</Lat>\n" +
+      "        <Lng>0</Lng>\n" +
+      "    </Actions>\n" +
+      "    <Actions>\n" +
+      "        <ActionTime>1642605533</ActionTime>\n" +
+      "        <ActionType>100001</ActionType>\n" +
+      "        <ActionMsg><![CDATA[揽件阶段-揽件成功]]></ActionMsg>\n" +
+      "        <Lat>0</Lat>\n" +
+      "        <Lng>0</Lng>\n" +
+      "    </Actions>\n" +
+      "    <OrderId><![CDATA[01234567894]]></OrderId>\n" +
+      "</xml>";
+
+    WxMaMessage wxMessage = WxMaMessage.fromXml(xml);
+    Map<String, Object> 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<Map<String, Object>> actions = (List<Map<String, Object>>) 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");
+  }
 }