From e5a15dc39db4c292c50979065abd23e7cc17c760 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 3 Jan 2026 06:50:56 +0000
Subject: [PATCH 1/2] Initial plan
From 2c2b06e973223da54c73b0b6fd61dfb90576547a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 3 Jan 2026 07:00:12 +0000
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=81=E4=B8=9A?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=BE=A4=E8=81=8A=E5=8F=98=E6=9B=B4=E4=BA=8B?=
=?UTF-8?q?=E4=BB=B6MemChangeList=E5=AD=97=E6=AE=B5=E5=91=BD=E5=90=8D?=
=?UTF-8?q?=E9=97=AE=E9=A2=98=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
---
.../cp/bean/message/WxCpXmlMessage.java | 2 +-
.../cp/bean/message/WxCpXmlMessageTest.java | 74 +++++++++++++++++++
2 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java
index d15eda882..4001c7d0e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java
@@ -157,7 +157,7 @@ public class WxCpXmlMessage implements Serializable {
@XStreamAlias("MemChangeList")
@XStreamConverter(value = XStreamCDataConverter.class)
- private String MemChangeList;
+ private String memChangeList;
@XStreamAlias("LastMemVer")
@XStreamConverter(value = XStreamCDataConverter.class)
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java
index 94874519c..0b2324a5f 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java
@@ -497,4 +497,78 @@ public void testIntelligentRobotMessage() {
assertEquals(wxMessage.getRobotId(), "robot_id_123");
assertEquals(wxMessage.getSessionId(), "session_id_456");
}
+
+ /**
+ * Test external chat change event
+ * 测试企业微信群聊变更事件解析 - 群成员变更场景
+ */
+ public void testExternalChatChangeEvent() {
+ // 测试群成员加入事件
+ String xmlAddMember = ""
+ + ""
+ + ""
+ + "1403610513"
+ + ""
+ + ""
+ + ""
+ + ""
+ + ""
+ + "1"
+ + "2"
+ + ""
+ + "";
+ WxCpXmlMessage wxMessage = WxCpXmlMessage.fromXml(xmlAddMember);
+ assertEquals(wxMessage.getToUserName(), "toUser");
+ assertEquals(wxMessage.getFromUserName(), "sys");
+ assertEquals(wxMessage.getCreateTime(), Long.valueOf(1403610513L));
+ assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT);
+ assertEquals(wxMessage.getEvent(), WxCpConsts.EventType.CHANGE_EXTERNAL_CHAT);
+ assertEquals(wxMessage.getChangeType(), "update");
+ assertEquals(wxMessage.getChatId(), "wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA");
+ assertEquals(wxMessage.getUpdateDetail(), "add_member");
+ assertEquals(wxMessage.getJoinScene(), "1");
+ assertEquals(wxMessage.getMemChangeCnt(), "2");
+ assertEquals(wxMessage.getMemChangeList(), "wmEJiCwAAA9KG2qlSq6rKwASSgAAAA,wmEJiCwAAA9KG2qlSq6rKwBBBBBBB");
+
+ // 测试群成员退出事件
+ String xmlDelMember = ""
+ + ""
+ + ""
+ + "1403610513"
+ + ""
+ + ""
+ + ""
+ + ""
+ + ""
+ + "1"
+ + "1"
+ + ""
+ + "";
+ WxCpXmlMessage wxMessage2 = WxCpXmlMessage.fromXml(xmlDelMember);
+ assertEquals(wxMessage2.getEvent(), WxCpConsts.EventType.CHANGE_EXTERNAL_CHAT);
+ assertEquals(wxMessage2.getChangeType(), "update");
+ assertEquals(wxMessage2.getChatId(), "wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA");
+ assertEquals(wxMessage2.getUpdateDetail(), "del_member");
+ assertEquals(wxMessage2.getQuitScene(), "1");
+ assertEquals(wxMessage2.getMemChangeCnt(), "1");
+ assertEquals(wxMessage2.getMemChangeList(), "wmEJiCwAAA9KG2qlSq6rKwASSgAAAA");
+
+ // 测试空MemChangeList场景(某些情况下可能没有成员变更列表)
+ String xmlNoMemChangeList = ""
+ + ""
+ + ""
+ + "1403610513"
+ + ""
+ + ""
+ + ""
+ + ""
+ + ""
+ + "";
+ WxCpXmlMessage wxMessage3 = WxCpXmlMessage.fromXml(xmlNoMemChangeList);
+ assertEquals(wxMessage3.getEvent(), WxCpConsts.EventType.CHANGE_EXTERNAL_CHAT);
+ assertEquals(wxMessage3.getChangeType(), "update");
+ assertEquals(wxMessage3.getUpdateDetail(), "change_name");
+ // 当XML中没有MemChangeList元素时,字段应该为null而不是空字符串
+ assertThat(wxMessage3.getMemChangeList()).isNull();
+ }
}