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 3f5ee3677..3ceee6490 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 @@ -132,6 +132,31 @@ public interface WxCpExternalContactService { */ WxCpUserExternalContactInfo getContactDetail(String userId) throws WxErrorException; + /** + * 批量获取客户详情. + *
+ * + * 企业/第三方可通过此接口获取指定成员添加的客户信息列表。 + * + * 请求方式:POST(HTTPS) + * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/batch/get_by_user?access_token=ACCESS_TOKEN + * + * 权限说明: + * + * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?); + * 第三方/自建应用调用时,返回的跟进人follow_user仅包含应用可见范围之内的成员。 + *+ * + * @param userId 企业成员的userid,注意不是外部联系人的帐号 + * @param cursor the cursor + * @param limit the limit + * @return wx cp user external contact batch info + * @throws WxErrorException . + */ + WxCpUserExternalContactBatchInfo getContactDetailBatch(String userId, 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 6c6a413a7..2d62f8aef 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 @@ -104,6 +104,27 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic return WxCpUserExternalContactInfo.fromJson(responseContent); } + @Override + public WxCpUserExternalContactBatchInfo getContactDetailBatch(String userId, + String cursor, + Integer limit) + throws WxErrorException { + final String url = + this.mainService + .getWxCpConfigStorage() + .getApiUrl(GET_CONTACT_DETAIL_BATCH); + JsonObject json = new JsonObject(); + json.addProperty("userid", userId); + if (StringUtils.isNotBlank(cursor)) { + json.addProperty("cursor", cursor); + } + if (limit != null) { + json.addProperty("limit", limit); + } + String responseContent = this.mainService.post(url, json.toString()); + return WxCpUserExternalContactBatchInfo.fromJson(responseContent); + } + @Override public void updateRemark(WxCpUpdateRemarkRequest request) throws WxErrorException { final String url = this.mainService.getWxCpConfigStorage().getApiUrl(UPDATE_REMARK); @@ -162,10 +183,10 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic if (ArrayUtils.isNotEmpty(userIds) || ArrayUtils.isNotEmpty(partyIds)) { JsonObject ownerFilter = new JsonObject(); if (ArrayUtils.isNotEmpty(userIds)) { - json.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray()); + ownerFilter.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray()); } if (ArrayUtils.isNotEmpty(partyIds)) { - json.add("partyid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); + ownerFilter.add("partyid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); } json.add("owner_filter", ownerFilter); } @@ -212,10 +233,10 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic if (ArrayUtils.isNotEmpty(userIds) || ArrayUtils.isNotEmpty(partyIds)) { JsonObject ownerFilter = new JsonObject(); if (ArrayUtils.isNotEmpty(userIds)) { - json.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray()); + ownerFilter.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray()); } if (ArrayUtils.isNotEmpty(partyIds)) { - json.add("partyid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); + ownerFilter.add("partyid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); } json.add("owner_filter", ownerFilter); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactBatchInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactBatchInfo.java new file mode 100644 index 000000000..5275dc9dd --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactBatchInfo.java @@ -0,0 +1,163 @@ +package me.chanjar.weixin.cp.bean.external; + +import com.google.gson.annotations.SerializedName; +import java.io.Serializable; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +/** + *+ * 批量获取客户详情 + * Created by Binary Wang on 2020/10/22. + * 参考文档:https://work.weixin.qq.com/api/doc/90000/90135/92994 + *+ * + * @author alucardxh + */ +@Getter +@Setter +public class WxCpUserExternalContactBatchInfo extends WxCpBaseResp implements Serializable { + private static final long serialVersionUID = -5166048319463473186L; + + @SerializedName("external_contact_list") + private ListexternalContactList; + + @SerializedName("next_cursor") + private String nextCursor; + + @Getter + @Setter + public static class ExternalContactInfo { + @SerializedName("external_contact") + private ExternalContact externalContact; + + @SerializedName("follow_info") + private FollowedUser followInfo; + } + + @Getter + @Setter + public static class ExternalContact { + @SerializedName("external_userid") + private String externalUserId; + + @SerializedName("position") + private String position; + + @SerializedName("name") + private String name; + + @SerializedName("avatar") + private String avatar; + + @SerializedName("corp_name") + private String corpName; + + @SerializedName("corp_full_name") + private String corpFullName; + + @SerializedName("type") + private Integer type; + + @SerializedName("gender") + private Integer gender; + + @SerializedName("unionid") + private String unionId; + + @SerializedName("external_profile") + private ExternalProfile externalProfile; + } + + @Setter + @Getter + public static class ExternalProfile { + @SerializedName("external_attr") + private List externalAttrs; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class ExternalAttribute { + @Setter + @Getter + public static class Text { + private String value; + } + + @Setter + @Getter + public static class Web { + private String title; + private String url; + } + + @Setter + @Getter + public static class MiniProgram { + @SerializedName("pagepath") + private String pagePath; + private String appid; + private String title; + } + + private int type; + + private String name; + + private Text text; + + private Web web; + + @SerializedName("miniprogram") + private MiniProgram miniProgram; + } + + @Setter + @Getter + public static class FollowedUser { + @SerializedName("userid") + private String userId; + private String remark; + private String description; + @SerializedName("createtime") + private Long createTime; + private String state; + @SerializedName("remark_company") + private String remarkCompany; + @SerializedName("remark_mobiles") + private String[] remarkMobiles; + private Tag[] tags; + @SerializedName("remark_corp_name") + private String remarkCorpName; + @SerializedName("add_way") + private String addWay; + @SerializedName("oper_userid") + private String operUserId; + + } + + public static WxCpUserExternalContactBatchInfo fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalContactBatchInfo.class); + } + + @Setter + @Getter + public static class Tag { + @SerializedName("group_name") + private String groupName; + @SerializedName("tag_name") + private String tagName; + private int type; + } + +} 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 18b39ed2e..97e30f034 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 @@ -171,6 +171,7 @@ public final class WxCpApiPathConsts { public static final String CLOSE_TEMP_CHAT = "/cgi-bin/externalcontact/close_temp_chat"; public static final String GET_FOLLOW_USER_LIST = "/cgi-bin/externalcontact/get_follow_user_list"; public static final String GET_CONTACT_DETAIL = "/cgi-bin/externalcontact/get?external_userid="; + public static final String GET_CONTACT_DETAIL_BATCH = "/cgi-bin/externalcontact/batch/get_by_user?"; public static final String UPDATE_REMARK = "/cgi-bin/externalcontact/remark"; public static final String LIST_EXTERNAL_CONTACT = "/cgi-bin/externalcontact/list?userid="; public static final String LIST_UNASSIGNED_CONTACT = "/cgi-bin/externalcontact/get_unassigned_list";