集成环信(服务端)
由于项目需要使用即时通信,采用的环信IM,后台集成环信踩了很多坑。
避免大家踩坑,特分享出来。希望对你有帮助。
注意,我在服务实现类里,并没有处理环信返回响应码401(token)过期的情况。用的时候,记得处理下,避免token过期造成的问题。
Controller
/*** @author xc* @description 环信用户体系管理* @create 2023-03-27 20:42*/
@CrossOrigin
@RestController
@RequestMapping("/message/hx/")
@Api(tags = "消息-环信相关管理")
@Slf4j
public class HxController extends BaseController {@Resourceprivate HxService hxService;@ApiOperation("获取环信AppToken(测试用)")@GetMapping("/token/get-hx-app-token")public String getHxAppToken() {return hxService.getAppToken();}@ApiOperation("获取环信用户Token")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/token/get-hx-user-token/{hxUsername}")public String getHxUserToken(@PathVariable String hxUsername) {return hxService.getUserToken(hxUsername);}@ApiOperation("授权注册单个用户")@PostMapping("/user/add-user")@SuppressWarnings("unchecked")public AjaxResult<String> addUser(@RequestBody AddUserParams params) {hxService.addUser(params);return AjaxResult.success();}@ApiOperation("批量注册用户")@PostMapping("/user/add-user-batch")@SuppressWarnings("unchecked")public AjaxResult<String> addUserBatch(@RequestBody List<AddUserParams> paramsList) {hxService.addUserBatch(paramsList);return AjaxResult.success();}@ApiOperation("获取单个用户详情")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/user/get-user-info/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getUserInfo(@PathVariable String hxUsername) {return AjaxResult.success(hxService.getUserInfo(hxUsername));}@ApiOperation("批量获取用户详情")@PostMapping("/user/get-user-infos")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getUserInfos(@RequestBody GetUserInfosParams params) {return AjaxResult.success(hxService.getUserInfos(params));}@ApiOperation("删除单个用户")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/user/del-user/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> delUser(@PathVariable String hxUsername) {hxService.delUser(hxUsername);return AjaxResult.success();}@ApiOperation("修改用户密码")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@PutMapping("/user/edit-password/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> editPassword(@PathVariable String hxUsername, @RequestBody String password) {hxService.editPassword(hxUsername, password);return AjaxResult.success();}@ApiOperation("获取单个用户在线状态")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/user/status/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> status(@PathVariable String hxUsername) {return AjaxResult.success(hxService.status(hxUsername));}@ApiOperation("批量获取用户在线状态")@PostMapping("/user/status/batch")@SuppressWarnings("unchecked")public AjaxResult<List<Map<String, String>>> statusBatch(String[] hxUsernames) {return AjaxResult.success(hxService.statusBatch(hxUsernames));}@ApiOperation("设置用户全局禁言")@PostMapping("/user/mutes")@SuppressWarnings("unchecked")public AjaxResult<String> mutes(@RequestBody MutesParams params) {hxService.mutes(params);return AjaxResult.success();}@ApiOperation("查询单个用户ID全局禁言")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/user/get-user-mutes/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getUserMutes(@PathVariable String hxUsername) {return AjaxResult.success(hxService.getUserMutes(hxUsername));}@ApiOperation("查询app下的所有全局禁言的用户")@GetMapping("/user/get-users-mutes")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getUsersMutes() {return AjaxResult.success(hxService.getUsersMutes());}@ApiOperation("获取用户离线消息数量")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/user/offline-msg-count/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> offlineMsgCount(@PathVariable String hxUsername) {return AjaxResult.success(hxService.offlineMsgCount(hxUsername));}@ApiOperation("获取指定离线消息的投递状态")@ApiImplicitParams({@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true,dataTypeClass = String.class),@ApiImplicitParam(name = "msgId", value = "消息id", required = true, dataTypeClass = String.class)})@GetMapping("/user/offline-msg-status/{hxUsername}/{msgId}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> offlineMsgStatus(@PathVariable String hxUsername, @PathVariable String msgId) {return AjaxResult.success(hxService.offlineMsgStatus(hxUsername, msgId));}@ApiOperation("账号封禁")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@PostMapping("/user/deactivate/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> deactivate(@PathVariable String hxUsername) {hxService.deactivate(hxUsername);return AjaxResult.success();}@ApiOperation("账号解禁")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@PostMapping("/user/activate/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> activate(@PathVariable String hxUsername) {hxService.activate(hxUsername);return AjaxResult.success();}@ApiOperation("强制下线")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@PostMapping("/user/disconnect/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> disconnect(@PathVariable String hxUsername) {hxService.disconnect(hxUsername);return AjaxResult.success();}@ApiOperation("设置离线推送时显示的昵称")@ApiImplicitParams({@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true,dataTypeClass = String.class),@ApiImplicitParam(name = "nickname", value = "昵称", required = true, dataTypeClass = String.class)})@PutMapping("/push/set-nickname/{hxUsername}/{nickname}")@SuppressWarnings("unchecked")public AjaxResult<String> setNickname(@PathVariable String hxUsername, @PathVariable String nickname) {hxService.setNickname(hxUsername, nickname);return AjaxResult.success();}@ApiOperation("设置离线推送通知的展示方式")@ApiImplicitParams({@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true,dataTypeClass = String.class),@ApiImplicitParam(name = "notificationDisplayStyle", value = "离线推送通知展示方式,0-隐藏消息内容,1-展示消息内容",required = true, dataTypeClass = Integer.class)})@PutMapping("/push/set-notification-display-style/{hxUsername}/{notificationDisplayStyle}")@SuppressWarnings("unchecked")public AjaxResult<String> setNotificationDisplayStyle(@PathVariable String hxUsername,@PathVariable int notificationDisplayStyle) {hxService.setNotificationDisplayStyle(hxUsername, notificationDisplayStyle);return AjaxResult.success();}@ApiOperation("设置免打扰模式")@PutMapping("/push/set-notification_no_disturbing")@SuppressWarnings("unchecked")public AjaxResult<String> setNotificationNoDisturbing(@RequestBody SetNotificationNoDisturbingParams params) {hxService.setNotificationNoDisturbing(params);return AjaxResult.success();}@ApiOperation("设置离线推送")@PutMapping("/push/set-notification")@SuppressWarnings("unchecked")public AjaxResult<String> setNotification(@RequestBody SetNotificationParams params) {hxService.setNotification(params);return AjaxResult.success();}@ApiOperation("查询离线推送设置")@ApiImplicitParams({@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true,dataTypeClass = String.class),@ApiImplicitParam(name = "chattype", value = "对象类型,即会话类型:\n" +"- user:用户,表示单聊;\n" +"- chatgroup:群组,表示群聊。", required = true, dataTypeClass = String.class),@ApiImplicitParam(name = "key", value = "对象名称:\n" +"- 单聊时为对端用户的用户 ID;\n" +"- 群聊时为群组 ID。", required = true, dataTypeClass = String.class)})@GetMapping("/push/notification/{hxUsername}/{chattype}/{key}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> notification(@PathVariable String hxUsername, @PathVariable String chattype,@PathVariable String key) {return AjaxResult.success(hxService.notification(hxUsername, chattype, key));}@ApiOperation("设置推送通知的首选语言")@ApiImplicitParams({@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true,dataTypeClass = String.class),@ApiImplicitParam(name = "translationLanguage", value = "用户接收的推送通知的首选语言的代码。如果设置为空字符串," +"表示无需翻译,服务器直接推送原语言的通知。", required = true, dataTypeClass = String.class)})@PutMapping("/push/notification/{hxUsername}/language")@SuppressWarnings("unchecked")public AjaxResult<String> setNotificationLanguage(@PathVariable String hxUsername,@RequestParam String translationLanguage) {hxService.setNotificationLanguage(hxUsername, translationLanguage);return AjaxResult.success();}@ApiOperation("获取推送通知的首选语言")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/push/notification/{hxUsername}/language")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getNotificationLanguage(@PathVariable String hxUsername) {return AjaxResult.success(hxService.getNotificationLanguage(hxUsername));}@ApiOperation("创建离线推送模板")@ApiImplicitParam(name = "userId", value = "系统用户id", required = true, dataTypeClass = Long.class)@PostMapping("/push/notification/template")@SuppressWarnings("unchecked")public AjaxResult<String> createNotificationTemplate(@RequestParam Long userId,@RequestBody CreateNotificationTemplateParams params) {hxService.createNotificationTemplate(userId, params);return AjaxResult.success();}@ApiOperation("查询离线推送模板")@ApiImplicitParam(name = "name", value = "模版名称", required = true, dataTypeClass = String.class)@GetMapping("/push/notification/template/{name}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getNotificationTemplate(@PathVariable String name) {return AjaxResult.success(hxService.getNotificationTemplate(name));}@ApiOperation("删除离线推送模板")@ApiImplicitParam(name = "name", value = "模版名称", required = true, dataTypeClass = String.class)@DeleteMapping("/push/notification/template/{name}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> delNotificationTemplate(@PathVariable String name) {hxService.delNotificationTemplate(name);return AjaxResult.success();}@ApiOperation("发送消息")@PostMapping("/message/send")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> sendMessage(@RequestBody SendMessageParams params) {return AjaxResult.success(hxService.sendMessage(params));}@ApiOperation("文件上传")@ApiImplicitParams({@ApiImplicitParam(name = "restrictAccess", value = "是否限制访问该文件:\n" +"- true:是。用户需要通过响应 body 中获取的文件访问密钥(share-secret)才能下载该文件。\n" +"- false:否。表示不限制访问。用户可以直接下载该文件。", dataTypeClass = Boolean.class),@ApiImplicitParam(name = "thumbnailHeight", value = "缩略图的高度,单位为像素。\n" +"- 若上传的原图或视频缩略图小于 10 KB,上传的图片即为缩略图。\n" +"- 若上传的图片超过 10 KB,缩略图的高度取决于该参数的设置。\n" +"- 若不传该参数,缩略图的高度默认为 170 像素。你也可以在 环信即时通讯控制台 (opens new window)的 服务概览 页面的 " +"设置 区域修改该默认值。", dataTypeClass = Integer.class),@ApiImplicitParam(name = "thumbnailWidth", value = "缩略图的宽度,单位为像素。\n" +"- 若上传的原图或视频缩略图小于 10 KB,图片原图即为缩略图。\n" +"- 若上传的图片超过 10 KB,缩略图的宽度取决于该参数的设置。\n" +"- 若不传该参数,缩略图的宽度默认为 170 像素。你也可以在 环信即时通讯控制台 (opens new window)的 服务概览 页面的 " +"设置 区域修改该默认值。", dataTypeClass = Integer.class)})@PostMapping("/message/chatfiles")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> uploadChatfiles(@RequestPart MultipartFile file,@RequestParam(required = false) Boolean restrictAccess,@RequestParam(required = false) Integer thumbnailHeight,@RequestParam(required = false) Integer thumbnailWidth) {return AjaxResult.success(hxService.uploadChatfiles(restrictAccess, file, thumbnailHeight, thumbnailWidth));}@ApiOperation("下载文件")@ApiImplicitParams({@ApiImplicitParam(name = "fileUuid", value = "服务器为文件生成的 UUID", required = true,dataTypeClass = String.class),@ApiImplicitParam(name = "shareSecret", value = "文件访问密钥。若上传文件时限制了访问,下载该文件时则需要该访问密钥。" +"成功上传文件后,从 文件上传 的响应 body 中获取该密钥。", dataTypeClass = String.class),@ApiImplicitParam(name = "thumbnail", value = "是否下载缩略图:\n" +"- true:是,下载缩略图。\n" +"- false:否,下载原文件。", dataTypeClass = String.class)})@GetMapping("/message/chatfiles/{fileUuid}")public void downloadChatfiles(@PathVariable String fileUuid,@RequestParam(required = false) String shareSecret,@RequestParam(required = false) Boolean thumbnail,HttpServletResponse response) {hxService.downloadChatfiles(fileUuid, shareSecret, thumbnail, response);}@ApiOperation("获取历史消息记录")@ApiImplicitParam(name = "time", value = "历史消息记录查询的起始时间。UTC 时间,使用 ISO8601 标准,格式为 yyyyMMddHH。" +"例如 time 为 2018112717,则表示查询 2018 年 11 月 27 日 17 时至 2018 年 11 月 27 日 18 时期间的历史消息。",required = true, dataTypeClass = String.class)@GetMapping("/message/chatmessages/{time}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getChatMessages(@PathVariable String time) {return AjaxResult.success(hxService.getChatMessages(time));}@ApiOperation("服务端消息撤回")@PostMapping("/message/msg_recall")@SuppressWarnings("unchecked")public AjaxResult<String> messageReCall(@RequestBody MessageReCallParams params) {hxService.messageReCall(params);return AjaxResult.success();}@ApiOperation("服务端单向删除会话")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@DeleteMapping("/message/{hxUsername}/user_channel")@SuppressWarnings("unchecked")public AjaxResult<String> userChannel(@PathVariable String hxUsername,@RequestBody DelChatSessionParams params) {hxService.userChannel(hxUsername, params);return AjaxResult.success();}@ApiOperation("导入单聊消息")@PostMapping("/message/users/import")@SuppressWarnings("unchecked")public AjaxResult<String> messageUsersImport(@RequestBody MessageImportParams params) {hxService.messageUsersImport(params);return AjaxResult.success();}@ApiOperation("导入群聊消息")@PostMapping("/message/chatgroups/import")@SuppressWarnings("unchecked")public AjaxResult<String> messageChatgroupsImport(@RequestBody MessageImportParams params) {hxService.messageChatgroupsImport(params);return AjaxResult.success();}@ApiOperation("设置用户属性")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@PutMapping("/metadata/user/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> setUserMetadata(@PathVariable String hxUsername, @RequestBody SetUserInfoParams params) {hxService.setUserMetadata(hxUsername, params);return AjaxResult.success();}@ApiOperation("获取用户属性")@ApiImplicitParam(name = "hxUsername", value = "环信用户id", required = true, dataTypeClass = String.class)@GetMapping("/metadata/user/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getUserMetadata(@PathVariable String hxUsername) {return AjaxResult.success(hxService.getUserMetadata(hxUsername));}@ApiOperation("批量获取用户属性")@PostMapping("/metadata/user/get")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> getUsersMetadata(@RequestBody GetUsersMetadataParams params) {return AjaxResult.success(hxService.getUsersMetadata(params));}@ApiOperation("获取app下用户属性总大小")@GetMapping("/metadata/user/capacity")@SuppressWarnings("unchecked")public AjaxResult<Integer> getMetadataCapacity() {return AjaxResult.success(hxService.getMetadataCapacity());}@ApiOperation("删除用户属性")@DeleteMapping("/metadata/user/{hxUsername}")@SuppressWarnings("unchecked")public AjaxResult<String> delUsersMetadata(@PathVariable String hxUsername) {hxService.delUsersMetadata(hxUsername);return AjaxResult.success();}@ApiOperation("添加好友")@ApiImplicitParams({@ApiImplicitParam(name = "ownerUsername", value = "当前用户的用户 ID",required = true, dataTypeClass = String.class),@ApiImplicitParam(name = "friendUsername", value = "要添加的用户 ID",required = true, dataTypeClass = String.class)})@PostMapping("/relationship/users/{ownerUsername}/contacts/users/{friendUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> addFriend(@PathVariable String ownerUsername, @PathVariable String friendUsername) {return AjaxResult.success(hxService.addFriend(ownerUsername, friendUsername));}@ApiOperation("移除好友")@ApiImplicitParams({@ApiImplicitParam(name = "ownerUsername", value = "当前用户的用户 ID",required = true, dataTypeClass = String.class),@ApiImplicitParam(name = "friendUsername", value = "要添加的用户 ID",required = true, dataTypeClass = String.class)})@DeleteMapping("/relationship/users/{ownerUsername}/contacts/users/{friendUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> delFriend(@PathVariable String ownerUsername, @PathVariable String friendUsername) {return AjaxResult.success(hxService.delFriend(ownerUsername, friendUsername));}@ApiOperation("获取好友列表")@ApiImplicitParam(name = "ownerUsername", value = "当前用户的用户 ID",required = true, dataTypeClass = String.class)@GetMapping("/relationship/users/{ownerUsername}/contacts/users/")@SuppressWarnings("unchecked")public AjaxResult<List<String>> getFriendList(@PathVariable String ownerUsername) {return AjaxResult.success(hxService.getFriendList(ownerUsername));}@ApiOperation("添加用户至黑名单")@ApiImplicitParam(name = "ownerUsername", value = "当前用户的用户 ID",required = true, dataTypeClass = String.class)@PostMapping("/relationship/users/{ownerUsername}/blocks/users/")@SuppressWarnings("unchecked")public AjaxResult<List<String>> addBlacklist(@PathVariable String ownerUsername, @RequestBody List<String> usernames) {return AjaxResult.success(hxService.addBlacklist(ownerUsername, usernames));}@ApiOperation("获取黑名单列表")@ApiImplicitParam(name = "ownerUsername", value = "当前用户的用户 ID",required = true, dataTypeClass = String.class)@GetMapping("/relationship/users/{ownerUsername}/blocks/users/")@SuppressWarnings("unchecked")public AjaxResult<List<String>> getBlacklist(@PathVariable String ownerUsername) {return AjaxResult.success(hxService.getBlacklist(ownerUsername));}@ApiOperation("从黑名单中移除用户")@ApiImplicitParams({@ApiImplicitParam(name = "ownerUsername", value = "当前用户的用户ID",required = true, dataTypeClass = String.class),@ApiImplicitParam(name = "blockedUsername", value = "要移出黑名单的用户ID",required = true, dataTypeClass = String.class)})@DeleteMapping("/relationship/users/{ownerUsername}/blocks/users/{blockedUsername}")@SuppressWarnings("unchecked")public AjaxResult<Map<String, Object>> delBlacklist(@PathVariable String ownerUsername,@PathVariable String blockedUsername) {return AjaxResult.success(hxService.delBlacklist(ownerUsername, blockedUsername));}
}
Service
/*** @author xc* @description 环信服务类* @create 2023-03-29 19:07*/
public interface HxService {/*** 获取appToken** @return java.lang.String* @author xc* @date 2023/3/29 19:30*/String getAppToken();/*** 获取用户Token** @param hxUsername 环信用户id* @return java.lang.String* @author xc* @date 2023/3/30 11:21*/String getUserToken(String hxUsername);/*** 授权注册单个用户** @param params 请求体* @author xc* @date 2023/3/30 09:32*/void addUser(RegisterHxUserParams params);/*** 批量注册用户** @param paramsList 请求体* @author xc* @date 2023/3/30 13:55*/void addUserBatch(List<RegisterHxUserParams> paramsList);/*** 获取单个用户详情** @param hxUsername 环信用户id* @return java.util.Map < java.lang.String, java.lang.Object>* @author xc* @date 2023/3/30 13:35*/Map<String, Object> getUserInfo(String hxUsername);/*** 批量获取用户详情** @param params 请求体* @return java.util.List>* @author xc* @date 2023/3/30 15:27*/ Map<String, Object> getUserInfos(GetUserInfosParams params);/*** 删除单个用户** @param hxUsername 环信用户id* @author xc* @date 2023/3/30 10:11*/void delUser(String hxUsername);/*** 修改用户密码** @param hxUsername 环信用户id* @param password 用户密码* @author xc* @date 2023/3/30 16:19*/void editPassword(String hxUsername, String password);/*** 获取单个用户在线状态** @param hxUsername 环信用户id* @return java.lang.Boolean* @author xc* @date 2023/3/30 10:19*/Map<String, String> status(String hxUsername);/*** 批量获取用户在线状态** @param hxUsernames 环信用户ids* @return java.lang.String* @author xc* @date 2023/3/30 10:31*/List<Map<String, String>> statusBatch(String[] hxUsernames);/*** 设置用户全局禁言** @param params 请求体* @author xc* @date 2023/3/30 16:34*/void mutes(MutesParams params);/*** 查询单个用户ID全局禁言** @param hxUsername 环信用户id* @return java.lang.String* @author xc* @date 2023/3/30 16:44*/Map<String, Object> getUserMutes(String hxUsername);/*** 查询app下的所有全局禁言的用户** @return java.util.Map* @author xc* @date 2023/3/30 16:50*/ Map<String, Object> getUsersMutes();/*** 获取用户离线消息数量** @param hxUsername 环信用户id* @return java.lang.String* @author xc* @date 2023/3/30 11:09*/Map<String, Object> offlineMsgCount(String hxUsername);/*** 获取指定离线消息的投递状态** @param hxUsername 环信用户id* @param msgId 消息id* @return java.lang.String* @author xc* @date 2023/3/30 11:16*/Map<String, Object> offlineMsgStatus(String hxUsername, String msgId);/*** 账号封禁** @param hxUsername 环信用户id* @author xc* @date 2023/3/30 16:54*/void deactivate(String hxUsername);/*** 账号解禁** @param hxUsername 环信用户id* @author xc* @date 2023/3/30 17:01*/void activate(String hxUsername);/*** 强制下线** @param hxUsername 环信用户id* @author xc* @date 2023/3/30 17:04*/void disconnect(String hxUsername);/*** 设置离线推送时显示的昵称** @param hxUsername 环信用户id* @param nickname 昵称* @author xc* @date 2023/3/30 11:38*/void setNickname(String hxUsername, String nickname);/*** 设置离线推送通知的展示方式** @param hxUsername 环信用户id* @param notificationDisplayStyle 离线推送通知的展示方式:* (默认)0:推送标题为“您有一条新消息”,推送内容为“请点击查看”;* 1:推送标题为“您有一条新消息”,推送内容为发送人昵称和离线消息的内容。* @author xc* @date 2023/3/30 11:54*/void setNotificationDisplayStyle(String hxUsername, int notificationDisplayStyle);/*** 设置免打扰模式** @param params 请求体* @author xc* @date 2023/3/30 13:03*/void setNotificationNoDisturbing(SetNotificationNoDisturbingParams params);/*** 设置离线推送** @param params 请求体* @author xc* @date 2023/3/30 13:19*/void setNotification(SetNotificationParams params);/*** 查询离线推送设置** @param hxUsername 环信用户id* @param chattype 对象类型,即会话类型:* - user:用户,表示单聊;* - chatgroup:群组,表示群聊。* @param key 对象名称:* - 单聊时为对端用户的用户 ID;* - 群聊时为群组 ID。* @return java.util.Map* @author xc* @date 2023/3/30 17:12*/ Map<String, Object> notification(String hxUsername, String chattype, String key);/*** 设置推送通知的首选语言** @param hxUsername 环信用户id* @param translationLanguage 用户接收的推送通知的首选语言的代码。如果设置为空字符串,表示无需翻译,服务器直接推送原语言的通知。* @author xc* @date 2023/3/30 17:23*/void setNotificationLanguage(String hxUsername, String translationLanguage);/*** 获取推送通知的首选语言** @param hxUsername 环信用户id* @return java.lang.String* @author xc* @date 2023/3/30 19:21*/Map<String, Object> getNotificationLanguage(String hxUsername);/*** 创建离线推送模板** @param userId 系统用户id* @param params 模版参数* @author xc* @date 2023/3/30 19:29*/void createNotificationTemplate(Long userId, CreateNotificationTemplateParams params);/*** 查询离线推送模板** @param name 模版名称* @return java.lang.String* @author xc* @date 2023/3/30 20:20*/Map<String, Object> getNotificationTemplate(String name);/*** 删除离线推送模板** @param name 模版名称* @author xc* @date 2023/3/30 20:43*/void delNotificationTemplate(String name);/*** 发送消息** @param params 消息内容* @return java.lang.String* @author xc* @date 2023/3/31 09:26*/Map<String, Object> sendMessage(SendMessageParams params);/*** 文件上传** @param restrictAccess 文件访问权限* @param file 文件* @param thumbnailHeight 缩略图高度* @param thumbnailHidth 缩略图宽度* @return java.lang.String* @author xc* @date 2023/3/31 13:10*/Map<String, Object> uploadChatfiles(Boolean restrictAccess,MultipartFile file,Integer thumbnailHeight,Integer thumbnailHidth);/*** 下载文件** @param fileUuid 文件uuid(上传是获得)* @param shareSecret 文件访问密钥。若上传文件时限制了访问,下载该文件时则需要该访问密钥。* 成功上传文件后,从 文件上传 的响应 body 中获取该密钥。* @param thumbnail 是否下载缩略图:* true:是,下载缩略图。* false:否,下载原文件。* @param response 响应体* @author xc* @date 2023/3/31 14:55*/void downloadChatfiles(String fileUuid, String shareSecret, Boolean thumbnail, HttpServletResponse response);/*** 获取历史消息记录** @param time 历史消息记录查询的起始时间。UTC 时间,使用 ISO8601 标准,格式为 yyyyMMddHH。* 例如 time 为 2018112717,则表示查询 2018 年 11 月 27 日 17 时至 2018 年 11 月 27 日 18 时期间的历史消息。* @return java.lang.String* @author xc* @date 2023/3/31 17:12*/Map<String, Object> getChatMessages(String time);/*** 服务端消息撤回** @param params 请求参数* @author xc* @date 2023/3/31 17:34*/void messageReCall(MessageReCallParams params);/*** 服务端单向删除会话** @param hxUsername 环信用户id* @param params 请求参数* @author xc* @date 2023/3/31 20:25*/void userChannel(String hxUsername, DelChatSessionParams params);/*** 导入单聊消息** @param params 消息内容* @author xc* @date 2023/4/2 14:47*/void messageUsersImport(MessageImportParams params);/*** 导入群聊消息** @param params 消息内容* @author xc* @date 2023/4/2 15:52*/void messageChatgroupsImport(MessageImportParams params);/*** 设置用户属性** @param hxUsername 环信用户id* @param params 参数* @author xc* @date 2023/4/2 16:14*/void setUserMetadata(String hxUsername, SetUserInfoParams params);/*** 获取用户属性** @param hxUsername 环信用户id* @return java.lang.String* @author xc* @date 2023/4/2 17:49*/Map<String, Object> getUserMetadata(String hxUsername);/*** 获取用户属性** @param params 请求参数* @return java.lang.String* @author xc* @date 2023/4/2 19:06*/Map<String, Object> getUsersMetadata(GetUsersMetadataParams params);/*** 获取 app 下用户属性总大小** @return java.lang.Long* @author xc* @date 2023/4/2 19:16*/int getMetadataCapacity();/*** 删除用户属性** @param hxUsername 环信用户名* @author xc* @date 2023/4/2 19:24*/void delUsersMetadata(String hxUsername);/*** 添加好友** @param ownerUsername 当前用户id* @param friendUsername 好友id* @return java.util.Map* @author xc* @date 2023/4/2 19:33*/ Map<String, Object> addFriend(String ownerUsername, String friendUsername);/*** 移除好友** @param ownerUsername 当前用户id* @param friendUsername 好友id* @return java.util.Map* @author xc* @date 2023/4/2 19:41*/ Map<String, Object> delFriend(String ownerUsername, String friendUsername);/*** 获取好友列表** @param ownerUsername 当前用户id* @return java.util.List* @author xc* @date 2023/4/2 19:46*/ List<String> getFriendList(String ownerUsername);/*** 添加用户至黑名单** @param ownerUsername 当前用户id* @param usernames 要加入黑名单的用户id集合* @return java.util.List* @author xc* @date 2023/4/2 20:00*/ List<String> addBlacklist(String ownerUsername, List<String> usernames);/*** 获取黑名单列表** @param ownerUsername 当前用户id* @return java.util.List* @author xc* @date 2023/4/2 20:13*/ List<String> getBlacklist(String ownerUsername);/*** 从黑名单中移除用户** @param ownerUsername 当前用户的用户 ID* @param blockedUsername 要移出黑名单的用户 ID* @return java.util.List>* @author xc* @date 2023/4/2 20:19*/ Map<String, Object> delBlacklist(java.lang.String ownerUsername, java.lang.String blockedUsername);
}
ServiceImpl
/*** @author xc* @description 环信服务实现类* @create 2023-03-29 19:08*/
@Service
@Slf4j
public class HxServiceImpl implements HxService {private static final String HX_APP_TOKEN_KEY = "yp:hx-app-token";private static final String HX_USER_TOKEN_KEY = "yp:hx-user-token:";private static final int RESPONSE_SUCCESS = 200;@Resourceprivate RedisCache redisCache;@Resourceprivate HxConfig hxConfig;@Overridepublic String getAppToken() {// 如果token没过期,则直接返回if (redisCache.hasKey(HX_APP_TOKEN_KEY)) {String accessToken = redisCache.getCacheObject(HX_APP_TOKEN_KEY);log.info("环信-获取AppToken-从Redis获取成功 ===> {}", accessToken);return accessToken;}MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");Map<String, Object> body = new HashMap<>(Maps.newHashMapWithExpectedSize(3));// 授权方式。该参数设置为固定字符串 client_credentials,即客户端凭证模式。body.put("grant_type", "client_credentials");// App 的 client_id,用于生成 app token 调用 REST API。body.put("client_id", hxConfig.getClientId());// App 的 client_secret,用于生成 app token 调用 REST API。body.put("client_secret", hxConfig.getClientSecret());HttpResponse response = HttpRequest.post(getHxUrl() + "token").header(headers).body(new JSONObject(body).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取AppToken-成功 ===> {}", resultMap);String accessToken = (String) resultMap.get("access_token");int expiresIn = (Integer) resultMap.get("expires_in");// 将环信的appToken保存到Redis中redisCache.setCacheObject(HX_APP_TOKEN_KEY, accessToken, expiresIn, TimeUnit.SECONDS);return accessToken;} else {log.info("环信-获取AppToken-失败 ===> {}", response);throw new RuntimeException("环信-获取AppToken-失败");}}@Overridepublic String getUserToken(String hxUsername) {// 如果token没过期,则直接返回if (redisCache.hasKey(HX_USER_TOKEN_KEY + hxUsername)) {String accessToken = redisCache.getCacheObject(HX_USER_TOKEN_KEY + hxUsername);log.info("环信-获取用户Token-从Redis获取成功 ===> {}", accessToken);return accessToken;}MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());Map<String, Object> body = new HashMap<>(Maps.newHashMapWithExpectedSize(3));// 授权方式。//- 若值为 password,通过用户 ID 和密码获取 token,需设置 username 和 password 参数。在该请求中,该参数需设置为 password。//- 若值为 inherit,通过用户 ID 获取 token,只需设置 username 参数。body.put("grant_type", "inherit");// 用户 ID。body.put("username", hxUsername);HttpResponse response = HttpRequest.post(getHxUrl() + "token").header(headers).body(new JSONObject(body).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取用户Token-成功 ===> {}", resultMap);String accessToken = (String) resultMap.get("access_token");int expiresIn = (Integer) resultMap.get("expires_in");// 将环信的用户Token保存到Redis中redisCache.setCacheObject(HX_USER_TOKEN_KEY + hxUsername, accessToken, expiresIn, TimeUnit.SECONDS);return accessToken;} else {log.info("环信-获取用户Token-失败 ===> {}", response);throw new RuntimeException("环信-获取用户Token-失败");}}@Overridepublic void addUser(RegisterHxUserParams params) {// 业务:校验是否已有账号// 创建一个环信用户MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(Maps.newHashMapWithExpectedSize(3));headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());log.info("请求路径:{}", getHxUrl());HttpResponse response = HttpRequest.post(getHxUrl() + "users").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-授权注册单个用户-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> entitiesList = (List<Map<String, Object>>) resultMap.get("entities");String uuid = (String) entitiesList.get(0).get("uuid");// 业务:将该用户保存到数据库中} else {log.info("环信-授权注册单个用户-失败 ===> {}", response);throw new RuntimeException("环信-授权注册单个用户-失败");}}@Overridepublic void addUserBatch(List<RegisterHxUserParams> paramsList) {// 业务:校验是否已有账号// 创建一个环信用户MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(Maps.newHashMapWithExpectedSize(3));headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "users").header(headers).body(new JSONArray(paramsList).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-批量注册用户-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> entitiesList = (List<Map<String, Object>>) resultMap.get("entities");// 业务:将该用户保存到数据库中} else {log.info("环信-批量注册用户-失败 ===> {}", response);throw new RuntimeException("环信-批量注册用户-失败");}}@Overridepublic Map<String, Object> getUserInfo(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + hxUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-获取单个用户详情-成功 ===> {}", response.body());@SuppressWarnings("unchecked")Map<String, Object> map = JSONUtil.toBean(response.body(), HashMap.class);return map;} else {log.info("环信-获取单个用户详情-失败 ===> {}", response);throw new RuntimeException("环信-获取单个用户详情-失败");}}@Overridepublic Map<String, Object> getUserInfos(GetUserInfosParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users?limit=" + params.getLimit() +(params.getCursor() == null ? "" : "&cursor=" + params.getCursor())).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-批量获取用户详情-成功 ===> {}", response.body());@SuppressWarnings("unchecked")Map<String, Object> map = JSONUtil.toBean(response.body(), HashMap.class);return map;} else {log.info("环信-批量获取用户详情-失败 ===> {}", response);throw new RuntimeException("环信-批量获取用户详情-失败");}}@Overridepublic void delUser(String hxUsername) {// 删除一个环信用户MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.delete(getHxUrl() + "users/" + hxUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-删除单个用户-成功 ===> {}", response.body());// 业务:删除数据库中该用户} else {log.info("环信-删除单个用户-失败 ===> {}", response);throw new RuntimeException("环信-删除单个用户-失败");}}@Overridepublic void editPassword(String hxUsername, String password) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());JSONObject jsonObject = new JSONObject();jsonObject.set("newpassword", password);HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + hxUsername + "/password").header(headers).body(jsonObject.toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-修改用户密码-成功 ===> {}", response.body());// 业务:更新用户密码} else {log.info("环信-修改用户密码-失败 ===> {}", response);throw new RuntimeException("环信-修改用户密码-失败");}}@Overridepublic Map<String, String> status(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + hxUsername + "/status").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取单个用户在线状态-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, String> dataMap = (Map<String, String>) resultMap.get("data");return dataMap;} else {log.info("环信-获取单个用户在线状态-失败 ===> {}", response);throw new RuntimeException("环信-获取单个用户在线状态-失败");}}@Overridepublic List<Map<String, String>> statusBatch(String[] hxUsernames) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());JSONArray content = new JSONArray(hxUsernames);JSONObject body = new JSONObject();body.set("usernames", content);HttpResponse response = HttpRequest.post(getHxUrl() + "users/batch/status").header(headers).body(body.toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-批量获取用户在线状态-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, String>> listMap = (List<Map<String, String>>) resultMap.get("data");return listMap;} else {log.info("环信-批量获取用户在线状态-失败 ===> {}", response);throw new RuntimeException("环信-批量获取用户在线状态-失败");}}@Overridepublic void mutes(MutesParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "mutes").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置用户全局禁言-成功 ===> {}", response.body());} else {log.info("环信-设置用户全局禁言-失败 ===> {}", response);throw new RuntimeException("环信-设置用户全局禁言-失败");}}@Overridepublic Map<String, Object> getUserMutes(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "mutes/" + hxUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-查询单个用户ID全局禁言-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-查询单个用户ID全局禁言-失败 ===> {}", response);throw new RuntimeException("环信-查询单个用户ID全局禁言-失败");}}@Overridepublic Map<String, Object> getUsersMutes() {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "mutes").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-查询app下的所有全局禁言的用户-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-查询app下的所有全局禁言的用户-失败 ===> {}", response);throw new RuntimeException("环信-查询app下的所有全局禁言的用户-失败");}}@Overridepublic Map<String, Object> offlineMsgCount(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + hxUsername + "/offline_msg_count").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取用户离线消息数量-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-获取用户离线消息数量-失败 ===> {}", response);throw new RuntimeException("环信-获取用户离线消息数量-失败");}}@Overridepublic Map<String, Object> offlineMsgStatus(String hxUsername, String msgId) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + hxUsername + "/offline_msg_status/" + msgId).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取指定离线消息的投递状态-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-获取指定离线消息的投递状态-失败 ===> {}", response);throw new RuntimeException("环信-获取指定离线消息的投递状态-失败");}}@Overridepublic void deactivate(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "users/" + hxUsername + "/deactivate").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-账号封禁-成功 ===> {}", response.body());} else {log.info("环信-账号封禁-失败 ===> {}", response);throw new RuntimeException("环信-账号封禁-失败");}}@Overridepublic void activate(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "users/" + hxUsername + "/activate").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-账号解禁-成功 ===> {}", response.body());} else {log.info("环信-账号解禁-失败 ===> {}", response);throw new RuntimeException("环信-账号解禁-失败");}}@Overridepublic void disconnect(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + hxUsername + "/disconnect").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-强制下线-成功 ===> {}", response.body());} else {log.info("环信-强制下线-失败 ===> {}", response);throw new RuntimeException("环信-强制下线-失败");}}@Overridepublic void setNickname(String hxUsername, String nickname) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());Map<String, Object> body = new HashMap<>(Maps.newHashMapWithExpectedSize(1));// 收到离线推送通知时显示的昵称,仅用在客户端推送通知栏显示。body.put("nickname", nickname);HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + hxUsername).header(headers).body(new JSONObject(body).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置离线推送时显示的昵称-成功 ===> {}", response.body());} else {log.info("环信-设置离线推送时显示的昵称-失败 ===> {}", response);throw new RuntimeException("环信-设置离线推送时显示的昵称-失败");}}@Overridepublic void setNotificationDisplayStyle(String hxUsername, int notificationDisplayStyle) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());Map<String, Object> body = new HashMap<>(Maps.newHashMapWithExpectedSize(1));// 离线推送通知的展示方式://(默认)0:推送标题为“您有一条新消息”,推送内容为“请点击查看”;// 1:推送标题为“您有一条新消息”,推送内容为发送人昵称和离线消息的内容。body.put("notification_display_style", notificationDisplayStyle);HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + hxUsername).header(headers).body(new JSONObject(body).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置离线推送通知的展示方式-成功 ===> {}", response.body());} else {log.info("环信-设置离线推送通知的展示方式-失败 ===> {}", response);throw new RuntimeException("环信-设置离线推送时显示的昵称-失败");}}@Overridepublic void setNotificationNoDisturbing(SetNotificationNoDisturbingParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + params.getHxUsername()).header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置免打扰模式-成功 ===> {}", response.body());} else {log.info("环信-设置免打扰模式-失败 ===> {}", response);throw new RuntimeException("环信-设置免打扰模式-失败");}}@Overridepublic void setNotification(SetNotificationParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + params.getHxUsername() + "/notification/" +params.getChattype() + "/" + params.getKey()).header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置离线推送-成功 ===> {}", response.body());} else {log.info("环信-设置离线推送-失败 ===> {}", response);throw new RuntimeException("环信-设置离线推送-失败");}}@Overridepublic Map<String, Object> notification(String hxUsername, String chattype, String key) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + hxUsername + "/notification/" +chattype + "/" + key).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-查询离线推送设置-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-查询离线推送设置-失败 ===> {}", response);throw new RuntimeException("环信-查询离线推送设置-失败");}}@Overridepublic void setNotificationLanguage(String hxUsername, String translationLanguage) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());JSONObject jsonObject = new JSONObject();jsonObject.set("translationLanguage", translationLanguage);HttpResponse response = HttpRequest.put(getHxUrl() + "users/" + hxUsername + "/notification/language").header(headers).body(jsonObject.toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置推送通知的首选语言-成功 ===> {}", response.body());} else {log.info("环信-设置推送通知的首选语言-失败 ===> {}", response);throw new RuntimeException("环信-设置推送通知的首选语言-失败");}}@Overridepublic Map<String, Object> getNotificationLanguage(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + hxUsername + "/notification/language").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取推送通知的首选语言-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-获取推送通知的首选语言-失败 ===> {}", response);throw new RuntimeException("环信-获取推送通知的首选语言-失败");}}@Overridepublic void createNotificationTemplate(Long userId, CreateNotificationTemplateParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "notification/template").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-创建离线推送模板-成功 ===> {}", response.body());// 业务:保存模版信息} else {log.info("环信-创建离线推送模板-失败 ===> {}", response);throw new RuntimeException("环信-创建离线推送模板-失败");}}@Overridepublic Map<String, Object> getNotificationTemplate(String name) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "notification/template/" + name).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-查询离线推送模板-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");return map;} else {log.info("环信-查询离线推送模板-失败 ===> {}", response);throw new RuntimeException("环信-查询离线推送模板-失败");}}@Overridepublic void delNotificationTemplate(String name) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.delete(getHxUrl() + "notification/template/" + name).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-删除离线推送模板-成功 ===> {}", response.body());// 业务:删除数据} else {log.info("环信-删除离线推送模板-失败 ===> {}", response);throw new RuntimeException("环信-删除离线推送模板-失败");}}@Transactional(rollbackFor = Exception.class)@Overridepublic Map<String, Object> sendMessage(SendMessageParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());// 请求路径String tempUrl;if (HxMsgTargetType.USERS.getType().equals(params.getTargetType())) {tempUrl = "messages/users";} else if (HxMsgTargetType.CHATGROUPS.getType().equals(params.getTargetType())) {tempUrl = "messages/chatgroups";} else if (HxMsgTargetType.CHATROOMS.getType().equals(params.getTargetType())) {tempUrl = "messages/chatrooms";} else {throw new RuntimeException("未知的消息接受者类型");}HttpResponse response = HttpRequest.post(getHxUrl() + tempUrl).header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-发送单聊消息-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> map = (Map<String, Object>) resultMap.get("data");// 环信消息idString msgId = (String) map.get(params.getTo().get(0));// 业务:保存消息信息// 业务:处理聊天会话return map;} else {log.info("环信-发送单聊消息-失败 ===> {}", response);throw new RuntimeException("环信-发送单聊消息-失败");}}@Overridepublic Map<String, Object> uploadChatfiles(Boolean restrictAccess,MultipartFile file,Integer thumbnailHeight,Integer thumbnailWidth) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "multipart/form-data");headers.add("Authorization", "Bearer " + getAppToken());if (restrictAccess != null) {headers.add("restrict-access", restrictAccess.toString());}//文件上传前的名称String fileName = file.getOriginalFilename();if (fileName == null) {throw new RuntimeException("环信-上传文件-未获取到文件名");}File file2 = new File(fileName);OutputStream out = null;try {out = new FileOutputStream(file2);byte[] ss = file.getBytes();for (byte s : ss) {out.write(s);}} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}HttpResponse response = HttpRequest.post(getHxUrl() + "chatfiles").header(headers).form("file", file2).form("thumbnail_height", thumbnailHeight).form("thumbnail_width", thumbnailWidth).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-文件上传-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> entities = (List<Map<String, Object>>) resultMap.get("entities");return entities.get(0);} else {log.info("环信-文件上传-失败 ===> {}", response);throw new RuntimeException("环信-文件上传-失败");}}@Overridepublic void downloadChatfiles(String fileUuid, String shareSecret, Boolean thumbnail, HttpServletResponse response) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/octet-stream");headers.add("Authorization", "Bearer " + getAppToken());if (shareSecret != null) {headers.add("share-secret", shareSecret);}if (thumbnail != null) {headers.add("thumbnail", thumbnail.toString());}// 请求需要开启重定向HttpResponse hxResponse = HttpRequest.get(getHxUrl() + "chatfiles/" + fileUuid).setFollowRedirects(true).header(headers).execute();if (hxResponse.getStatus() == RESPONSE_SUCCESS) {log.info("环信-下载文件-成功 ===> {}", hxResponse);response.setContentType("application/force-download");// 设置强制下载不打开response.setHeader("Content-Disposition", hxResponse.header("Content-Disposition"));InputStream fis = null;BufferedInputStream bis = null;try {fis = hxResponse.bodyStream();bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();byte[] buffer = new byte[1024];int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}} else {log.info("环信-下载文件-失败 ===> {}", hxResponse);throw new RuntimeException("环信-下载文件-失败");}}@Overridepublic Map<String, Object> getChatMessages(String time) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "chatmessages/" + time).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取历史消息记录-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> datas = (List<Map<String, Object>>) resultMap.get("data");return datas.get(0);} else {log.info("环信-获取历史消息记录-失败 ===> {}", response);throw new RuntimeException("环信-获取历史消息记录-失败");}}@Transactional(rollbackFor = Exception.class)@Overridepublic void messageReCall(MessageReCallParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "messages/msg_recall").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-服务端消息撤回-成功 ===> {}", response.body());// 业务:修改消息撤回状态// 业务:会话记录消息撤回逻辑} else {log.info("环信-服务端消息撤回-失败 ===> {}", response);throw new RuntimeException("环信-服务端消息撤回-失败");}}@Overridepublic void userChannel(String hxUsername, DelChatSessionParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.delete(getHxUrl() + "users/" + hxUsername + "/user_channel").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-服务端单向删除会话-成功 ===> {}", response.body());} else {log.info("环信-服务端单向删除会话-失败 ===> {}", response);throw new RuntimeException("环信-服务端单向删除会话-失败");}}@Overridepublic void messageUsersImport(MessageImportParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "messages/users/import").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-导入单聊消息-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> data = (Map<String, Object>) resultMap.get("data");String msgId = (String) data.get("msg_id");// 业务:导入单聊消息时,增加聊天详情} else {log.info("环信-导入单聊消息-失败 ===> {}", response);throw new RuntimeException("环信-导入单聊消息-失败");}}@Overridepublic void messageChatgroupsImport(MessageImportParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "messages/chatgroups/import").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-导入群聊消息-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> data = (Map<String, Object>) resultMap.get("data");String msgId = (String) data.get("msg_id");// 业务:导入群聊消息时,增加聊天详情} else {log.info("环信-导入群聊消息-失败 ===> {}", response);throw new RuntimeException("环信-导入群聊消息-失败");}}@Overridepublic void setUserMetadata(String hxUsername, SetUserInfoParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/x-www-form-urlencoded");headers.add("Authorization", "Bearer " + getAppToken());@SuppressWarnings("unchecked")HttpResponse response = HttpRequest.put(getHxUrl() + "metadata/user/" + hxUsername).header(headers).body(HttpUtil.toParams(JSONUtil.toBean(new JSONObject(params).toString(), HashMap.class))).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-设置用户属性-成功 ===> {}", response.body());// 业务:更新用户属性} else {log.info("环信-设置用户属性-失败 ===> {}", response);throw new RuntimeException("环信-设置用户属性-失败");}}@Overridepublic Map<String, Object> getUserMetadata(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "metadata/user/" + hxUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取用户属性-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> data = (Map<String, Object>) resultMap.get("data");return data;} else {log.info("环信-获取用户属性-失败 ===> {}", response);throw new RuntimeException("环信-获取用户属性-失败");}}@Overridepublic Map<String, Object> getUsersMetadata(GetUsersMetadataParams params) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "metadata/user/get").header(headers).body(new JSONObject(params).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-批量获取用户属性-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")Map<String, Object> data = (Map<String, Object>) resultMap.get("data");return data;} else {log.info("环信-批量获取用户属性-失败 ===> {}", response);throw new RuntimeException("环信-批量获取用户属性-失败");}}@Overridepublic int getMetadataCapacity() {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "metadata/user/capacity").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取app下用户属性总大小-成功 ===> {}", resultMap);return (int) resultMap.get("data");} else {log.info("环信-获取app下用户属性总大小-失败 ===> {}", response);throw new RuntimeException("环信-获取app下用户属性总大小-失败");}}@Overridepublic void delUsersMetadata(String hxUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.delete(getHxUrl() + "metadata/user/" + hxUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {log.info("环信-删除用户属性-成功 ===> {}", response.body());} else {log.info("环信-删除用户属性-失败 ===> {}", response);throw new RuntimeException("环信-删除用户属性-失败");}}@Overridepublic Map<String, Object> addFriend(String ownerUsername, String friendUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.post(getHxUrl() + "users/" + ownerUsername + "/contacts/users/" + friendUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-添加好友-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> entities = (List<Map<String, Object>>) resultMap.get("entities");return entities.get(0);} else {log.info("环信-添加好友-失败 ===> {}", response);throw new RuntimeException("环信-添加好友-失败");}}@Overridepublic Map<String, Object> delFriend(String ownerUsername, String friendUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.delete(getHxUrl() + "users/" + ownerUsername + "/contacts/users/" + friendUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-移除好友-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> entities = (List<Map<String, Object>>) resultMap.get("entities");return entities.get(0);} else {log.info("环信-移除好友-失败 ===> {}", response);throw new RuntimeException("环信-移除好友-失败");}}@Overridepublic List<String> getFriendList(String ownerUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Type", "application/json");headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + ownerUsername + "/contacts/users").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取好友列表-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<String> data = (List<String>) resultMap.get("data");return data;} else {log.info("环信-获取好友列表-失败 ===> {}", response);throw new RuntimeException("环信-获取好友列表-失败");}}@Overridepublic List<String> addBlacklist(String ownerUsername, List<String> usernames) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());Map<String, Object> map = new HashMap<>(Maps.newHashMapWithExpectedSize(1));map.put("usernames", usernames);HttpResponse response = HttpRequest.post(getHxUrl() + "users/" + ownerUsername + "/blocks/users").header(headers).body(new JSONObject(map).toString()).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-添加用户至黑名单-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<String> data = (List<String>) resultMap.get("data");return data;} else {log.info("环信-添加用户至黑名单-失败 ===> {}", response);throw new RuntimeException("环信-添加用户至黑名单-失败");}}@Overridepublic List<String> getBlacklist(String ownerUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.get(getHxUrl() + "users/" + ownerUsername + "/blocks/users").header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取黑名单列表-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<String> data = (List<String>) resultMap.get("data");return data;} else {log.info("环信-获取黑名单列表-失败 ===> {}", response);throw new RuntimeException("环信-获取黑名单列表-失败");}}@Overridepublic Map<String, Object> delBlacklist(String ownerUsername, String blockedUsername) {MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Accept", "application/json");headers.add("Authorization", "Bearer " + getAppToken());HttpResponse response = HttpRequest.delete(getHxUrl() + "users/" + ownerUsername + "/blocks/users/" + blockedUsername).header(headers).execute();if (response.getStatus() == RESPONSE_SUCCESS) {@SuppressWarnings("unchecked")Map<String, Object> resultMap = JSONUtil.toBean(response.body(), HashMap.class);log.info("环信-获取黑名单列表-成功 ===> {}", resultMap);@SuppressWarnings("unchecked")List<Map<String, Object>> entities = (List<Map<String, Object>>) resultMap.get("entities");return entities.get(0);} else {log.info("环信-获取黑名单列表-失败 ===> {}", response);throw new RuntimeException("环信-获取黑名单列表-失败");}}private String getHxUrl() {return "https://" + hxConfig.getHost() + "/" +hxConfig.getOrgName() + "/" +hxConfig.getAppName() + "/";}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
