Skip to content

Commit d5d106f

Browse files
committed
#705 企业微信用户相关接口增加成员对外信息external_profile
1 parent 4990c62 commit d5d106f

File tree

4 files changed

+262
-2
lines changed

4 files changed

+262
-2
lines changed

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import java.util.List;
66

77
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
89
import lombok.Data;
10+
import lombok.NoArgsConstructor;
911
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
1012

1113
/**
@@ -34,6 +36,14 @@ public class WxCpUser implements Serializable {
3436
private String telephone;
3537
private String qrCode;
3638
private Boolean toInvite;
39+
/**
40+
* 成员对外信息.
41+
*/
42+
private List<ExternalAttr> externalAttrs = new ArrayList<>();
43+
44+
public void addExternalAttr(ExternalAttr externalAttr) {
45+
this.externalAttrs.add(externalAttr);
46+
}
3747

3848
public void addExtAttr(String name, String value) {
3949
this.extAttrs.add(new Attr(name, value));
@@ -54,4 +64,40 @@ public static class Attr {
5464
private String value;
5565
}
5666

67+
@Data
68+
@Builder
69+
@NoArgsConstructor
70+
@AllArgsConstructor
71+
public static class ExternalAttr {
72+
/**
73+
* 属性类型: 0-本文 1-网页 2-小程序.
74+
*/
75+
private int type;
76+
/**
77+
* 属性名称: 需要先确保在管理端有创建改属性,否则会忽略.
78+
*/
79+
private String name;
80+
/**
81+
* 文本属性内容,长度限制12个UTF8字符.
82+
*/
83+
private String value;
84+
/**
85+
* 网页的url,必须包含http或者https头.
86+
*/
87+
private String url;
88+
/**
89+
* 小程序的展示标题,长度限制12个UTF8字符.
90+
* 或者 网页的展示标题,长度限制12个UTF8字符
91+
*/
92+
private String title;
93+
/**
94+
* 小程序appid,必须是有在本企业安装授权的小程序,否则会被忽略.
95+
*/
96+
private String appid;
97+
/**
98+
* 小程序的页面路径.
99+
*/
100+
private String pagePath;
101+
}
102+
57103
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpGsonBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import me.chanjar.weixin.cp.bean.WxCpTag;
1111
import me.chanjar.weixin.cp.bean.WxCpUser;
1212

13+
/**
14+
* @author Daniel Qian
15+
*/
1316
public class WxCpGsonBuilder {
1417

1518
public static final GsonBuilder INSTANCE = new GsonBuilder();

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

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
* @author Daniel Qian
2828
*/
2929
public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSerializer<WxCpUser> {
30+
private static final String EXTERNAL_PROFILE = "external_profile";
31+
private static final String EXTERNAL_ATTR = "external_attr";
3032

3133
@Override
32-
public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
33-
throws JsonParseException {
34+
public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
3435
JsonObject o = json.getAsJsonObject();
3536
WxCpUser user = new WxCpUser();
3637

@@ -71,6 +72,53 @@ public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationC
7172
user.getExtAttrs().add(attr);
7273
}
7374
}
75+
76+
if (GsonHelper.isNotNull(o.get(EXTERNAL_PROFILE))) {
77+
JsonArray attrJsonElements = o.get(EXTERNAL_PROFILE).getAsJsonObject().get(EXTERNAL_ATTR).getAsJsonArray();
78+
for (JsonElement element : attrJsonElements) {
79+
final Integer type = GsonHelper.getInteger(element.getAsJsonObject(), "type");
80+
final String name = GsonHelper.getString(element.getAsJsonObject(), "name");
81+
82+
switch (type) {
83+
case 0: {
84+
user.getExternalAttrs()
85+
.add(WxCpUser.ExternalAttr.builder()
86+
.type(type)
87+
.name(name)
88+
.value(GsonHelper.getString(element.getAsJsonObject().get("text").getAsJsonObject(), "value"))
89+
.build()
90+
);
91+
break;
92+
}
93+
case 1: {
94+
final JsonObject web = element.getAsJsonObject().get("web").getAsJsonObject();
95+
user.getExternalAttrs()
96+
.add(WxCpUser.ExternalAttr.builder()
97+
.type(type)
98+
.name(name)
99+
.url(GsonHelper.getString(web, "url"))
100+
.title(GsonHelper.getString(web, "title"))
101+
.build()
102+
);
103+
break;
104+
}
105+
case 2: {
106+
final JsonObject miniprogram = element.getAsJsonObject().get("miniprogram").getAsJsonObject();
107+
user.getExternalAttrs()
108+
.add(WxCpUser.ExternalAttr.builder()
109+
.type(type)
110+
.name(name)
111+
.appid(GsonHelper.getString(miniprogram, "appid"))
112+
.pagePath(GsonHelper.getString(miniprogram, "pagepath"))
113+
.title(GsonHelper.getString(miniprogram, "title"))
114+
.build()
115+
);
116+
break;
117+
}
118+
default://ignored
119+
}
120+
}
121+
}
74122
return user;
75123
}
76124

@@ -145,6 +193,45 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon
145193
attrsJson.add("attrs", attrsJsonArray);
146194
o.add("extattr", attrsJson);
147195
}
196+
197+
if (user.getExternalAttrs().size() > 0) {
198+
JsonArray attrsJsonArray = new JsonArray();
199+
for (WxCpUser.ExternalAttr attr : user.getExternalAttrs()) {
200+
JsonObject attrJson = new JsonObject();
201+
attrJson.addProperty("type",attr.getType());
202+
attrJson.addProperty("name", attr.getName());
203+
switch (attr.getType()) {
204+
case 0: {
205+
JsonObject text = new JsonObject();
206+
text.addProperty("value", attr.getValue());
207+
attrJson.add("text", text);
208+
break;
209+
}
210+
case 1: {
211+
JsonObject web = new JsonObject();
212+
web.addProperty("url", attr.getUrl());
213+
web.addProperty("title", attr.getTitle());
214+
attrJson.add("web", web);
215+
break;
216+
}
217+
case 2: {
218+
JsonObject miniprogram = new JsonObject();
219+
miniprogram.addProperty("appid", attr.getAppid());
220+
miniprogram.addProperty("pagepath", attr.getPagePath());
221+
miniprogram.addProperty("title", attr.getTitle());
222+
attrJson.add("miniprogram", miniprogram);
223+
break;
224+
}
225+
default://忽略
226+
}
227+
attrsJsonArray.add(attrJson);
228+
}
229+
230+
JsonObject attrsJson = new JsonObject();
231+
attrsJson.add(EXTERNAL_ATTR, attrsJsonArray);
232+
o.add(EXTERNAL_PROFILE, attrsJson);
233+
}
234+
148235
return o;
149236
}
150237

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package me.chanjar.weixin.cp.util.json;
2+
3+
import org.testng.annotations.*;
4+
5+
import me.chanjar.weixin.cp.bean.WxCpUser;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
/**
10+
* <pre>
11+
*
12+
* Created by Binary Wang on 2018/9/16.
13+
* </pre>
14+
*
15+
* @author BinaryWang
16+
*/
17+
public class WxCpUserGsonAdapterTest {
18+
19+
@Test
20+
public void testDeserialize() {
21+
final String userJson = "{\n" +
22+
" \"errcode\": 0,\n" +
23+
" \"errmsg\": \"ok\",\n" +
24+
" \"userid\": \"zhangsan\",\n" +
25+
" \"name\": \"李四\",\n" +
26+
" \"department\": [1, 2],\n" +
27+
" \"order\": [1, 2],\n" +
28+
" \"position\": \"后台工程师\",\n" +
29+
" \"mobile\": \"15913215421\",\n" +
30+
" \"gender\": \"1\",\n" +
31+
" \"email\": \"[email protected]\",\n" +
32+
" \"isleader\": 1,\n" +
33+
" \"avatar\": \"http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0\",\n" +
34+
" \"telephone\": \"020-123456\",\n" +
35+
" \"enable\": 1,\n" +
36+
" \"alias\": \"jackzhang\",\n" +
37+
" \"extattr\": {\n" +
38+
" \"attrs\": [{\n" +
39+
" \"name\": \"爱好\",\n" +
40+
" \"value\": \"旅游\"\n" +
41+
" }, {\n" +
42+
" \"name\": \"卡号\",\n" +
43+
" \"value\": \"1234567234\"\n" +
44+
" }]\n" +
45+
" },\n" +
46+
" \"status\": 1,\n" +
47+
" \"qr_code\": \"https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx\",\n" +
48+
" \"external_profile\": {\n" +
49+
" \"external_attr\": [{\n" +
50+
" \"type\": 0,\n" +
51+
" \"name\": \"文本名称\",\n" +
52+
" \"text\": {\n" +
53+
" \"value\": \"文本\"\n" +
54+
" }\n" +
55+
" },\n" +
56+
" {\n" +
57+
" \"type\": 1,\n" +
58+
" \"name\": \"网页名称\",\n" +
59+
" \"web\": {\n" +
60+
" \"url\": \"http://www.test.com\",\n" +
61+
" \"title\": \"标题\"\n" +
62+
" }\n" +
63+
" },\n" +
64+
" {\n" +
65+
" \"type\": 2,\n" +
66+
" \"name\": \"测试app\",\n" +
67+
" \"miniprogram\": {\n" +
68+
" \"appid\": \"wx8bd80126147df384\",\n" +
69+
" \"pagepath\": \"/index\",\n" +
70+
" \"title\": \"my miniprogram\"\n" +
71+
" }\n" +
72+
" }\n" +
73+
" ]\n" +
74+
" }\n" +
75+
"}";
76+
77+
final WxCpUser user = WxCpUser.fromJson(userJson);
78+
assertThat(user).isNotNull();
79+
assertThat(user.getExternalAttrs()).isNotEmpty();
80+
81+
final WxCpUser.ExternalAttr externalAttr1 = user.getExternalAttrs().get(0);
82+
assertThat(externalAttr1.getType()).isEqualTo(0);
83+
assertThat(externalAttr1.getName()).isEqualTo("文本名称");
84+
assertThat(externalAttr1.getValue()).isEqualTo("文本");
85+
86+
final WxCpUser.ExternalAttr externalAttr2 = user.getExternalAttrs().get(1);
87+
assertThat(externalAttr2.getType()).isEqualTo(1);
88+
assertThat(externalAttr2.getName()).isEqualTo("网页名称");
89+
assertThat(externalAttr2.getUrl()).isEqualTo("http://www.test.com");
90+
assertThat(externalAttr2.getTitle()).isEqualTo("标题");
91+
92+
final WxCpUser.ExternalAttr externalAttr3 = user.getExternalAttrs().get(2);
93+
assertThat(externalAttr3.getType()).isEqualTo(2);
94+
assertThat(externalAttr3.getName()).isEqualTo("测试app");
95+
assertThat(externalAttr3.getAppid()).isEqualTo("wx8bd80126147df384");
96+
assertThat(externalAttr3.getPagePath()).isEqualTo("/index");
97+
assertThat(externalAttr3.getTitle()).isEqualTo("my miniprogram");
98+
}
99+
100+
@Test
101+
public void testSerialize() {
102+
WxCpUser user = new WxCpUser();
103+
user.addExternalAttr(WxCpUser.ExternalAttr.builder()
104+
.type(0)
105+
.name("文本名称")
106+
.value("文本")
107+
.build());
108+
user.addExternalAttr(WxCpUser.ExternalAttr.builder()
109+
.type(1)
110+
.name("网页名称")
111+
.url("http://www.test.com")
112+
.title("标题")
113+
.build());
114+
user.addExternalAttr(WxCpUser.ExternalAttr.builder()
115+
.type(2)
116+
.name("测试app")
117+
.appid("wx8bd80126147df384")
118+
.pagePath("/index")
119+
.title("my miniprogram")
120+
.build());
121+
122+
assertThat(user.toJson()).isEqualTo("{\"external_profile\":{\"external_attr\":[{\"type\":0,\"name\":\"文本名称\",\"text\":{\"value\":\"文本\"}},{\"type\":1,\"name\":\"网页名称\",\"web\":{\"url\":\"http://www.test.com\",\"title\":\"标题\"}},{\"type\":2,\"name\":\"测试app\",\"miniprogram\":{\"appid\":\"wx8bd80126147df384\",\"pagepath\":\"/index\",\"title\":\"my miniprogram\"}}]}}");
123+
}
124+
}

0 commit comments

Comments
 (0)