Skip to content

Commit 13c8029

Browse files
committed
🎨 【小程序】回调消息解析类WxMaMessage增加allFieldsMap属性,以存储所有xml消息报文
1 parent eb8942c commit 13c8029

File tree

3 files changed

+97
-11
lines changed

3 files changed

+97
-11
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,18 @@ public static Map<String, Object> xml2Map(String xmlString) {
3939
Element root = doc.getRootElement();
4040
List<Element> elements = root.elements();
4141
for (Element element : elements) {
42-
map.put(element.getName(), element2MapOrString(element));
42+
String elementName = element.getName();
43+
if (map.containsKey(elementName)) {
44+
if (map.get(elementName) instanceof List) {
45+
((List<Object>) map.get(elementName)).add(element2MapOrString(element));
46+
} else {
47+
List<Object> value = Lists.newArrayList(map.get(elementName));
48+
value.add(element2MapOrString(element));
49+
map.put(elementName, value);
50+
}
51+
} else {
52+
map.put(elementName, element2MapOrString(element));
53+
}
4354
}
4455
} catch (DocumentException | SAXException e) {
4556
throw new WxRuntimeException(e);

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.thoughtworks.xstream.annotations.XStreamConverter;
1010
import lombok.Data;
1111
import me.chanjar.weixin.common.error.WxRuntimeException;
12+
import me.chanjar.weixin.common.util.XmlUtils;
1213
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
1314
import org.apache.commons.io.IOUtils;
1415
import org.apache.commons.lang3.StringUtils;
@@ -17,6 +18,7 @@
1718
import java.io.InputStream;
1819
import java.io.Serializable;
1920
import java.nio.charset.StandardCharsets;
21+
import java.util.Map;
2022

2123
/**
2224
* @author <a href="https://github.com/binarywang">Binary Wang</a>
@@ -26,6 +28,11 @@
2628
public class WxMaMessage implements Serializable {
2729
private static final long serialVersionUID = -3586245291677274914L;
2830

31+
/**
32+
* 使用dom4j解析的存放所有xml属性和值的map.
33+
*/
34+
private Map<String, Object> allFieldsMap;
35+
2936
@SerializedName("Encrypt")
3037
@XStreamAlias("Encrypt")
3138
@XStreamConverter(value = XStreamCDataConverter.class)
@@ -206,9 +213,12 @@ public class WxMaMessage implements Serializable {
206213
private WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson uselessMsg;
207214

208215
public static WxMaMessage fromXml(String xml) {
209-
return XStreamTransformer.fromXml(WxMaMessage.class, xml);
216+
WxMaMessage message = XStreamTransformer.fromXml(WxMaMessage.class, xml);
217+
message.setAllFieldsMap(XmlUtils.xml2Map(xml));
218+
return message;
210219
}
211220

221+
@Deprecated
212222
public static WxMaMessage fromXml(InputStream is) {
213223
return XStreamTransformer.fromXml(WxMaMessage.class, is);
214224
}

weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import me.chanjar.weixin.common.api.WxConsts;
44
import org.testng.annotations.Test;
55

6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
610
import static org.testng.Assert.assertEquals;
711
import static org.testng.Assert.assertNotNull;
812

@@ -33,7 +37,7 @@ public void testFromXml() {
3337
WxMaMessage wxMessage = WxMaMessage.fromXml(xml);
3438
assertEquals(wxMessage.getToUser(), "toUser");
3539
assertEquals(wxMessage.getFromUser(), "fromUser");
36-
assertEquals(wxMessage.getCreateTime(),new Integer(1482048670));
40+
assertEquals(wxMessage.getCreateTime(), new Integer(1482048670));
3741
assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.TEXT);
3842
assertEquals(wxMessage.getContent(), "this is a test");
3943
assertEquals(wxMessage.getMsgId(), new Long(1234567890123456L));
@@ -103,13 +107,13 @@ public void testSubscribeMsgPopupEvent() {
103107
private void checkSubscribeMsgPopupEvent(WxMaMessage wxMessage) {
104108
assertEquals(wxMessage.getToUser(), "gh_123456789abc");
105109
assertEquals(wxMessage.getFromUser(), "otFpruAK8D-E6EfStSYonYSBZ8_4");
106-
assertEquals(wxMessage.getCreateTime(),new Integer(1610969440));
110+
assertEquals(wxMessage.getCreateTime(), new Integer(1610969440));
107111
assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT);
108112
assertEquals(wxMessage.getEvent(), "subscribe_msg_popup_event");
109113
assertEquals(wxMessage.getSubscribeMsgPopupEvent().getList().size(), 1);
110114
WxMaSubscribeMsgEvent.PopupEvent event = wxMessage.getSubscribeMsgPopupEvent().getList().get(0);
111115
assertEquals(event.getTemplateId(), "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc");
112-
assertEquals(event.getSubscribeStatusString(),"accept");
116+
assertEquals(event.getSubscribeStatusString(), "accept");
113117
assertEquals(event.getPopupScene(), "0");
114118
}
115119

@@ -165,13 +169,13 @@ public void testSubscribeMsgChangeEvent() {
165169
private void checkSubscribeMsgChangeEvent(WxMaMessage wxMessage) {
166170
assertEquals(wxMessage.getToUser(), "gh_123456789abc");
167171
assertEquals(wxMessage.getFromUser(), "o7esq5OI1Uej6Xixw1lA2H7XDVbc");
168-
assertEquals(wxMessage.getCreateTime(),new Integer(1610968440));
172+
assertEquals(wxMessage.getCreateTime(), new Integer(1610968440));
169173
assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT);
170174
assertEquals(wxMessage.getEvent(), "subscribe_msg_change_event");
171175
assertEquals(wxMessage.getSubscribeMsgChangeEvent().getList().size(), 1);
172176
WxMaSubscribeMsgEvent.ChangeEvent event = wxMessage.getSubscribeMsgChangeEvent().getList().get(0);
173177
assertEquals(event.getTemplateId(), "BEwX0BOT3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8");
174-
assertEquals(event.getSubscribeStatusString(),"reject");
178+
assertEquals(event.getSubscribeStatusString(), "reject");
175179
}
176180

177181
public void testSubscribeMsgSentEvent() {
@@ -212,18 +216,79 @@ public void testSubscribeMsgSentEvent() {
212216
wxMessage = WxMaMessage.fromJson(json);
213217
checkSubscribeMsgSentEvent(wxMessage);
214218
}
219+
215220
private void checkSubscribeMsgSentEvent(WxMaMessage wxMessage) {
216221
assertEquals(wxMessage.getToUser(), "gh_123456789abc");
217222
assertEquals(wxMessage.getFromUser(), "o7esq5PHRGBQYmeNyfG064wEFVpQ");
218-
assertEquals(wxMessage.getCreateTime(),new Integer(1620963428));
223+
assertEquals(wxMessage.getCreateTime(), new Integer(1620963428));
219224
assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT);
220225
assertEquals(wxMessage.getEvent(), "subscribe_msg_sent_event");
221226
assertNotNull(wxMessage.getSubscribeMsgSentEvent());
222227
WxMaSubscribeMsgEvent.SentEvent event = wxMessage.getSubscribeMsgSentEvent().getList();
223228
assertEquals(event.getTemplateId(), "BEwX0BO-T3MqK3Uc5oTU3CGBqzjpndk2jzUf7VfExd8");
224-
assertEquals(event.getMsgId(),"1864323726461255680");
225-
assertEquals(event.getErrorCode(),"0");
226-
assertEquals(event.getErrorStatus(),"success");
229+
assertEquals(event.getMsgId(), "1864323726461255680");
230+
assertEquals(event.getErrorCode(), "0");
231+
assertEquals(event.getErrorStatus(), "success");
227232
}
228233

234+
@Test
235+
public void testFromXmlForAllFieldsMap() {
236+
String xml = "<xml>\n" +
237+
" <ToUserName><![CDATA[gh_3953b390c11d]]></ToUserName>\n" +
238+
" <FromUserName><![CDATA[ofYMP5JFT4SD7EX1LQv3IWrciBSo]]></FromUserName>\n" +
239+
" <CreateTime>1642658087</CreateTime>\n" +
240+
" <MsgType><![CDATA[event]]></MsgType>\n" +
241+
" <Event><![CDATA[add_express_path]]></Event>\n" +
242+
" <DeliveryID><![CDATA[TEST]]></DeliveryID>\n" +
243+
" <WayBillId><![CDATA[01234567894_waybill_id]]></WayBillId>\n" +
244+
" <Version>16</Version>\n" +
245+
" <Count>2</Count>\n" +
246+
" <Actions>\n" +
247+
" <ActionTime>1642605533</ActionTime>\n" +
248+
" <ActionType>300001</ActionType>\n" +
249+
" <ActionMsg><![CDATA[揽件阶段-揽件成功]]></ActionMsg>\n" +
250+
" <Lat>0</Lat>\n" +
251+
" <Lng>0</Lng>\n" +
252+
" </Actions>\n" +
253+
" <Actions>\n" +
254+
" <ActionTime>1642605533</ActionTime>\n" +
255+
" <ActionType>100001</ActionType>\n" +
256+
" <ActionMsg><![CDATA[揽件阶段-揽件成功]]></ActionMsg>\n" +
257+
" <Lat>0</Lat>\n" +
258+
" <Lng>0</Lng>\n" +
259+
" </Actions>\n" +
260+
" <OrderId><![CDATA[01234567894]]></OrderId>\n" +
261+
"</xml>";
262+
263+
WxMaMessage wxMessage = WxMaMessage.fromXml(xml);
264+
Map<String, Object> allFieldsMap = wxMessage.getAllFieldsMap();
265+
assertThat(allFieldsMap).isNotEmpty()
266+
.containsEntry("ToUserName", "gh_3953b390c11d")
267+
.containsEntry("FromUserName", "ofYMP5JFT4SD7EX1LQv3IWrciBSo")
268+
.containsEntry("CreateTime", "1642658087")
269+
.containsEntry("MsgType", "event")
270+
.containsEntry("Event", "add_express_path")
271+
.containsEntry("DeliveryID", "TEST")
272+
.containsEntry("WayBillId", "01234567894_waybill_id")
273+
.containsEntry("Version", "16")
274+
.containsEntry("Count", "2")
275+
.containsEntry("OrderId", "01234567894");
276+
277+
List<Map<String, Object>> actions = (List<Map<String, Object>>) allFieldsMap.get("Actions");
278+
assertThat(actions).isNotEmpty().hasSize(2);
279+
280+
assertThat(actions.get(0))
281+
.containsEntry("ActionTime", "1642605533")
282+
.containsEntry("ActionType", "300001")
283+
.containsEntry("ActionMsg", "揽件阶段-揽件成功")
284+
.containsEntry("Lat", "0")
285+
.containsEntry("Lng", "0");
286+
287+
assertThat(actions.get(1))
288+
.containsEntry("ActionTime", "1642605533")
289+
.containsEntry("ActionType", "100001")
290+
.containsEntry("ActionMsg", "揽件阶段-揽件成功")
291+
.containsEntry("Lat", "0")
292+
.containsEntry("Lng", "0");
293+
}
229294
}

0 commit comments

Comments
 (0)