Browse Source

:bug: #1169 修复企业微信更新成员事件消息解析问题

Binary Wang 5 years ago
parent
commit
33929ce197

+ 37 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java

@@ -0,0 +1,37 @@
+package me.chanjar.weixin.common.util.xml;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.thoughtworks.xstream.converters.basic.StringConverter;
+
+/**
+ * Integer型数组转换器.
+ *
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ * @date 2019-08-22
+ */
+public class IntegerArrayConverter extends StringConverter {
+  @Override
+  public boolean canConvert(Class type) {
+    return type == Integer[].class;
+  }
+
+  @Override
+  public String toString(Object obj) {
+    return "<![CDATA[" + Joiner.on(",").join((Integer[]) obj) + "]]>";
+  }
+
+  @Override
+  public Object fromString(String str) {
+    final Iterable<String> iterable = Splitter.on(",").split(str);
+    final String[] strings = Iterables.toArray(iterable, String.class);
+    Integer[] result = new Integer[strings.length];
+    int index = 0;
+    for (String string : strings) {
+      result[index++] = Integer.parseInt(string);
+    }
+
+    return result;
+  }
+}

+ 37 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java

@@ -0,0 +1,37 @@
+package me.chanjar.weixin.common.util.xml;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.thoughtworks.xstream.converters.basic.StringConverter;
+
+/**
+ * Long型数组转换器.
+ *
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ * @date 2019-08-22
+ */
+public class LongArrayConverter extends StringConverter {
+  @Override
+  public boolean canConvert(Class type) {
+    return type == Long[].class;
+  }
+
+  @Override
+  public String toString(Object obj) {
+    return "<![CDATA[" + Joiner.on(",").join((Long[]) obj) + "]]>";
+  }
+
+  @Override
+  public Object fromString(String str) {
+    final Iterable<String> iterable = Splitter.on(",").split(str);
+    final String[] strings = Iterables.toArray(iterable, String.class);
+    Long[] result = new Long[strings.length];
+    int index = 0;
+    for (String string : strings) {
+      result[index++] = Long.parseLong(string);
+    }
+
+    return result;
+  }
+}

+ 5 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java

@@ -2,6 +2,11 @@ package me.chanjar.weixin.common.util.xml;
 
 import com.thoughtworks.xstream.converters.basic.StringConverter;
 
+/**
+ * CDATA 内容转换器,加上CDATA标签.
+ *
+ * @author Daniel Qian
+ */
 public class XStreamCDataConverter extends StringConverter {
 
   @Override

+ 4 - 1
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java

@@ -7,6 +7,8 @@ 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.IntegerArrayConverter;
+import me.chanjar.weixin.common.util.xml.LongArrayConverter;
 import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
 import me.chanjar.weixin.cp.config.WxCpConfigStorage;
 import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
@@ -214,7 +216,7 @@ public class WxCpXmlMessage implements Serializable {
    * 成员部门列表,变更时推送,仅返回该应用有查看权限的部门id.
    */
   @XStreamAlias("Department")
-  @XStreamConverter(value = XStreamCDataConverter.class)
+  @XStreamConverter(value = LongArrayConverter.class)
   private Long[] departments;
 
   /**
@@ -268,6 +270,7 @@ public class WxCpXmlMessage implements Serializable {
    * 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应.
    */
   @XStreamAlias("IsLeaderInDept")
+  @XStreamConverter(value = IntegerArrayConverter.class)
   private Integer[] isLeaderInDept;
 
   /**

+ 50 - 0
weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java

@@ -2,9 +2,11 @@ package me.chanjar.weixin.cp.bean;
 
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.cp.constant.WxCpConsts;
+import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
 import org.testng.annotations.Test;
 
 import static me.chanjar.weixin.cp.constant.WxCpConsts.EventType.TASKCARD_CLICK;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
@@ -222,4 +224,52 @@ public class WxCpXmlMessageTest {
     assertEquals(wxMessage.getUserId(), "zhangsan");
     assertEquals(wxMessage.getExternalUserId(), "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w");
   }
+
+  public void testChangeContact() {
+    String xml = "<xml>\n" +
+      "    <ToUserName><![CDATA[toUser]]></ToUserName>\n" +
+      "    <FromUserName><![CDATA[sys]]></FromUserName> \n" +
+      "    <CreateTime>1403610513</CreateTime>\n" +
+      "    <MsgType><![CDATA[event]]></MsgType>\n" +
+      "    <Event><![CDATA[change_contact]]></Event>\n" +
+      "    <ChangeType>update_user</ChangeType>\n" +
+      "    <UserID><![CDATA[zhangsan]]></UserID>\n" +
+      "    <NewUserID><![CDATA[zhangsan001]]></NewUserID>\n" +
+      "    <Name><![CDATA[张三]]></Name>\n" +
+      "    <Department><![CDATA[1,2,3]]></Department>\n" +
+      "    <IsLeaderInDept><![CDATA[1,0,0]]></IsLeaderInDept>\n" +
+      "    <Position><![CDATA[产品经理]]></Position>\n" +
+      "    <Mobile>15913215421</Mobile>\n" +
+      "    <Gender>1</Gender>\n" +
+      "    <Email><![CDATA[zhangsan@gzdev.com]]></Email>\n" +
+      "    <Status>1</Status>\n" +
+      "    <Avatar><![CDATA[http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0]]></Avatar>\n" +
+      "    <Alias><![CDATA[zhangsan]]></Alias>\n" +
+      "    <Telephone><![CDATA[020-3456788]]></Telephone>\n" +
+      "    <Address><![CDATA[广州市]]></Address>\n" +
+      "    <ExtAttr>\n" +
+      "        <Item>\n" +
+      "        <Name><![CDATA[爱好]]></Name>\n" +
+      "        <Type>0</Type>\n" +
+      "        <Text>\n" +
+      "            <Value><![CDATA[旅游]]></Value>\n" +
+      "        </Text>\n" +
+      "        </Item>\n" +
+      "        <Item>\n" +
+      "        <Name><![CDATA[卡号]]></Name>\n" +
+      "        <Type>1</Type>\n" +
+      "        <Web>\n" +
+      "            <Title><![CDATA[企业微信]]></Title>\n" +
+      "            <Url><![CDATA[https://work.weixin.qq.com]]></Url>\n" +
+      "        </Web>\n" +
+      "        </Item>\n" +
+      "    </ExtAttr>\n" +
+      "</xml>";
+
+    WxCpXmlMessage wxCpXmlMessage = WxCpXmlMessage.fromXml(xml);
+    assertThat(wxCpXmlMessage).isNotNull();
+    assertThat(wxCpXmlMessage.getDepartments()).isNotEmpty();
+
+    System.out.println(XStreamTransformer.toXml(WxCpXmlMessage.class, wxCpXmlMessage));
+  }
 }