mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 02:28:25 +08:00 
			
		
		
		
	🐛 #1169 修复企业微信更新成员事件消息解析问题
This commit is contained in:
		| @ -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; | ||||
|   } | ||||
| } | ||||
| @ -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; | ||||
|   } | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
|   /** | ||||
|  | ||||
| @ -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)); | ||||
|   } | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Binary Wang
					Binary Wang