* 实现消息推送的服务,添加发送应用消息的方法 * 添加创建群聊会话方法,去除不需要的类 * 完成群聊会话的修改和获取 * 重构群聊服务,提出到单独的服务类里面 * 完成群聊的测试master
@@ -0,0 +1,48 @@ | |||||
package me.chanjar.weixin.cp.api; | |||||
import java.util.List; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.cp.bean.WxCpChat; | |||||
/** | |||||
* 群聊服务 | |||||
* | |||||
* @author gaigeshen | |||||
*/ | |||||
public interface WxCpChatService { | |||||
/** | |||||
* 创建群聊会话,注意:刚创建的群,如果没有下发消息,在企业微信不会出现该群。 | |||||
* | |||||
* @param name 群聊名,最多50个utf8字符,超过将截断 | |||||
* @param owner 指定群主的id。如果不指定,系统会随机从userlist中选一人作为群主 | |||||
* @param users 群成员id列表。至少2人,至多500人 | |||||
* @param chatId 群聊的唯一标志,不能与已有的群重复;字符串类型,最长32个字符。只允许字符0-9及字母a-zA-Z。如果不填,系统会随机生成群id | |||||
* @return 创建群聊会话的结果,群聊的唯一标志 | |||||
* @throws WxErrorException 发生异常 | |||||
*/ | |||||
String chatCreate(String name, String owner, List<String> users, String chatId) throws WxErrorException; | |||||
/** | |||||
* 修改群聊会话 | |||||
* | |||||
* @param chatId 群聊id | |||||
* @param name 新的群聊名。若不需更新,请忽略此参数(null or empty)。最多50个utf8字符,超过将截断 | |||||
* @param owner 新群主的id。若不需更新,请忽略此参数(null or empty) | |||||
* @param usersToAdd 添加成员的id列表,若不需要更新,则传递空对象或者空集合 | |||||
* @param usersToDelete 踢出成员的id列表,若不需要更新,则传递空对象或者空集合 | |||||
* @throws WxErrorException 发生异常 | |||||
*/ | |||||
void chatUpdate(String chatId, String name, String owner, List<String> usersToAdd, List<String> usersToDelete) throws WxErrorException; | |||||
/** | |||||
* 获取群聊会话 | |||||
* | |||||
* @param chatId 群聊编号 | |||||
* @return 群聊会话 | |||||
* @throws WxErrorException 发生异常 | |||||
*/ | |||||
WxCpChat chatGet(String chatId) throws WxErrorException; | |||||
} |
@@ -7,7 +7,8 @@ import me.chanjar.weixin.common.session.WxSessionManager; | |||||
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; | import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; | ||||
import me.chanjar.weixin.common.util.http.RequestExecutor; | import me.chanjar.weixin.common.util.http.RequestExecutor; | ||||
import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
import me.chanjar.weixin.cp.bean.*; | |||||
import me.chanjar.weixin.cp.bean.WxCpMessage; | |||||
import me.chanjar.weixin.cp.bean.WxCpMessageSendResult; | |||||
import me.chanjar.weixin.cp.config.WxCpConfigStorage; | import me.chanjar.weixin.cp.config.WxCpConfigStorage; | ||||
/** | /** | ||||
@@ -241,13 +242,20 @@ public interface WxCpService { | |||||
* 获取用户相关接口的服务类对象 | * 获取用户相关接口的服务类对象 | ||||
*/ | */ | ||||
WxCpUserService getUserService(); | WxCpUserService getUserService(); | ||||
/** | |||||
* 获取群聊服务 | |||||
* | |||||
* @return 群聊服务 | |||||
*/ | |||||
WxCpChatService getChatService(); | |||||
WxCpAgentService getAgentService(); | WxCpAgentService getAgentService(); | ||||
/** | /** | ||||
* http请求对象 | * http请求对象 | ||||
*/ | */ | ||||
RequestHttp getRequestHttp(); | |||||
RequestHttp<?, ?> getRequestHttp(); | |||||
void setUserService(WxCpUserService userService); | void setUserService(WxCpUserService userService); | ||||
@@ -1,9 +1,11 @@ | |||||
package me.chanjar.weixin.cp.api.impl; | package me.chanjar.weixin.cp.api.impl; | ||||
import com.google.gson.Gson; | |||||
import java.util.List; | |||||
import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||
import com.google.gson.JsonParser; | import com.google.gson.JsonParser; | ||||
import com.google.gson.reflect.TypeToken; | import com.google.gson.reflect.TypeToken; | ||||
import me.chanjar.weixin.common.error.WxError; | import me.chanjar.weixin.common.error.WxError; | ||||
import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
import me.chanjar.weixin.cp.api.WxCpAgentService; | import me.chanjar.weixin.cp.api.WxCpAgentService; | ||||
@@ -11,8 +13,6 @@ import me.chanjar.weixin.cp.api.WxCpService; | |||||
import me.chanjar.weixin.cp.bean.WxCpAgent; | import me.chanjar.weixin.cp.bean.WxCpAgent; | ||||
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | ||||
import java.util.List; | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
@@ -0,0 +1,83 @@ | |||||
package me.chanjar.weixin.cp.api.impl; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import com.google.gson.JsonParser; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||||
import me.chanjar.weixin.cp.api.WxCpChatService; | |||||
import me.chanjar.weixin.cp.api.WxCpService; | |||||
import me.chanjar.weixin.cp.bean.WxCpChat; | |||||
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; | |||||
/** | |||||
* 群聊服务实现 | |||||
* | |||||
* @author gaigeshen | |||||
*/ | |||||
public class WxCpChatServiceImpl implements WxCpChatService { | |||||
private final WxCpService internalService; | |||||
/** | |||||
* 创建群聊服务实现的实例 | |||||
* | |||||
* @param internalService 企业微信的服务 | |||||
*/ | |||||
public WxCpChatServiceImpl(WxCpService internalService) { | |||||
this.internalService = internalService; | |||||
} | |||||
@Override | |||||
public String chatCreate(String name, String owner, List<String> users, String chatId) throws WxErrorException { | |||||
Map<String, Object> data = new HashMap<>(4); | |||||
if (StringUtils.isNotBlank(name)) { | |||||
data.put("name", name); | |||||
} | |||||
if (StringUtils.isNotBlank(owner)) { | |||||
data.put("owner", owner); | |||||
} | |||||
if (users != null) { | |||||
data.put("userlist", users); | |||||
} | |||||
if (StringUtils.isNotBlank(chatId)) { | |||||
data.put("chatid", chatId); | |||||
} | |||||
String result = internalService.post("https://qyapi.weixin.qq.com/cgi-bin/appchat/create", WxGsonBuilder.create().toJson(data)); | |||||
return new JsonParser().parse(result).getAsJsonObject().get("chatid").getAsString(); | |||||
} | |||||
@Override | |||||
public void chatUpdate(String chatId, String name, String owner, List<String> usersToAdd, List<String> usersToDelete) throws WxErrorException { | |||||
Map<String, Object> data = new HashMap<>(5); | |||||
if (StringUtils.isNotBlank(chatId)) { | |||||
data.put("chatid", chatId); | |||||
} | |||||
if (StringUtils.isNotBlank(name)) { | |||||
data.put("name", name); | |||||
} | |||||
if (StringUtils.isNotBlank(owner)) { | |||||
data.put("owner", owner); | |||||
} | |||||
if (usersToAdd != null && !usersToAdd.isEmpty()) { | |||||
data.put("add_user_list", usersToAdd); | |||||
} | |||||
if (usersToDelete != null && !usersToDelete.isEmpty()) { | |||||
data.put("del_user_list", usersToDelete); | |||||
} | |||||
internalService.post("https://qyapi.weixin.qq.com/cgi-bin/appchat/update", WxGsonBuilder.create().toJson(data)); | |||||
} | |||||
@Override | |||||
public WxCpChat chatGet(String chatId) throws WxErrorException { | |||||
String result = internalService.get("https://qyapi.weixin.qq.com/cgi-bin/appchat/get?chatid=" + chatId, null); | |||||
return WxCpGsonBuilder.create().fromJson( | |||||
new JsonParser().parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(), WxCpChat.class); | |||||
} | |||||
} |
@@ -10,6 +10,7 @@ import com.google.gson.JsonArray; | |||||
import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||
import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||
import com.google.gson.JsonParser; | import com.google.gson.JsonParser; | ||||
import me.chanjar.weixin.common.bean.WxJsapiSignature; | import me.chanjar.weixin.common.bean.WxJsapiSignature; | ||||
import me.chanjar.weixin.common.error.WxError; | import me.chanjar.weixin.common.error.WxError; | ||||
import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
@@ -24,6 +25,7 @@ import me.chanjar.weixin.common.util.http.RequestHttp; | |||||
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; | import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; | ||||
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; | import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; | ||||
import me.chanjar.weixin.cp.api.WxCpAgentService; | import me.chanjar.weixin.cp.api.WxCpAgentService; | ||||
import me.chanjar.weixin.cp.api.WxCpChatService; | |||||
import me.chanjar.weixin.cp.api.WxCpDepartmentService; | import me.chanjar.weixin.cp.api.WxCpDepartmentService; | ||||
import me.chanjar.weixin.cp.api.WxCpMediaService; | import me.chanjar.weixin.cp.api.WxCpMediaService; | ||||
import me.chanjar.weixin.cp.api.WxCpMenuService; | import me.chanjar.weixin.cp.api.WxCpMenuService; | ||||
@@ -39,6 +41,7 @@ public abstract class WxCpServiceAbstractImpl<H, P> implements WxCpService, Requ | |||||
protected final Logger log = LoggerFactory.getLogger(this.getClass()); | protected final Logger log = LoggerFactory.getLogger(this.getClass()); | ||||
private WxCpUserService userService = new WxCpUserServiceImpl(this); | private WxCpUserService userService = new WxCpUserServiceImpl(this); | ||||
private WxCpChatService chatService = new WxCpChatServiceImpl(this); | |||||
private WxCpDepartmentService departmentService = new WxCpDepartmentServiceImpl(this); | private WxCpDepartmentService departmentService = new WxCpDepartmentServiceImpl(this); | ||||
private WxCpMediaService mediaService = new WxCpMediaServiceImpl(this); | private WxCpMediaService mediaService = new WxCpMediaServiceImpl(this); | ||||
private WxCpMenuService menuService = new WxCpMenuServiceImpl(this); | private WxCpMenuService menuService = new WxCpMenuServiceImpl(this); | ||||
@@ -343,7 +346,12 @@ public abstract class WxCpServiceAbstractImpl<H, P> implements WxCpService, Requ | |||||
} | } | ||||
@Override | @Override | ||||
public RequestHttp getRequestHttp() { | |||||
public WxCpChatService getChatService() { | |||||
return chatService; | |||||
} | |||||
@Override | |||||
public RequestHttp<?, ?> getRequestHttp() { | |||||
return this; | return this; | ||||
} | } | ||||
@@ -0,0 +1,20 @@ | |||||
package me.chanjar.weixin.cp.bean; | |||||
import java.util.List; | |||||
import lombok.Data; | |||||
/** | |||||
* 群聊 | |||||
* | |||||
* @author gaigeshen | |||||
*/ | |||||
@Data | |||||
public class WxCpChat { | |||||
private String id; | |||||
private String name; | |||||
private String owner; | |||||
private List<String> users; | |||||
} |
@@ -0,0 +1,77 @@ | |||||
/* | |||||
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved. | |||||
* | |||||
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended | |||||
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction | |||||
* arose from modification of the original source, or other redistribution of this source | |||||
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD. | |||||
*/ | |||||
package me.chanjar.weixin.cp.util.json; | |||||
import java.lang.reflect.Type; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
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.JsonSerializationContext; | |||||
import com.google.gson.JsonSerializer; | |||||
import me.chanjar.weixin.common.util.json.GsonHelper; | |||||
import me.chanjar.weixin.cp.bean.WxCpChat; | |||||
/** | |||||
* 群聊适配器 | |||||
* | |||||
* @author gaigeshen | |||||
*/ | |||||
public class WxCpChatGsonAdapter implements JsonSerializer<WxCpChat>, JsonDeserializer<WxCpChat> { | |||||
@Override | |||||
public JsonElement serialize(WxCpChat chat, Type typeOfSrc, JsonSerializationContext context) { | |||||
JsonObject json = new JsonObject(); | |||||
if (chat.getId() != null) { | |||||
json.addProperty("chatid", chat.getId()); | |||||
} | |||||
if (chat.getName() != null) { | |||||
json.addProperty("name", chat.getName()); | |||||
} | |||||
if (chat.getOwner() != null) { | |||||
json.addProperty("owner", chat.getOwner()); | |||||
} | |||||
if (chat.getUsers() != null) { | |||||
JsonArray users = new JsonArray(); | |||||
for (String user : chat.getUsers()) { | |||||
users.add(user); | |||||
} | |||||
json.add("userlist", users); | |||||
} | |||||
return json; | |||||
} | |||||
@Override | |||||
public WxCpChat deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | |||||
JsonObject chatJson = json.getAsJsonObject(); | |||||
WxCpChat chat = new WxCpChat(); | |||||
chat.setId(GsonHelper.getAsString(chatJson.get("chatid"))); | |||||
chat.setName(GsonHelper.getAsString(chatJson.get("name"))); | |||||
chat.setOwner(GsonHelper.getAsString(chatJson.get("owner"))); | |||||
JsonArray usersJson = chatJson.getAsJsonArray("userlist"); | |||||
if (usersJson != null) { | |||||
List<String> users = new ArrayList<>(usersJson.size()); | |||||
chat.setUsers(users); | |||||
for (JsonElement userJson : usersJson) { | |||||
users.add(userJson.getAsString()); | |||||
} | |||||
} | |||||
return chat; | |||||
} | |||||
} |
@@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder; | |||||
import me.chanjar.weixin.common.bean.menu.WxMenu; | import me.chanjar.weixin.common.bean.menu.WxMenu; | ||||
import me.chanjar.weixin.common.error.WxError; | import me.chanjar.weixin.common.error.WxError; | ||||
import me.chanjar.weixin.common.util.json.WxErrorAdapter; | import me.chanjar.weixin.common.util.json.WxErrorAdapter; | ||||
import me.chanjar.weixin.cp.bean.WxCpChat; | |||||
import me.chanjar.weixin.cp.bean.WxCpDepart; | import me.chanjar.weixin.cp.bean.WxCpDepart; | ||||
import me.chanjar.weixin.cp.bean.WxCpMessage; | import me.chanjar.weixin.cp.bean.WxCpMessage; | ||||
import me.chanjar.weixin.cp.bean.WxCpTag; | import me.chanjar.weixin.cp.bean.WxCpTag; | ||||
@@ -20,6 +21,7 @@ public class WxCpGsonBuilder { | |||||
static { | static { | ||||
INSTANCE.disableHtmlEscaping(); | INSTANCE.disableHtmlEscaping(); | ||||
INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); | INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxCpChat.class, new WxCpChatGsonAdapter()); | |||||
INSTANCE.registerTypeAdapter(WxCpDepart.class, new WxCpDepartGsonAdapter()); | INSTANCE.registerTypeAdapter(WxCpDepart.class, new WxCpDepartGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxCpUser.class, new WxCpUserGsonAdapter()); | INSTANCE.registerTypeAdapter(WxCpUser.class, new WxCpUserGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter()); | INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter()); | ||||
@@ -0,0 +1,46 @@ | |||||
package me.chanjar.weixin.cp.api.impl; | |||||
import java.util.Arrays; | |||||
import me.chanjar.weixin.cp.bean.WxCpChat; | |||||
import org.testng.Assert; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import com.google.inject.Inject; | |||||
import me.chanjar.weixin.cp.api.ApiTestModule; | |||||
import me.chanjar.weixin.cp.api.WxCpService; | |||||
/** | |||||
* 测试群聊服务 | |||||
* | |||||
* @author gaigeshen | |||||
*/ | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxCpChatServiceImplTest { | |||||
@Inject | |||||
private WxCpService wxCpService; | |||||
@Test | |||||
public void create() throws Exception { | |||||
wxCpService.getChatService().chatCreate("测试群聊", "gaige_shen", Arrays.asList("gaige_shen", "ZhangXiaoMing"), "mychatid"); | |||||
} | |||||
@Test | |||||
public void get() throws Exception { | |||||
WxCpChat chat = wxCpService.getChatService().chatGet("mychatid"); | |||||
System.out.println(chat); | |||||
Assert.assertEquals(chat.getName(), "测试群聊"); | |||||
} | |||||
@Test | |||||
public void update() throws Exception { | |||||
wxCpService.getChatService().chatUpdate("mychatid", "", "", Arrays.asList("ZhengWuYao"), null); | |||||
WxCpChat chat = wxCpService.getChatService().chatGet("mychatid"); | |||||
System.out.println(chat); | |||||
Assert.assertEquals(chat.getUsers().size(), 3); | |||||
} | |||||
} |