diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java index 46d74bf92..f55d2f7b9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java @@ -1,5 +1,10 @@ package me.chanjar.weixin.cp.api; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.List; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.bean.WxCpBaseResp; @@ -11,12 +16,6 @@ import me.chanjar.weixin.cp.bean.external.interceptrule.WxCpInterceptRuleAddRequ import me.chanjar.weixin.cp.bean.external.interceptrule.WxCpInterceptRuleInfo; import me.chanjar.weixin.cp.bean.external.interceptrule.WxCpInterceptRuleList; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; -import java.util.List; - /** *
* 外部联系人管理接口,企业微信的外部联系人的接口和通讯录接口已经拆离 @@ -381,6 +380,24 @@ public interface WxCpExternalContactService { Integer limit) throws WxErrorException; + /** + * 获取已服务的外部联系人 + *+ * 企业可通过此接口获取所有已服务的外部联系人,及其添加人和加入的群聊。 + * 外部联系人分为客户和其他外部联系人,如果是客户,接口将返回外部联系人临时ID和externaluserid;如果是其他外部联系人,接口将只返回外部联系人临时ID。 + * 请求方式:POST(HTTPS) + * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/contact_list?access_token=ACCESS_TOKEN + * 文档地址: https://developer.work.weixin.qq.com/document/path/99434 + *+ * + * @param cursor the cursor + * @param limit the limit + * @return 已服务的外部联系人列表 + * @throws WxErrorException . + * @apiNote 企业可通过外部联系人临时ID排除重复数据,外部联系人临时ID有效期为4小时。 + */ + WxCpExternalContactListInfo getContactList(String cursor, Integer limit) throws WxErrorException; + /** * 修改客户备注信息. *diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java index 8a7328af2..c2fbdfe6e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java @@ -1,7 +1,16 @@ package me.chanjar.weixin.cp.api.impl; +import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.ExternalContact.*; + import com.google.gson.Gson; import com.google.gson.JsonObject; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.UUID; import lombok.NonNull; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; @@ -26,16 +35,6 @@ import me.chanjar.weixin.cp.bean.external.interceptrule.WxCpInterceptRuleList; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.ExternalContact.*; - /** * The type Wx cp external contact service. * @@ -215,6 +214,20 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic return WxCpExternalContactBatchInfo.fromJson(responseContent); } + @Override + public WxCpExternalContactListInfo getContactList(String cursor, Integer limit) throws WxErrorException { + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CONTACT_LIST); + JsonObject json = new JsonObject(); + if (StringUtils.isNotBlank(cursor)) { + json.addProperty("cursor", cursor); + } + if (limit != null) { + json.addProperty("limit", limit); + } + String responseContent = this.mainService.post(url, json.toString()); + return WxCpExternalContactListInfo.fromJson(responseContent); + } + @Override public void updateRemark(WxCpUpdateRemarkRequest request) throws WxErrorException { final String url = this.mainService.getWxCpConfigStorage().getApiUrl(UPDATE_REMARK); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactListInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactListInfo.java new file mode 100644 index 000000000..4c0055ad8 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactListInfo.java @@ -0,0 +1,92 @@ +package me.chanjar.weixin.cp.bean.external.contact; + +import com.google.gson.annotations.SerializedName; +import java.io.Serializable; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +/** + * 获取已服务的外部联系人( 参考文档) + * @see WxCpService#getExternalContactService() + * @serial + */ +@Getter +@Setter +public class WxCpExternalContactListInfo implements Serializable { + + private static final long serialVersionUID = 7114885886548364396L; + + @SerializedName("next_cursor") + private String nextCursor; + + @SerializedName("errcode") + private String errcode; + + @SerializedName("errmsg") + private String errmsg; + + @SerializedName("info_list") + private ListinfoList; + + @Getter + @Setter + public static class ExternalContactInfo implements Serializable{ + + private static final long serialVersionUID = -7400291089462740100L; + + /** + * 是否被成员标记为客户 + */ + @SerializedName("is_customer") + private Boolean isCustomer; + + /** + * 外部联系人临时ID + */ + @SerializedName("tmp_openid") + private String tmpOpenid; + + /** + * 外部联系人的externaluserid(如果是客户才返回) + */ + @SerializedName("external_userid") + private String externalUserid; + + /** + * 脱敏后的外部联系人昵称(如果是其他外部联系人才返回) + */ + @SerializedName("name") + private String name; + + /** + * 添加此外部联系人的企业成员或外部联系人所在群聊的群主userid + */ + @SerializedName("follow_userid") + private String followUserid; + + /** + * 外部联系人所在的群聊ID(如果群聊被成员标记为客户群才返回) + */ + @SerializedName("chat_id") + private String chatId; + + /** + * 外部联系人所在群聊的群名(如果群聊未被成员标记为客户群才返回) + */ + @SerializedName("chat_name") + private String chatName; + + /** + * 外部联系人首次添加/进群的时间 + */ + @SerializedName("add_time") + private Long addTime; + } + public static WxCpExternalContactListInfo fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpExternalContactListInfo.class); + } + +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java index d90bda6cc..b53f7549d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java @@ -1137,6 +1137,9 @@ public interface WxCpApiPathConsts { * The constant GET_CONTACT_DETAIL_BATCH. */ String GET_CONTACT_DETAIL_BATCH = "/cgi-bin/externalcontact/batch/get_by_user?"; + + String GET_CONTACT_LIST = "/cgi-bin/externalcontact/contact_list?"; + /** * The constant UPDATE_REMARK. */ diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java index 9f7dd8c53..c629165ca 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java @@ -1,7 +1,13 @@ package me.chanjar.weixin.cp.api.impl; +import static org.testng.Assert.assertNotNull; + import com.google.common.collect.Lists; import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.XmlUtils; import me.chanjar.weixin.cp.api.ApiTestModule; @@ -10,6 +16,7 @@ import me.chanjar.weixin.cp.bean.WxCpBaseResp; import me.chanjar.weixin.cp.bean.external.*; import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo; import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo; +import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactListInfo; import me.chanjar.weixin.cp.bean.external.msg.Attachment; import me.chanjar.weixin.cp.bean.external.msg.AttachmentBuilder; import me.chanjar.weixin.cp.bean.external.msg.Image; @@ -22,13 +29,6 @@ import org.testng.annotations.Guice; import org.testng.annotations.Test; import org.testng.collections.CollectionUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; - -import static org.testng.Assert.assertNotNull; - /** * The type Wx cp external contact service impl test. */ @@ -188,6 +188,19 @@ public class WxCpExternalContactServiceImplTest { assertNotNull(result); } + /** + * Test get contact list. + * + * @throws WxErrorException the wx error exception + */ + @Test + public void testGetContactList() throws WxErrorException { + WxCpExternalContactListInfo result = + this.wxCpService.getExternalContactService().getContactList("", 100); + System.out.println(result); + assertNotNull(result); + } + /** * Test get corp tag list. *