Skip to content

Commit 8d6978d

Browse files
committed
🎨 #1456 企业微信通讯录成员属性相关代码根据最新接口文档进行同步完善,并增加几个新的属性
1 parent 83d1b93 commit 8d6978d

File tree

3 files changed

+120
-40
lines changed

3 files changed

+120
-40
lines changed

Diff for: weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.Builder;
55
import lombok.Data;
66
import lombok.NoArgsConstructor;
7+
import lombok.experimental.Accessors;
78
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
89

910
import java.io.Serializable;
@@ -16,8 +17,10 @@
1617
* @author Daniel Qian
1718
*/
1819
@Data
20+
@Accessors(chain = true)
1921
public class WxCpUser implements Serializable {
2022
private static final long serialVersionUID = -5696099236344075582L;
23+
2124
private String userId;
2225
private String name;
2326
private Long[] departIds;
@@ -56,13 +59,19 @@ public class WxCpUser implements Serializable {
5659
* 成员对外信息.
5760
*/
5861
private List<ExternalAttribute> externalAttrs = new ArrayList<>();
62+
private String externalPosition;
63+
private String externalCorpName;
5964

6065
public void addExternalAttr(ExternalAttribute externalAttr) {
6166
this.externalAttrs.add(externalAttr);
6267
}
6368

6469
public void addExtAttr(String name, String value) {
65-
this.extAttrs.add(new Attr(name, value));
70+
this.extAttrs.add(new Attr().setType(0).setName(name).setTextValue(value));
71+
}
72+
73+
public void addExtAttr(Attr attr) {
74+
this.extAttrs.add(attr);
6675
}
6776

6877
public static WxCpUser fromJson(String json) {
@@ -74,10 +83,16 @@ public String toJson() {
7483
}
7584

7685
@Data
77-
@AllArgsConstructor
86+
@Accessors(chain = true)
7887
public static class Attr {
88+
/**
89+
* 属性类型: 0-文本 1-网页
90+
*/
91+
private int type;
7992
private String name;
80-
private String value;
93+
private String textValue;
94+
private String webUrl;
95+
private String webTitle;
8196
}
8297

8398
@Data

Diff for: weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java

+60-25
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,13 @@
99

1010
package me.chanjar.weixin.cp.util.json;
1111

12-
import java.lang.reflect.Type;
13-
14-
import com.google.gson.JsonArray;
15-
import com.google.gson.JsonDeserializationContext;
16-
import com.google.gson.JsonDeserializer;
17-
import com.google.gson.JsonElement;
18-
import com.google.gson.JsonObject;
19-
import com.google.gson.JsonParseException;
20-
import com.google.gson.JsonPrimitive;
21-
import com.google.gson.JsonSerializationContext;
22-
import com.google.gson.JsonSerializer;
12+
import com.google.gson.*;
2313
import me.chanjar.weixin.common.util.json.GsonHelper;
2414
import me.chanjar.weixin.cp.bean.Gender;
2515
import me.chanjar.weixin.cp.bean.WxCpUser;
2616

17+
import java.lang.reflect.Type;
18+
2719
/**
2820
* cp user gson adapter.
2921
*
@@ -32,15 +24,18 @@
3224
public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSerializer<WxCpUser> {
3325
private static final String EXTERNAL_PROFILE = "external_profile";
3426
private static final String EXTERNAL_ATTR = "external_attr";
35-
private static final String EXTATTR = "extattr";
27+
private static final String EXTRA_ATTR = "extattr";
28+
private static final String EXTERNAL_POSITION = "external_position";
29+
private static final String DEPARTMENT = "department";
30+
private static final String EXTERNAL_CORP_NAME = "external_corp_name";
3631

3732
@Override
3833
public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
3934
JsonObject o = json.getAsJsonObject();
4035
WxCpUser user = new WxCpUser();
4136

42-
if (o.get("department") != null) {
43-
JsonArray departJsonArray = o.get("department").getAsJsonArray();
37+
if (o.get(DEPARTMENT) != null) {
38+
JsonArray departJsonArray = o.get(DEPARTMENT).getAsJsonArray();
4439
Long[] departIds = new Long[departJsonArray.size()];
4540
int i = 0;
4641
for (JsonElement jsonElement : departJsonArray) {
@@ -80,25 +75,41 @@ public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationC
8075
user.setQrCode(GsonHelper.getString(o, "qr_code"));
8176
user.setToInvite(GsonHelper.getBoolean(o, "to_invite"));
8277

83-
if (GsonHelper.isNotNull(o.get(EXTATTR))) {
78+
if (GsonHelper.isNotNull(o.get(EXTRA_ATTR))) {
8479
this.buildExtraAttrs(o, user);
8580
}
8681

8782
if (GsonHelper.isNotNull(o.get(EXTERNAL_PROFILE))) {
83+
user.setExternalCorpName(GsonHelper.getString(o.getAsJsonObject().get(EXTERNAL_PROFILE).getAsJsonObject(), EXTERNAL_CORP_NAME));
8884
this.buildExternalAttrs(o, user);
8985
}
9086

87+
user.setExternalPosition(GsonHelper.getString(o, EXTERNAL_POSITION));
88+
9189
return user;
9290
}
9391

9492
private void buildExtraAttrs(JsonObject o, WxCpUser user) {
95-
JsonArray attrJsonElements = o.get(EXTATTR).getAsJsonObject().get("attrs").getAsJsonArray();
93+
JsonArray attrJsonElements = o.get(EXTRA_ATTR).getAsJsonObject().get("attrs").getAsJsonArray();
9694
for (JsonElement attrJsonElement : attrJsonElements) {
97-
WxCpUser.Attr attr = new WxCpUser.Attr(
98-
GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"),
99-
GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value")
100-
);
95+
final Integer type = GsonHelper.getInteger(attrJsonElement.getAsJsonObject(), "type");
96+
final WxCpUser.Attr attr = new WxCpUser.Attr().setType(type)
97+
.setName(GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"));
10198
user.getExtAttrs().add(attr);
99+
100+
switch (type) {
101+
case 0: {
102+
attr.setTextValue(GsonHelper.getString(attrJsonElement.getAsJsonObject().get("text").getAsJsonObject(), "value"));
103+
break;
104+
}
105+
case 1: {
106+
final JsonObject web = attrJsonElement.getAsJsonObject().get("web").getAsJsonObject();
107+
attr.setWebTitle(GsonHelper.getString(web, "title"))
108+
.setWebUrl(GsonHelper.getString(web, "url"));
109+
break;
110+
}
111+
default://ignored
112+
}
102113
}
103114
}
104115

@@ -237,13 +248,39 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon
237248
JsonArray attrsJsonArray = new JsonArray();
238249
for (WxCpUser.Attr attr : user.getExtAttrs()) {
239250
JsonObject attrJson = new JsonObject();
240-
attrJson.addProperty("name", attr.getName());
241-
attrJson.addProperty("value", attr.getValue());
251+
252+
switch (attr.getType()) {
253+
case 0: {
254+
JsonObject text = new JsonObject();
255+
text.addProperty("value", attr.getTextValue());
256+
attrJson.add("text", text);
257+
break;
258+
}
259+
case 1: {
260+
JsonObject web = new JsonObject();
261+
web.addProperty("url", attr.getWebUrl());
262+
web.addProperty("title", attr.getWebTitle());
263+
attrJson.add("web", web);
264+
break;
265+
}
266+
default: //ignored
267+
}
242268
attrsJsonArray.add(attrJson);
243269
}
244270
JsonObject attrsJson = new JsonObject();
245271
attrsJson.add("attrs", attrsJsonArray);
246-
o.add(EXTATTR, attrsJson);
272+
o.add(EXTRA_ATTR, attrsJson);
273+
}
274+
275+
if (user.getExternalPosition() != null) {
276+
o.addProperty(EXTERNAL_POSITION, user.getExternalPosition());
277+
}
278+
279+
JsonObject attrsJson = new JsonObject();
280+
o.add(EXTERNAL_PROFILE, attrsJson);
281+
282+
if (user.getExternalCorpName() != null) {
283+
attrsJson.addProperty(EXTERNAL_CORP_NAME, user.getExternalCorpName());
247284
}
248285

249286
if (user.getExternalAttrs().size() > 0) {
@@ -279,9 +316,7 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon
279316
attrsJsonArray.add(attrJson);
280317
}
281318

282-
JsonObject attrsJson = new JsonObject();
283319
attrsJson.add(EXTERNAL_ATTR, attrsJsonArray);
284-
o.add(EXTERNAL_PROFILE, attrsJson);
285320
}
286321

287322
return o;

Diff for: weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java

+42-12
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,31 @@ public void testDeserialize() {
3535
" \"enable\": 1,\n" +
3636
" \"alias\": \"jackzhang\",\n" +
3737
" \"extattr\": {\n" +
38-
" \"attrs\": [{\n" +
39-
" \"name\": \"爱好\",\n" +
40-
" \"value\": \"旅游\"\n" +
41-
" }, {\n" +
42-
" \"name\": \"卡号\",\n" +
43-
" \"value\": \"1234567234\"\n" +
44-
" }]\n" +
45-
" },\n" +
38+
" \"attrs\": [\n" +
39+
" {\n" +
40+
" \"type\": 0,\n" +
41+
" \"name\": \"文本名称\",\n" +
42+
" \"text\": {\n" +
43+
" \"value\": \"文本\"\n" +
44+
" }\n" +
45+
" },\n" +
46+
" {\n" +
47+
" \"type\": 1,\n" +
48+
" \"name\": \"网页名称\",\n" +
49+
" \"web\": {\n" +
50+
" \"url\": \"http://www.test.com\",\n" +
51+
" \"title\": \"标题\"\n" +
52+
" }\n" +
53+
" }\n" +
54+
" ]\n" +
55+
" }," +
4656
" \"status\": 1,\n" +
4757
" \"qr_code\": \"https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx\",\n" +
58+
" \"external_position\": \"高级产品经理\",\n" +
4859
" \"external_profile\": {\n" +
49-
" \"external_attr\": [{\n" +
60+
" \"external_corp_name\": \"企业简称\",\n" +
61+
" \"external_attr\": [\n" +
62+
" {\n" +
5063
" \"type\": 0,\n" +
5164
" \"name\": \"文本名称\",\n" +
5265
" \"text\": {\n" +
@@ -65,13 +78,13 @@ public void testDeserialize() {
6578
" \"type\": 2,\n" +
6679
" \"name\": \"测试app\",\n" +
6780
" \"miniprogram\": {\n" +
68-
" \"appid\": \"wx8bd80126147df384\",\n" +
81+
" \"appid\": \"wx8bd8012614784fake\",\n" +
6982
" \"pagepath\": \"/index\",\n" +
7083
" \"title\": \"my miniprogram\"\n" +
7184
" }\n" +
7285
" }\n" +
7386
" ]\n" +
74-
" }\n" +
87+
" }" +
7588
"}";
7689

7790
final WxCpUser user = WxCpUser.fromJson(userJson);
@@ -84,6 +97,23 @@ public void testDeserialize() {
8497

8598
assertThat(user.getAddress()).isEqualTo("广州市海珠区新港中路");
8699
assertThat(user.getAlias()).isEqualTo("jackzhang");
100+
101+
assertThat(user.getExtAttrs()).isNotEmpty();
102+
103+
final WxCpUser.Attr extraAttr1 = user.getExtAttrs().get(0);
104+
assertThat(extraAttr1.getType()).isEqualTo(0);
105+
assertThat(extraAttr1.getName()).isEqualTo("文本名称");
106+
assertThat(extraAttr1.getTextValue()).isEqualTo("文本");
107+
108+
final WxCpUser.Attr extraAttr2 = user.getExtAttrs().get(1);
109+
assertThat(extraAttr2.getType()).isEqualTo(1);
110+
assertThat(extraAttr2.getName()).isEqualTo("网页名称");
111+
assertThat(extraAttr2.getWebTitle()).isEqualTo("标题");
112+
assertThat(extraAttr2.getWebUrl()).isEqualTo("http://www.test.com");
113+
114+
assertThat(user.getExternalPosition()).isEqualTo("高级产品经理");
115+
assertThat(user.getExternalCorpName()).isEqualTo("企业简称");
116+
87117
assertThat(user.getExternalAttrs()).isNotEmpty();
88118

89119
final WxCpUser.ExternalAttribute externalAttr1 = user.getExternalAttrs().get(0);
@@ -100,7 +130,7 @@ public void testDeserialize() {
100130
final WxCpUser.ExternalAttribute externalAttr3 = user.getExternalAttrs().get(2);
101131
assertThat(externalAttr3.getType()).isEqualTo(2);
102132
assertThat(externalAttr3.getName()).isEqualTo("测试app");
103-
assertThat(externalAttr3.getAppid()).isEqualTo("wx8bd80126147df384");
133+
assertThat(externalAttr3.getAppid()).isEqualTo("wx8bd8012614784fake");
104134
assertThat(externalAttr3.getPagePath()).isEqualTo("/index");
105135
assertThat(externalAttr3.getTitle()).isEqualTo("my miniprogram");
106136

0 commit comments

Comments
 (0)