mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-08-24 07:23:01 +08:00
🐛 #1169 修复企业微信更新成员事件消息解析问题
This commit is contained in:
parent
db638dd8b1
commit
33929ce197
@ -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;
|
import com.thoughtworks.xstream.converters.basic.StringConverter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CDATA 内容转换器,加上CDATA标签.
|
||||||
|
*
|
||||||
|
* @author Daniel Qian
|
||||||
|
*/
|
||||||
public class XStreamCDataConverter extends StringConverter {
|
public class XStreamCDataConverter extends StringConverter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -7,6 +7,8 @@ import lombok.Data;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import me.chanjar.weixin.common.api.WxConsts;
|
import me.chanjar.weixin.common.api.WxConsts;
|
||||||
import me.chanjar.weixin.common.util.XmlUtils;
|
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.common.util.xml.XStreamCDataConverter;
|
||||||
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
|
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
|
||||||
import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
|
import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
|
||||||
@ -214,7 +216,7 @@ public class WxCpXmlMessage implements Serializable {
|
|||||||
* 成员部门列表,变更时推送,仅返回该应用有查看权限的部门id.
|
* 成员部门列表,变更时推送,仅返回该应用有查看权限的部门id.
|
||||||
*/
|
*/
|
||||||
@XStreamAlias("Department")
|
@XStreamAlias("Department")
|
||||||
@XStreamConverter(value = XStreamCDataConverter.class)
|
@XStreamConverter(value = LongArrayConverter.class)
|
||||||
private Long[] departments;
|
private Long[] departments;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -268,6 +270,7 @@ public class WxCpXmlMessage implements Serializable {
|
|||||||
* 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应.
|
* 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应.
|
||||||
*/
|
*/
|
||||||
@XStreamAlias("IsLeaderInDept")
|
@XStreamAlias("IsLeaderInDept")
|
||||||
|
@XStreamConverter(value = IntegerArrayConverter.class)
|
||||||
private Integer[] isLeaderInDept;
|
private Integer[] isLeaderInDept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,9 +2,11 @@ package me.chanjar.weixin.cp.bean;
|
|||||||
|
|
||||||
import me.chanjar.weixin.common.api.WxConsts;
|
import me.chanjar.weixin.common.api.WxConsts;
|
||||||
import me.chanjar.weixin.cp.constant.WxCpConsts;
|
import me.chanjar.weixin.cp.constant.WxCpConsts;
|
||||||
|
import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import static me.chanjar.weixin.cp.constant.WxCpConsts.EventType.TASKCARD_CLICK;
|
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.assertEquals;
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
|
||||||
@ -222,4 +224,52 @@ public class WxCpXmlMessageTest {
|
|||||||
assertEquals(wxMessage.getUserId(), "zhangsan");
|
assertEquals(wxMessage.getUserId(), "zhangsan");
|
||||||
assertEquals(wxMessage.getExternalUserId(), "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w");
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user