From 8d6978d757d029b25f3e2dc79992d9e872fee58e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 22 Mar 2020 14:13:36 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#1456=20=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E9=80=9A=E8=AE=AF=E5=BD=95=E6=88=90=E5=91=98=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=90=8C=E6=AD=A5=E5=AE=8C=E5=96=84=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=87=A0=E4=B8=AA=E6=96=B0=E7=9A=84=E5=B1=9E?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/bean/WxCpUser.java | 21 ++++- .../cp/util/json/WxCpUserGsonAdapter.java | 85 +++++++++++++------ .../cp/util/json/WxCpUserGsonAdapterTest.java | 54 +++++++++--- 3 files changed, 120 insertions(+), 40 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java index 90354154a..07ecb4aa8 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.io.Serializable; @@ -16,8 +17,10 @@ import java.util.List; * @author Daniel Qian */ @Data +@Accessors(chain = true) public class WxCpUser implements Serializable { private static final long serialVersionUID = -5696099236344075582L; + private String userId; private String name; private Long[] departIds; @@ -56,13 +59,19 @@ public class WxCpUser implements Serializable { * 成员对外信息. */ private List externalAttrs = new ArrayList<>(); + private String externalPosition; + private String externalCorpName; public void addExternalAttr(ExternalAttribute externalAttr) { this.externalAttrs.add(externalAttr); } public void addExtAttr(String name, String value) { - this.extAttrs.add(new Attr(name, value)); + this.extAttrs.add(new Attr().setType(0).setName(name).setTextValue(value)); + } + + public void addExtAttr(Attr attr) { + this.extAttrs.add(attr); } public static WxCpUser fromJson(String json) { @@ -74,10 +83,16 @@ public class WxCpUser implements Serializable { } @Data - @AllArgsConstructor + @Accessors(chain = true) public static class Attr { + /** + * 属性类型: 0-文本 1-网页 + */ + private int type; private String name; - private String value; + private String textValue; + private String webUrl; + private String webTitle; } @Data diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java index 5128405a4..e8bfd14b2 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java @@ -9,21 +9,13 @@ package me.chanjar.weixin.cp.util.json; -import java.lang.reflect.Type; - -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; +import com.google.gson.*; import me.chanjar.weixin.common.util.json.GsonHelper; import me.chanjar.weixin.cp.bean.Gender; import me.chanjar.weixin.cp.bean.WxCpUser; +import java.lang.reflect.Type; + /** * cp user gson adapter. * @@ -32,15 +24,18 @@ import me.chanjar.weixin.cp.bean.WxCpUser; public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSerializer { private static final String EXTERNAL_PROFILE = "external_profile"; private static final String EXTERNAL_ATTR = "external_attr"; - private static final String EXTATTR = "extattr"; + private static final String EXTRA_ATTR = "extattr"; + private static final String EXTERNAL_POSITION = "external_position"; + private static final String DEPARTMENT = "department"; + private static final String EXTERNAL_CORP_NAME = "external_corp_name"; @Override public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject o = json.getAsJsonObject(); WxCpUser user = new WxCpUser(); - if (o.get("department") != null) { - JsonArray departJsonArray = o.get("department").getAsJsonArray(); + if (o.get(DEPARTMENT) != null) { + JsonArray departJsonArray = o.get(DEPARTMENT).getAsJsonArray(); Long[] departIds = new Long[departJsonArray.size()]; int i = 0; for (JsonElement jsonElement : departJsonArray) { @@ -80,25 +75,41 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri user.setQrCode(GsonHelper.getString(o, "qr_code")); user.setToInvite(GsonHelper.getBoolean(o, "to_invite")); - if (GsonHelper.isNotNull(o.get(EXTATTR))) { + if (GsonHelper.isNotNull(o.get(EXTRA_ATTR))) { this.buildExtraAttrs(o, user); } if (GsonHelper.isNotNull(o.get(EXTERNAL_PROFILE))) { + user.setExternalCorpName(GsonHelper.getString(o.getAsJsonObject().get(EXTERNAL_PROFILE).getAsJsonObject(), EXTERNAL_CORP_NAME)); this.buildExternalAttrs(o, user); } + user.setExternalPosition(GsonHelper.getString(o, EXTERNAL_POSITION)); + return user; } private void buildExtraAttrs(JsonObject o, WxCpUser user) { - JsonArray attrJsonElements = o.get(EXTATTR).getAsJsonObject().get("attrs").getAsJsonArray(); + JsonArray attrJsonElements = o.get(EXTRA_ATTR).getAsJsonObject().get("attrs").getAsJsonArray(); for (JsonElement attrJsonElement : attrJsonElements) { - WxCpUser.Attr attr = new WxCpUser.Attr( - GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"), - GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value") - ); + final Integer type = GsonHelper.getInteger(attrJsonElement.getAsJsonObject(), "type"); + final WxCpUser.Attr attr = new WxCpUser.Attr().setType(type) + .setName(GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name")); user.getExtAttrs().add(attr); + + switch (type) { + case 0: { + attr.setTextValue(GsonHelper.getString(attrJsonElement.getAsJsonObject().get("text").getAsJsonObject(), "value")); + break; + } + case 1: { + final JsonObject web = attrJsonElement.getAsJsonObject().get("web").getAsJsonObject(); + attr.setWebTitle(GsonHelper.getString(web, "title")) + .setWebUrl(GsonHelper.getString(web, "url")); + break; + } + default://ignored + } } } @@ -237,13 +248,39 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri JsonArray attrsJsonArray = new JsonArray(); for (WxCpUser.Attr attr : user.getExtAttrs()) { JsonObject attrJson = new JsonObject(); - attrJson.addProperty("name", attr.getName()); - attrJson.addProperty("value", attr.getValue()); + + switch (attr.getType()) { + case 0: { + JsonObject text = new JsonObject(); + text.addProperty("value", attr.getTextValue()); + attrJson.add("text", text); + break; + } + case 1: { + JsonObject web = new JsonObject(); + web.addProperty("url", attr.getWebUrl()); + web.addProperty("title", attr.getWebTitle()); + attrJson.add("web", web); + break; + } + default: //ignored + } attrsJsonArray.add(attrJson); } JsonObject attrsJson = new JsonObject(); attrsJson.add("attrs", attrsJsonArray); - o.add(EXTATTR, attrsJson); + o.add(EXTRA_ATTR, attrsJson); + } + + if (user.getExternalPosition() != null) { + o.addProperty(EXTERNAL_POSITION, user.getExternalPosition()); + } + + JsonObject attrsJson = new JsonObject(); + o.add(EXTERNAL_PROFILE, attrsJson); + + if (user.getExternalCorpName() != null) { + attrsJson.addProperty(EXTERNAL_CORP_NAME, user.getExternalCorpName()); } if (user.getExternalAttrs().size() > 0) { @@ -279,9 +316,7 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri attrsJsonArray.add(attrJson); } - JsonObject attrsJson = new JsonObject(); attrsJson.add(EXTERNAL_ATTR, attrsJsonArray); - o.add(EXTERNAL_PROFILE, attrsJson); } return o; diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java index abfb8a461..d78175c1b 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java @@ -35,18 +35,31 @@ public class WxCpUserGsonAdapterTest { " \"enable\": 1,\n" + " \"alias\": \"jackzhang\",\n" + " \"extattr\": {\n" + - " \"attrs\": [{\n" + - " \"name\": \"爱好\",\n" + - " \"value\": \"旅游\"\n" + - " }, {\n" + - " \"name\": \"卡号\",\n" + - " \"value\": \"1234567234\"\n" + - " }]\n" + - " },\n" + + " \"attrs\": [\n" + + " {\n" + + " \"type\": 0,\n" + + " \"name\": \"文本名称\",\n" + + " \"text\": {\n" + + " \"value\": \"文本\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"type\": 1,\n" + + " \"name\": \"网页名称\",\n" + + " \"web\": {\n" + + " \"url\": \"http://www.test.com\",\n" + + " \"title\": \"标题\"\n" + + " }\n" + + " }\n" + + " ]\n" + + " }," + " \"status\": 1,\n" + " \"qr_code\": \"https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx\",\n" + + " \"external_position\": \"高级产品经理\",\n" + " \"external_profile\": {\n" + - " \"external_attr\": [{\n" + + " \"external_corp_name\": \"企业简称\",\n" + + " \"external_attr\": [\n" + + " {\n" + " \"type\": 0,\n" + " \"name\": \"文本名称\",\n" + " \"text\": {\n" + @@ -65,13 +78,13 @@ public class WxCpUserGsonAdapterTest { " \"type\": 2,\n" + " \"name\": \"测试app\",\n" + " \"miniprogram\": {\n" + - " \"appid\": \"wx8bd80126147df384\",\n" + + " \"appid\": \"wx8bd8012614784fake\",\n" + " \"pagepath\": \"/index\",\n" + " \"title\": \"my miniprogram\"\n" + " }\n" + " }\n" + " ]\n" + - " }\n" + + " }" + "}"; final WxCpUser user = WxCpUser.fromJson(userJson); @@ -84,6 +97,23 @@ public class WxCpUserGsonAdapterTest { assertThat(user.getAddress()).isEqualTo("广州市海珠区新港中路"); assertThat(user.getAlias()).isEqualTo("jackzhang"); + + assertThat(user.getExtAttrs()).isNotEmpty(); + + final WxCpUser.Attr extraAttr1 = user.getExtAttrs().get(0); + assertThat(extraAttr1.getType()).isEqualTo(0); + assertThat(extraAttr1.getName()).isEqualTo("文本名称"); + assertThat(extraAttr1.getTextValue()).isEqualTo("文本"); + + final WxCpUser.Attr extraAttr2 = user.getExtAttrs().get(1); + assertThat(extraAttr2.getType()).isEqualTo(1); + assertThat(extraAttr2.getName()).isEqualTo("网页名称"); + assertThat(extraAttr2.getWebTitle()).isEqualTo("标题"); + assertThat(extraAttr2.getWebUrl()).isEqualTo("http://www.test.com"); + + assertThat(user.getExternalPosition()).isEqualTo("高级产品经理"); + assertThat(user.getExternalCorpName()).isEqualTo("企业简称"); + assertThat(user.getExternalAttrs()).isNotEmpty(); final WxCpUser.ExternalAttribute externalAttr1 = user.getExternalAttrs().get(0); @@ -100,7 +130,7 @@ public class WxCpUserGsonAdapterTest { final WxCpUser.ExternalAttribute externalAttr3 = user.getExternalAttrs().get(2); assertThat(externalAttr3.getType()).isEqualTo(2); assertThat(externalAttr3.getName()).isEqualTo("测试app"); - assertThat(externalAttr3.getAppid()).isEqualTo("wx8bd80126147df384"); + assertThat(externalAttr3.getAppid()).isEqualTo("wx8bd8012614784fake"); assertThat(externalAttr3.getPagePath()).isEqualTo("/index"); assertThat(externalAttr3.getTitle()).isEqualTo("my miniprogram");