🆕 #1710 企业微信增加发送新客户欢迎语接口

This commit is contained in:
Binary Wang 2020-08-16 14:33:31 +08:00
parent 928ba178a3
commit 8b7ca9b7b4
29 changed files with 363 additions and 144 deletions

View File

@ -10,7 +10,6 @@ import java.util.concurrent.locks.Lock;
@RequiredArgsConstructor @RequiredArgsConstructor
public class JedisWxRedisOps implements WxRedisOps { public class JedisWxRedisOps implements WxRedisOps {
private final Pool<Jedis> jedisPool; private final Pool<Jedis> jedisPool;
@Override @Override

View File

@ -2,7 +2,8 @@ package me.chanjar.weixin.cp.api;
import lombok.NonNull; import lombok.NonNull;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.bean.*; import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.bean.external.*;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -32,8 +33,8 @@ public interface WxCpExternalContactService {
* </pre> * </pre>
* *
* @param info 客户联系联系我方式 * @param info 客户联系联系我方式
* @return * @return wx cp contact way result
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpContactWayResult addContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException; WxCpContactWayResult addContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException;
@ -45,8 +46,8 @@ public interface WxCpExternalContactService {
* </pre> * </pre>
* *
* @param configId 联系方式的配置id,必填 * @param configId 联系方式的配置id,必填
* @return * @return contact way
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpContactWayInfo getContactWay(@NonNull String configId) throws WxErrorException; WxCpContactWayInfo getContactWay(@NonNull String configId) throws WxErrorException;
@ -58,8 +59,8 @@ public interface WxCpExternalContactService {
* </pre> * </pre>
* *
* @param info 客户联系联系我方式 * @param info 客户联系联系我方式
* @return * @return wx cp base resp
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp updateContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException; WxCpBaseResp updateContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException;
@ -71,8 +72,8 @@ public interface WxCpExternalContactService {
* </pre> * </pre>
* *
* @param configId 企业联系方式的配置id,必填 * @param configId 企业联系方式的配置id,必填
* @return * @return wx cp base resp
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp deleteContactWay(@NonNull String configId) throws WxErrorException; WxCpBaseResp deleteContactWay(@NonNull String configId) throws WxErrorException;
@ -85,10 +86,10 @@ public interface WxCpExternalContactService {
* 注意请保证传入的企业成员和客户之间有仍然有效的临时会话, 通过<b>其他方式的添加外部联系人无法通过此接口关闭会话</b> * 注意请保证传入的企业成员和客户之间有仍然有效的临时会话, 通过<b>其他方式的添加外部联系人无法通过此接口关闭会话</b>
* </pre> * </pre>
* *
* @param userId * @param userId the user id
* @param externalUserId * @param externalUserId the external user id
* @return * @return wx cp base resp
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp closeTempChat(@NonNull String userId, @NonNull String externalUserId) throws WxErrorException; WxCpBaseResp closeTempChat(@NonNull String userId, @NonNull String externalUserId) throws WxErrorException;
@ -103,7 +104,8 @@ public interface WxCpExternalContactService {
* </pre> * </pre>
* *
* @param userId 外部联系人的userid * @param userId 外部联系人的userid
* @return . * @return . external contact
* @throws WxErrorException the wx error exception
* @deprecated 建议使用 {@link #getContactDetail(String)} * @deprecated 建议使用 {@link #getContactDetail(String)}
*/ */
@Deprecated @Deprecated
@ -125,7 +127,7 @@ public interface WxCpExternalContactService {
* </pre> * </pre>
* *
* @param userId 外部联系人的userid注意不是企业成员的帐号 * @param userId 外部联系人的userid注意不是企业成员的帐号
* @return . * @return . contact detail
* @throws WxErrorException . * @throws WxErrorException .
*/ */
WxCpUserExternalContactInfo getContactDetail(String userId) throws WxErrorException; WxCpUserExternalContactInfo getContactDetail(String userId) throws WxErrorException;
@ -167,21 +169,21 @@ public interface WxCpExternalContactService {
/** /**
* 企业和第三方可通过此接口获取所有离职成员的客户列表并可进一步调用离职成员的外部联系人再分配接口将这些客户重新分配给其他企业成员 * 企业和第三方可通过此接口获取所有离职成员的客户列表并可进一步调用离职成员的外部联系人再分配接口将这些客户重新分配给其他企业成员
* *
* @param page * @param page the page
* @param pageSize * @param pageSize the page size
* @return * @return wx cp user external unassign list
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalUnassignList listUnassignedList(Integer page, Integer pageSize) throws WxErrorException; WxCpUserExternalUnassignList listUnassignedList(Integer page, Integer pageSize) throws WxErrorException;
/** /**
* 企业可通过此接口将已离职成员的外部联系人分配给另一个成员接替联系 * 企业可通过此接口将已离职成员的外部联系人分配给另一个成员接替联系
* *
* @param externalUserid * @param externalUserid the external userid
* @param handOverUserid * @param handOverUserid the hand over userid
* @param takeOverUserid * @param takeOverUserid the take over userid
* @return * @return wx cp base resp
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException; WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException;
@ -192,6 +194,14 @@ public interface WxCpExternalContactService {
* 暂不支持第三方调用 * 暂不支持第三方调用
* 微信文档https://work.weixin.qq.com/api/doc/90000/90135/92119 * 微信文档https://work.weixin.qq.com/api/doc/90000/90135/92119
* </pre> * </pre>
*
* @param pageIndex the page index
* @param pageSize the page size
* @param status the status
* @param userIds the user ids
* @param partyIds the party ids
* @return the wx cp user external group chat list
* @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException; WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException;
@ -203,9 +213,9 @@ public interface WxCpExternalContactService {
* 微信文档https://work.weixin.qq.com/api/doc/90000/90135/92122 * 微信文档https://work.weixin.qq.com/api/doc/90000/90135/92122
* </pre> * </pre>
* *
* @param chatId * @param chatId the chat id
* @return * @return group chat
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException; WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException;
@ -217,12 +227,12 @@ public interface WxCpExternalContactService {
* 第三方/自建应用调用时传入的userid和partyid要在应用的可见范围内; * 第三方/自建应用调用时传入的userid和partyid要在应用的可见范围内;
* </pre> * </pre>
* *
* @param startTime * @param startTime the start time
* @param endTime * @param endTime the end time
* @param userIds * @param userIds the user ids
* @param partyIds * @param partyIds the party ids
* @return * @return user behavior statistic
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalUserBehaviorStatistic getUserBehaviorStatistic(Date startTime, Date endTime, String[] userIds, String[] partyIds) throws WxErrorException; WxCpUserExternalUserBehaviorStatistic getUserBehaviorStatistic(Date startTime, Date endTime, String[] userIds, String[] partyIds) throws WxErrorException;
@ -233,74 +243,117 @@ public interface WxCpExternalContactService {
* 暂不支持第三方调用 * 暂不支持第三方调用
* </pre> * </pre>
* *
* @param startTime * @param startTime the start time
* @param orderBy * @param orderBy the order by
* @param orderAsc * @param orderAsc the order asc
* @param pageIndex * @param pageIndex the page index
* @param pageSize * @param pageSize the page size
* @param userIds * @param userIds the user ids
* @param partyIds * @param partyIds the party ids
* @return * @return group chat statistic
* @throws WxErrorException * @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, Integer orderBy, Integer orderAsc, Integer pageIndex, Integer pageSize, String[] userIds, String[] partyIds) throws WxErrorException; WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, Integer orderBy, Integer orderAsc, Integer pageIndex, Integer pageSize, String[] userIds, String[] partyIds) throws WxErrorException;
/**
* 添加企业群发消息任务
* 企业可通过此接口添加企业群发消息的任务并通知客服人员发送给相关客户或客户群企业微信终端需升级到2.7.5版本及以上
* 注意调用该接口并不会直接发送消息给客户/客户群需要相关的客服人员操作以后才会实际发送客服人员的企业微信需要升级到2.7.5及以上版本
* 同一个企业每个自然月内仅可针对一个客户/客户群发送4条消息超过限制的用户将会被忽略
* <p>
* 请求方式: POST(HTTP)
* <p>
* 请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_msg_template?access_token=ACCESS_TOKEN
* <p>
* 文档地址https://work.weixin.qq.com/api/doc/90000/90135/92135
*
* @param wxCpMsgTemplate the wx cp msg template
* @return the wx cp msg template add result
* @throws WxErrorException the wx error exception
*/
WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) throws WxErrorException; WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) throws WxErrorException;
/**
* 发送新客户欢迎语
* <pre>
* 企业微信在向企业推送添加外部联系人事件时会额外返回一个welcome_code企业以此为凭据调用接口即可通过成员向新添加的客户发送个性化的欢迎语
* 为了保证用户体验以及避免滥用企业仅可在收到相关事件后20秒内调用且只可调用一次
* 如果企业已经在管理端为相关成员配置了可用的欢迎语则推送添加外部联系人事件时不会返回welcome_code
* 每次添加新客户时可能有多个企业自建应用/第三方应用收到带有welcome_code的回调事件但仅有最先调用的可以发送成功后续调用将返回41051externaluser has started chatting错误请用户根据实际使用需求合理设置应用可见范围避免冲突
* 请求方式: POST(HTTP)
*
* 请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_welcome_msg?access_token=ACCESS_TOKEN
*
* 文档地址https://work.weixin.qq.com/api/doc/90000/90135/92137
* </pre>
*
* @param msg .
* @throws WxErrorException .
*/
void sendWelcomeMsg(WxCpWelcomeMsg msg) throws WxErrorException;
/** /**
* <pre> * <pre>
* 企业可通过此接口获取企业客户标签详情 * 企业可通过此接口获取企业客户标签详情
* </pre> * </pre>
* @param tagId *
* @return * @param tagId the tag id
* @return corp tag list
* @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalTagGroupList getCorpTagList(String [] tagId) throws WxErrorException; WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException;
/** /**
* <pre> * <pre>
* 企业可通过此接口向客户标签库中添加新的标签组和标签每个企业最多可配置3000个企业标签 * 企业可通过此接口向客户标签库中添加新的标签组和标签每个企业最多可配置3000个企业标签
* 暂不支持第三方调用 * 暂不支持第三方调用
* </pre> * </pre>
* @param tagGroup *
* @return * @param tagGroup the tag group
* @return wx cp user external tag group info
* @throws WxErrorException the wx error exception
*/ */
WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup)throws WxErrorException; WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup) throws WxErrorException;
/** /**
* <pre> * <pre>
* 企业可通过此接口编辑客户标签/标签组的名称或次序值 * 企业可通过此接口编辑客户标签/标签组的名称或次序值
* 暂不支持第三方调用 * 暂不支持第三方调用
* </pre> * </pre>
* @param id *
* @param name * @param id the id
* @param order * @param name the name
* @return * @param order the order
* @return wx cp base resp
* @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp editCorpTag(String id,String name,Integer order)throws WxErrorException; WxCpBaseResp editCorpTag(String id, String name, Integer order) throws WxErrorException;
/** /**
* <pre> * <pre>
* 企业可通过此接口删除客户标签库中的标签或删除整个标签组 * 企业可通过此接口删除客户标签库中的标签或删除整个标签组
* 暂不支持第三方调用 * 暂不支持第三方调用
* </pre> * </pre>
* @param tagId *
* @param groupId * @param tagId the tag id
* @return * @param groupId the group id
* @return wx cp base resp
* @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp delCorpTag(String [] tagId,String[] groupId)throws WxErrorException; WxCpBaseResp delCorpTag(String[] tagId, String[] groupId) throws WxErrorException;
/** /**
* <pre> * <pre>
* 企业可通过此接口为指定成员的客户添加上由企业统一配置的标签 * 企业可通过此接口为指定成员的客户添加上由企业统一配置的标签
* https://work.weixin.qq.com/api/doc/90000/90135/92117 * https://work.weixin.qq.com/api/doc/90000/90135/92117
* </pre> * </pre>
* @param userid *
* @param externalUserid * @param userid the userid
* @param addTag * @param externalUserid the external userid
* @param removeTag * @param addTag the add tag
* @return * @param removeTag the remove tag
* @return wx cp base resp
* @throws WxErrorException the wx error exception
*/ */
WxCpBaseResp markTag(String userid,String externalUserid,String[] addTag,String [] removeTag)throws WxErrorException; WxCpBaseResp markTag(String userid, String externalUserid, String[] addTag, String[] removeTag) throws WxErrorException;
} }

View File

@ -3,7 +3,7 @@ package me.chanjar.weixin.cp.api;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.bean.WxCpInviteResult; import me.chanjar.weixin.cp.bean.WxCpInviteResult;
import me.chanjar.weixin.cp.bean.WxCpUser; import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactInfo;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@ -9,6 +9,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.WxCpExternalContactService; import me.chanjar.weixin.cp.api.WxCpExternalContactService;
import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.*; import me.chanjar.weixin.cp.bean.*;
import me.chanjar.weixin.cp.bean.external.*;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -223,6 +224,12 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic
return WxCpMsgTemplateAddResult.fromJson(result); return WxCpMsgTemplateAddResult.fromJson(result);
} }
@Override
public void sendWelcomeMsg(WxCpWelcomeMsg msg) throws WxErrorException {
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(SEND_WELCOME_MSG);
this.mainService.post(url, msg.toJson());
}
@Override @Override
public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException { public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException {
JsonObject json = new JsonObject(); JsonObject json = new JsonObject();

View File

@ -10,7 +10,7 @@ import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.WxCpUserService; import me.chanjar.weixin.cp.api.WxCpUserService;
import me.chanjar.weixin.cp.bean.WxCpInviteResult; import me.chanjar.weixin.cp.bean.WxCpInviteResult;
import me.chanjar.weixin.cp.bean.WxCpUser; import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactInfo;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;

View File

@ -1,7 +1,8 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Data; import lombok.Data;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
/** /**

View File

@ -1,10 +1,14 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import me.chanjar.weixin.cp.bean.external.msg.Image;
import me.chanjar.weixin.cp.bean.external.msg.Link;
import me.chanjar.weixin.cp.bean.external.msg.MiniProgram;
import me.chanjar.weixin.cp.bean.external.msg.Text;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable; import java.io.Serializable;
@ -14,6 +18,8 @@ import java.util.List;
* 企业群发消息任务 * 企业群发消息任务
* <p> * <p>
* Created by songfan on 2020/7/14. * Created by songfan on 2020/7/14.
*
* @author songfan
*/ */
@Data @Data
@Builder @Builder
@ -36,7 +42,7 @@ public class WxCpMsgTemplate implements Serializable {
private Link link; private Link link;
private Miniprogram miniprogram; private MiniProgram miniprogram;
public static WxCpMsgTemplate fromJson(String json) { public static WxCpMsgTemplate fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxCpMsgTemplate.class); return WxCpGsonBuilder.create().fromJson(json, WxCpMsgTemplate.class);
@ -46,36 +52,4 @@ public class WxCpMsgTemplate implements Serializable {
return WxCpGsonBuilder.create().toJson(this); return WxCpGsonBuilder.create().toJson(this);
} }
@Data
public class Text {
private String content;
}
@Data
public class Image {
@SerializedName("media_id")
private String mediaId;
@SerializedName("pic_url")
private String picUrl;
}
@Data
public class Link {
private String title;
@SerializedName("picurl")
private String picUrl;
private String desc;
private String url;
}
@Data
public class Miniprogram {
private String title;
@SerializedName("pic_media_id")
private String picMediaId;
private String appid;
private String page;
}
} }

View File

@ -1,4 +1,4 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Data; import lombok.Data;
@ -9,6 +9,8 @@ import java.util.List;
/** /**
* Created by songfan on 2020/7/14. * Created by songfan on 2020/7/14.
*
* @author songfan
*/ */
@Data @Data
public class WxCpMsgTemplateAddResult implements Serializable { public class WxCpMsgTemplateAddResult implements Serializable {

View File

@ -1,4 +1,4 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.*; import lombok.*;

View File

@ -1,4 +1,4 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;

View File

@ -1,8 +1,9 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;
@ -13,7 +14,7 @@ import java.util.List;
*/ */
@Getter @Getter
@Setter @Setter
public class WxCpUserExternalGroupChatInfo extends WxCpBaseResp{ public class WxCpUserExternalGroupChatInfo extends WxCpBaseResp {
@SerializedName("group_chat") @SerializedName("group_chat")
private GroupChat groupChat; private GroupChat groupChat;

View File

@ -1,8 +1,9 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;

View File

@ -1,10 +1,12 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
@ -15,73 +17,76 @@ import java.util.List;
*/ */
@Getter @Getter
@Setter @Setter
public class WxCpUserExternalGroupChatStatistic extends WxCpBaseResp{ public class WxCpUserExternalGroupChatStatistic extends WxCpBaseResp implements Serializable {
private static final long serialVersionUID = -3548998672207956622L;
@SerializedName("total") @SerializedName("total")
int total; private int total;
@SerializedName("next_offset") @SerializedName("next_offset")
int nextOffset; private int nextOffset;
@SerializedName("items") @SerializedName("items")
List<StatisticItem> itemList; private List<StatisticItem> itemList;
@Getter @Getter
@Setter @Setter
public static class StatisticItem { public static class StatisticItem implements Serializable {
private static final long serialVersionUID = -7272935708787587856L;
@SerializedName("owner") @SerializedName("owner")
String owner; private String owner;
@SerializedName("data") @SerializedName("data")
ItemData itemData; private ItemData itemData;
} }
@Getter @Getter
@Setter @Setter
public static class ItemData { public static class ItemData implements Serializable {
private static final long serialVersionUID = 354382008606856587L;
/** /**
* 新增客户群数量 * 新增客户群数量
*/ */
@SerializedName("new_chat_cnt") @SerializedName("new_chat_cnt")
int newChatCnt; private int newChatCnt;
/** /**
* 截至当天客户群总数量 * 截至当天客户群总数量
*/ */
@SerializedName("chat_total") @SerializedName("chat_total")
int chatTotal; private int chatTotal;
/** /**
* 截至当天有发过消息的客户群数量 * 截至当天有发过消息的客户群数量
*/ */
@SerializedName("chat_has_msg") @SerializedName("chat_has_msg")
int chatHasMsg; private int chatHasMsg;
/** /**
* 客户群新增群人数 * 客户群新增群人数
*/ */
@SerializedName("new_member_cnt") @SerializedName("new_member_cnt")
int newMemberCnt; private int newMemberCnt;
/** /**
* 截至当天客户群总人数 * 截至当天客户群总人数
*/ */
@SerializedName("member_total") @SerializedName("member_total")
int memberTotal; private int memberTotal;
/** /**
* 截至当天有发过消息的群成员数 * 截至当天有发过消息的群成员数
*/ */
@SerializedName("member_has_msg") @SerializedName("member_has_msg")
int memberHasMsg; private int memberHasMsg;
/** /**
* 截至当天客户群消息总数 * 截至当天客户群消息总数
*/ */
@SerializedName("msg_total") @SerializedName("msg_total")
int msgTotal; private int msgTotal;
} }
public static WxCpUserExternalGroupChatStatistic fromJson(String json) { public static WxCpUserExternalGroupChatStatistic fromJson(String json) {

View File

@ -1,9 +1,10 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;

View File

@ -1,9 +1,10 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;

View File

@ -1,8 +1,9 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;
@ -14,7 +15,7 @@ import java.util.List;
*/ */
@Getter @Getter
@Setter @Setter
public class WxCpUserExternalUnassignList extends WxCpBaseResp{ public class WxCpUserExternalUnassignList extends WxCpBaseResp {
@SerializedName("info") @SerializedName("info")
private List<UnassignInfo> unassignInfos; private List<UnassignInfo> unassignInfos;

View File

@ -1,8 +1,9 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package me.chanjar.weixin.cp.bean; package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;

View File

@ -0,0 +1,40 @@
package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName;
import lombok.*;
import me.chanjar.weixin.cp.bean.external.msg.Image;
import me.chanjar.weixin.cp.bean.external.msg.Link;
import me.chanjar.weixin.cp.bean.external.msg.MiniProgram;
import me.chanjar.weixin.cp.bean.external.msg.Text;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
/**
* 新客户欢迎语.
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-08-16
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WxCpWelcomeMsg implements Serializable {
private static final long serialVersionUID = 4170843890468921757L;
@SerializedName("welcome_code")
private String welcomeCode;
private Text text;
private Image image;
private Link link;
private MiniProgram miniprogram;
public String toJson() {
return WxCpGsonBuilder.create().toJson(this);
}
}

View File

@ -0,0 +1,23 @@
package me.chanjar.weixin.cp.bean.external.msg;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.io.Serializable;
/**
* 图片消息.
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-08-16
*/
@Data
public class Image implements Serializable {
private static final long serialVersionUID = -606286372867787121L;
@SerializedName("media_id")
private String mediaId;
@SerializedName("pic_url")
private String picUrl;
}

View File

@ -0,0 +1,22 @@
package me.chanjar.weixin.cp.bean.external.msg;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.io.Serializable;
/**
* 图文消息.
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-08-16
*/
@Data
public class Link implements Serializable {
private static final long serialVersionUID = -8041816740881163875L;
private String title;
@SerializedName("picurl")
private String picUrl;
private String desc;
private String url;
}

View File

@ -0,0 +1,23 @@
package me.chanjar.weixin.cp.bean.external.msg;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.io.Serializable;
/**
* 小程序消息.
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-08-16
*/
@Data
public class MiniProgram implements Serializable {
private static final long serialVersionUID = 4242074162638170679L;
private String title;
@SerializedName("pic_media_id")
private String picMediaId;
private String appid;
private String page;
}

View File

@ -0,0 +1,17 @@
package me.chanjar.weixin.cp.bean.external.msg;
import lombok.Data;
import java.io.Serializable;
/**
* 消息文本消息.
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-08-16
*/
@Data
public class Text implements Serializable {
private static final long serialVersionUID = 6608288753719551600L;
private String content;
}

View File

@ -17,9 +17,11 @@ import java.util.concurrent.locks.ReentrantLock;
* 使用说明本实现仅供参考并不完整. * 使用说明本实现仅供参考并不完整.
* 比如为减少项目依赖未加入redis分布式锁的实现如有需要请自行实现 * 比如为减少项目依赖未加入redis分布式锁的实现如有需要请自行实现
* </pre> * </pre>
* @deprecated 不建议使用如有需要请自行改造实现加入到自己的项目中并引用
* *
* @author gaigeshen * @author gaigeshen
*/ */
@Deprecated
public class WxCpRedisConfigImpl implements WxCpConfigStorage { public class WxCpRedisConfigImpl implements WxCpConfigStorage {
private static final String ACCESS_TOKEN_KEY = "WX_CP_ACCESS_TOKEN"; private static final String ACCESS_TOKEN_KEY = "WX_CP_ACCESS_TOKEN";
private static final String ACCESS_TOKEN_EXPIRES_TIME_KEY = "WX_CP_ACCESS_TOKEN_EXPIRES_TIME"; private static final String ACCESS_TOKEN_EXPIRES_TIME_KEY = "WX_CP_ACCESS_TOKEN_EXPIRES_TIME";

View File

@ -132,6 +132,7 @@ public final class WxCpApiPathConsts {
public static final String LIST_USER_BEHAVIOR_DATA = "/cgi-bin/externalcontact/get_user_behavior_data"; public static final String LIST_USER_BEHAVIOR_DATA = "/cgi-bin/externalcontact/get_user_behavior_data";
public static final String LIST_GROUP_CHAT_DATA = "/cgi-bin/externalcontact/groupchat/statistic"; public static final String LIST_GROUP_CHAT_DATA = "/cgi-bin/externalcontact/groupchat/statistic";
public static final String ADD_MSG_TEMPLATE = "/cgi-bin/externalcontact/add_msg_template"; public static final String ADD_MSG_TEMPLATE = "/cgi-bin/externalcontact/add_msg_template";
public static final String SEND_WELCOME_MSG = "/cgi-bin/externalcontact/send_welcome_msg";
public static final String GET_CORP_TAG_LIST = "/cgi-bin/externalcontact/get_corp_tag_list"; public static final String GET_CORP_TAG_LIST = "/cgi-bin/externalcontact/get_corp_tag_list";
public static final String ADD_CORP_TAG = "/cgi-bin/externalcontact/add_corp_tag"; public static final String ADD_CORP_TAG = "/cgi-bin/externalcontact/add_corp_tag";

View File

@ -1,7 +1,7 @@
package me.chanjar.weixin.cp.util.json; package me.chanjar.weixin.cp.util.json;
import com.google.gson.*; import com.google.gson.*;
import me.chanjar.weixin.cp.bean.WxCpContactWayInfo; import me.chanjar.weixin.cp.bean.external.WxCpContactWayInfo;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Type; import java.lang.reflect.Type;

View File

@ -5,7 +5,8 @@ import com.google.inject.Inject;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.ApiTestModule; import me.chanjar.weixin.cp.api.ApiTestModule;
import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.*; import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.bean.external.*;
import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateFormatUtils;
import org.testng.annotations.Guice; import org.testng.annotations.Guice;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -22,7 +23,7 @@ public class WxCpExternalContactServiceImplTest {
private WxCpService wxCpService; private WxCpService wxCpService;
@Inject @Inject
protected ApiTestModule.WxXmlCpInMemoryConfigStorage configStorage; protected ApiTestModule.WxXmlCpInMemoryConfigStorage configStorage;
private String userId = "someone" + System.currentTimeMillis(); private final String userId = "someone" + System.currentTimeMillis();
@Test @Test
public void testGetExternalContact() throws WxErrorException { public void testGetExternalContact() throws WxErrorException {
@ -111,7 +112,7 @@ public class WxCpExternalContactServiceImplTest {
@Test @Test
public void testGetCorpTagList() throws WxErrorException { public void testGetCorpTagList() throws WxErrorException {
String tag[]={}; String[] tag = {};
WxCpUserExternalTagGroupList result = this.wxCpService.getExternalContactService().getCorpTagList(null); WxCpUserExternalTagGroupList result = this.wxCpService.getExternalContactService().getCorpTagList(null);
System.out.println(result); System.out.println(result);
assertNotNull(result); assertNotNull(result);
@ -121,7 +122,7 @@ public class WxCpExternalContactServiceImplTest {
public void testAddCorpTag() throws WxErrorException { public void testAddCorpTag() throws WxErrorException {
List<WxCpUserExternalTagGroupInfo.Tag> list = new ArrayList<>(); List<WxCpUserExternalTagGroupInfo.Tag> list = new ArrayList<>();
WxCpUserExternalTagGroupInfo.Tag tag = new WxCpUserExternalTagGroupInfo.Tag(); WxCpUserExternalTagGroupInfo.Tag tag = new WxCpUserExternalTagGroupInfo.Tag();
tag.setName("测试标签20"); tag.setName("测试标签20");
tag.setOrder(1); tag.setOrder(1);
list.add(tag); list.add(tag);
@ -151,10 +152,10 @@ public class WxCpExternalContactServiceImplTest {
@Test @Test
public void testDelCorpTag() throws WxErrorException { public void testDelCorpTag() throws WxErrorException {
String tagId[] = {}; String[] tagId = {};
String groupId[] = {"et2omCCwAAM3WzL00QpK9xARab3HGkAg"}; String[] groupId = {"et2omCCwAAM3WzL00QpK9xARab3HGkAg"};
WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId,groupId); WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId, groupId);
System.out.println(result); System.out.println(result);
assertNotNull(result); assertNotNull(result);
@ -163,15 +164,57 @@ public class WxCpExternalContactServiceImplTest {
@Test @Test
public void testMarkTag() throws WxErrorException { public void testMarkTag() throws WxErrorException {
String userid="HuangXiaoMing"; String userid = "HuangXiaoMing";
String externalUserid="wo2omCCwAAzR0Rt1omz-90o_XJkPGXIQ"; String externalUserid = "wo2omCCwAAzR0Rt1omz-90o_XJkPGXIQ";
String addTag[] = {"et2omCCwAAzdcSK-RV80YS9sbpCXlNlQ"}; String[] addTag = {"et2omCCwAAzdcSK-RV80YS9sbpCXlNlQ"};
String removeTag[] = {}; String[] removeTag = {};
WxCpBaseResp result = this.wxCpService.getExternalContactService().markTag(userid,externalUserid,addTag,removeTag); WxCpBaseResp result = this.wxCpService.getExternalContactService().markTag(userid, externalUserid, addTag, removeTag);
System.out.println(result); System.out.println(result);
assertNotNull(result); assertNotNull(result);
} }
@Test
public void testDeleteContactWay() {
}
@Test
public void testListFollowers() {
}
@Test
public void testListUnassignedList() {
}
@Test
public void testTransferExternalContact() {
}
@Test
public void testListGroupChat() {
}
@Test
public void testGetGroupChat() {
}
@Test
public void testGetUserBehaviorStatistic() {
}
@Test
public void testGetGroupChatStatistic() {
}
@Test
public void testAddMsgTemplate() {
}
@Test
public void testSendWelcomeMsg() throws WxErrorException {
this.wxCpService.getExternalContactService().sendWelcomeMsg(WxCpWelcomeMsg.builder()
.welcomeCode("abc")
.build());
}
} }

View File

@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.bean;
import java.util.List; import java.util.List;
import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactInfo;
import org.testng.annotations.*; import org.testng.annotations.*;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;