最近需要开发一个客服的功能,由于对socket知识比较匮乏,为了不影响开发进度,准备接入第三方进行二次开发。

        第一步:在IM控制台中创建应用,获取SDKAppID和密钥。

        第二步:引入相关依赖

<!-- 腾讯云IM-sdk -->
<dependency>
    <groupId>com.github.tencentyun</groupId>
    <artifactId>tls-sig-api-v2</artifactId>
    <version>2.0</version>
</dependency>

        第三步:yml配置

#腾讯云IM配置
  IMConfig:
    sdkAppId: 这里填你自己的sdkAppId
    secretKey: 这里填入你的密钥

        第四步:腾讯云IM API路径封装

public enum TencentCloudImApiEnum {

    /**
     * 账号管理
     */
    ACCOUNT_IMPORT("导入单个账号", "v4/im_open_login_svc/account_import"),
    MULTI_ACCOUNT_IMPORT("导入多个账号", "v4/im_open_login_svc/multiaccount_import"),
    ACCOUNT_DELETE("删除账号", "v4/im_open_login_svc/account_delete"),
    ACCOUNT_CHECK("查询账号", "v4/im_open_login_svc/account_check"),
    KICK("失效账号登录状态", "v4/im_open_login_svc/kick"),
    QUERY_ONLINE_STATE("查询账号在线状态", " v4/openim/query_online_status"),

    /**
     * 单聊消息
     */
    SEND_MSG("单发单聊消息", "v4/openim/sendmsg"),
    BATCH_SEND_MSG("批量发单聊消息", "v4/openim/batchsendmsg"),
    IMPORT_MSG("导入单聊消息", "v4/openim/importmsg"),
    ADMIN_GET_ROAM_MSG("查询单聊消息", "v4/openim/admin_getroammsg"),
    ADMIN_MSG_WITH_DRAW("撤回单聊消息", "v4/openim/admin_msgwithdraw"),
    ADMIN_SET_MSG_READ("设置单聊消息已读", "v4/openim/admin_set_msg_read"),
    GET_C2C_UNREAD_MSG_NUM("查询单聊未读消息计数", "v4/openim/get_c2c_unread_msg_num"),
    MODIFY_C2C_MSG("修改单聊历史消息", "v4/openim/modify_c2c_msg"),

    /**
     * 全员推送
     */
    IM_PUSH("全员推送", "v4/all_member_push/im_push"),
    IM_SET_ATTR_NAME("设置应用属性名称", "v4/all_member_push/im_set_attr_name"),
    IM_GET_ATTR_NAME("获取应用属性名称", "v4/all_member_push/im_get_attr_name"),
    IM_GET_ATTR("获取用户属性", "v4/all_member_push/im_get_attr"),
    IM_SET_ATTR("设置用户属性", "v4/all_member_push/im_set_attr"),
    IM_REMOVE_ATTR("删除用户属性", "v4/all_member_push/im_remove_attr"),
    IM_GET_TAG("获取用户标签", "v4/all_member_push/im_get_tag"),
    IM_ADD_TAG("添加用户标签", "v4/all_member_push/im_add_tag"),
    IM_REMOVE_TAG("删除用户标签", "v4/all_member_push/im_remove_tag"),
    IM_REMOVE_ADD_TAGS("删除用户所有标签", "v4/all_member_push/im_remove_all_tags"),

    /**
     * 资料管理
     */
    PORTRAIT_SET("设置资料", "v4/profile/portrait_set"),
    PORTRAIT_GET("拉取资料", "v4/profile/portrait_get"),

    /**
     * 关系链管理
     */
    FRIEND_ADD("添加好友", "v4/sns/friend_add"),
    FRIEND_IMPORT("导入好友", "v4/sns/friend_import"),
    FRIEND_UPDATE("更新好友", "v4/sns/friend_update"),
    FRIEND_DELETE("删除好友", "v4/sns/friend_delete"),
    FRIEND_DELETE_ALL("删除所有好友", "v4/sns/friend_delete_all"),
    FRIEND_CHECK("校验好友", "v4/sns/friend_check"),
    FRIEND_GET("拉取好友", "v4/sns/friend_get"),
    FRIEND_GET_LIST("拉取指定好友", "v4/sns/friend_get_list"),
    BLACK_LIST_ADD("添加黑名单", "v4/sns/black_list_add"),
    BLACK_LIST_DELETE("删除黑名单", "v4/sns/black_list_delete"),
    BLACK_LIST_GET("拉取黑名单", "v4/sns/black_list_get"),
    BLACK_LIST_CHECK("校验黑名单", "v4/sns/black_list_check"),
    GROUP_ADD("添加分组", "v4/sns/group_add"),
    GROUP_DELETE("删除分组", "v4/sns/group_delete"),
    GROUP_GET("拉取分组", "v4/sns/group_get"),

    /**
     * 最近联系人
     */
    CONTACT_GET_LIST("拉取会话列表", "v4/recentcontact/get_list"),
    CONTACT_DELETE("删除单个会话", "v4/recentcontact/delete"),
    CREATE_CONTACT_GROUP("创建会话分组数据", "v4/recentcontact/create_contact_group"),
    DEL_CONTACT_GROUP("删除会话分组数据", "v4/recentcontact/del_contact_group"),
    UPDATE_CONTACT_GROUP("更新会话分组数据", "v4/recentcontact/update_contact_group"),
    SEARCH_CONTACT_GROUP("搜索会话分组标记数据", "v4/recentcontact/search_contact_group"),
    MARK_CONTACT("创建或更新会话标记数据", "v4/recentcontact/mark_contact"),
    GET_CONTACT_GROUP("拉取会话分组标记数据", "v4/recentcontact/get_contact_group"),

    /**
     * 群组管理
     */
    GET_APPID_GROUP_LIST("获取APP中的所有群组", "v4/group_open_http_svc/get_appid_group_list"),
    CREATE_GROUP("创建群组", "v4/group_open_http_svc/create_group"),
    GET_GROUP_INFO("获取群详细资料", "v4/group_open_http_svc/get_group_info"),
    GET_GROUP_MEMBER_INFO("获取群成员详细资料", "v4/group_open_http_svc/get_group_member_info"),
    MODIFY_GROUP_BASE_INFO("修改群基础资料", "v4/group_open_http_svc/modify_group_base_info"),
    ADD_GROUP_MEMBER("增加群成员", "v4/group_open_http_svc/add_group_member"),
    DELETE_GROUP_MEMBER("删除群成员", "v4/group_open_http_svc/delete_group_member"),
    MODIFY_GROUP_MEMBER_INFO("修改群成员资料", "v4/group_open_http_svc/modify_group_member_info"),
    DESTROY_GROUP("解散群组", "v4/group_open_http_svc/destroy_group "),
    GET_JOINED_GROUP_LIST("获取用户所加入的群组", "v4/group_open_http_svc/get_joined_group_list"),
    GET_ROLE_IN_GROUP("查询用户在群组中的身份", "v4/group_open_http_svc/get_role_in_group"),
    FORBID_SEND_MSG("批量禁言和取消禁言", "v4/group_open_http_svc/forbid_send_msg"),
    GET_GROUP_MUTED_ACCOUNT("获取被禁言群成员列表", "v4/group_open_http_svc/get_group_muted_account"),
    SEND_GROUP_MSG("在群组中发送普通消息", "v4/group_open_http_svc/send_group_msg"),
    SEND_GROUP_SYSTEM_NOTIFICATION("在群组中发送系统通知", "v4/group_open_http_svc/send_group_system_notification"),
    GROUP_MSG_RECALL("撤回群消息", "v4/group_open_http_svc/group_msg_recall"),
    CHANGE_GROUP_OWNER("转让群主", "v4/group_open_http_svc/change_group_owner"),
    IMPORT_GROUP("导入群基础资料", "v4/group_open_http_svc/import_group"),
    IMPORT_GROUP_MSG("导入群消息", "v4/group_open_http_svc/import_group_msg "),
    IMPORT_GROUP_MEMBER("导入群成员", "v4/group_open_http_svc/import_group_member"),
    SET_UNREAD_MSG_NUM("设置成员未读消息计数", "v4/group_open_http_svc/set_unread_msg_num"),
    DELETE_GROUP_MSG_BY_SENDER("删除指定用户发送的消息", "v4/group_open_http_svc/delete_group_msg_by_sender"),
    GROUP_MSG_GET_SIMPLE("拉取群历史消息", "v4/group_open_http_svc/group_msg_get_simple"),
    GET_ONLINE_MEMBER_NUM("获取直播群在线人数", "v4/group_open_http_svc/get_online_member_num"),
    GET_MEMBERS("获取直播群在线成员列表", "v4/group_open_avchatroom_http_svc/get_members"),
    MODIFY_USER_INFO("设置直播群成员标记", "v4/group_open_avchatroom_http_svc/modify_user_info"),
    GET_GROUP_ATTR("获取群自定义属性", "v4/group_open_attr_http_svc/get_group_attr"),
    GET_GROUP_BAN_MEMBER("获取封禁群成员列表", "v4/group_open_http_svc/get_group_ban_member"),
    BAN_GROUP_MEMBER("群成员封禁", "v4/group_open_http_svc/ban_group_member"),
    UNBAN_GROUP_MEMBER("群成员解封", "v4/group_open_http_svc/unban_group_member"),
    MODIFY_GROUP_ATTR("修改群自定义属性", "v4/group_open_http_svc/modify_group_attr"),
    CLEAR_GROUP_ATTR("清空群自定义属性", "v4/group_open_http_svc/clear_group_attr"),
    SET_GROUP_ATTR("重置群自定义属性", "v4/group_open_http_svc/set_group_attr"),
    MODIFY_GROUP_MSG("修改群聊历史消息", "v4/openim/modify_group_msg"),
    SEND_BROADCAST_MSG("直播群广播消息", "v4/group_open_http_svc/send_broadcast_msg"),
    GET_GROUP_COUNTER("获取群计数器", "v4/group_open_http_svc/get_group_counter"),
    UPDATE_GROUP_COUNTER("更新群计数器", "v4/group_open_http_svc/update_group_counter"),
    DELETE_GROUP_COUNTER("删除群计数器", "v4/group_open_http_svc/delete_group_counter"),

    /**
     * 全局禁言管理
     */
    SET_NO_SPEAKING("设置全局禁言", " v4/openconfigsvr/setnospeaking"),
    GET_NO_SPEAKING("查询全局禁言", " v4/openconfigsvr/getnospeaking"),

    /**
     * 运营管理
     */
    GET_APP_INFO("拉取运营数据", "v4/openconfigsvr/getappinfo"),
    GET_HISTORY("下载消息记录", "v4/open_msg_svc/get_history"),
    GET_IP_LIST("获取服务器IP地址", "v4/ConfigSvc/GetIPList"),
    FORBID_ILLEGAL_OBJECT("聊天文件封禁", "v4/im_cos_msg/forbid_illegal_object"),
    ALLOW_BANNED_OBJECT("聊天文件解封", "v4/im_cos_msg/allow_banned_object"),
    GET_COS_SIG("聊天文件签名", "v4/im_cos_msg/get_cos_sig");

    private final String description;

    private final String url;

    TencentCloudImApiEnum(String description, String url) {
        this.description = description;
        this.url = url;
    }

    public String description() {
        return description;
    }

    public String getUrl() {
        return url;
    }
}

        第五步:基础API封装

@Slf4j
@Component
public class TencentCloudImUtil {
    private static final String HTTPS_URL_PREFIX = "https://console.tim.qq.com/";
    private static final String APP_MANAGER = "administrator";
    private static final String REDIS_IM_USER_SIG = "silence:im_user_sig:";

    @Value("${king.IMConfig.sdkAppId}")
    private long sdkAppId;
    @Value("${king.IMConfig.secretKey}")
    private String secretKey;

    @Autowired
    private Cache cache;

    /**
     * 获取腾讯云用户签名
     */
    public String getTxCloudUserSig() {
        String userSig = (String) cache.get(REDIS_IM_USER_SIG + APP_MANAGER);
        if (StringUtils.isEmpty(userSig)) {
            TLSSigAPIv2 tlsSigApi = new TLSSigAPIv2(sdkAppId, secretKey);
            userSig = tlsSigApi.genUserSig(APP_MANAGER, 86400);
            cache.put(REDIS_IM_USER_SIG + APP_MANAGER, userSig, 86400L);
        }
        return userSig;
    }

    /**
     * 获取腾讯im请求路径
     */
    private String getHttpsUrl(String imServiceApi, Integer random) {
        return String.format("%s%s?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json",
                HTTPS_URL_PREFIX, imServiceApi, sdkAppId, APP_MANAGER, this.getTxCloudUserSig(), random);
    }

    /**
     * 导入单个账号
     * @param userId 用户id
     */
    public void accountImport(String userId) {
        accountImport(userId, null);
    }

    public void accountImport(String userId, String userName) {
        accountImport(userId, userName, null);
    }

    public void accountImport(String userId, String userName, String faceUrl) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.ACCOUNT_IMPORT.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Identifier", userId);
        if (StringUtils.isNotEmpty(userName)) {
            jsonObject.put("Nick", userName);
        }
        if (StringUtils.isNotEmpty(faceUrl)) {
            jsonObject.put("FaceUrl", faceUrl);
        }
        log.info("腾讯云im导入单个账号,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im导入单个账号,返回结果:{}", result);
    }

    /**
     * 导入多个账号
     * @param userIds 用户id集合
     */
    public void multiAccountImport(List<String> userIds) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.MULTI_ACCOUNT_IMPORT.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Accounts", userIds);
        log.info("腾讯云im导入多个账号,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im导入单个账户,返回结果:{}", result);
    }

    /**
     * 批量删除账号
     * @param userIds 用户id集合
     */
    public void accountDeleteBatch(List<String> userIds) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.ACCOUNT_DELETE.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("DeleteItem", getUserIdJsonList(userIds));
        log.info("腾讯云im删除账号,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im删除账户,返回结果:{}", result);
    }

    /**
     * 查询账号是否已经导入im
     * @param userIds 用户id集合
     */
    public String accountCheck(List<String> userIds) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.ACCOUNT_CHECK.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("CheckItem", getUserIdJsonList(userIds));
        log.info("腾讯云im查询账号,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im查询账号,返回结果:{}", result);
        return result;
    }

    private List<JSONObject> getUserIdJsonList(List<String> userIds) {
        return userIds.stream().map(v -> {
            JSONObject userIdJson = new JSONObject();
            userIdJson.put("UserID", v);
            return userIdJson;
        }).collect(Collectors.toList());
    }

    /**
     * 单发单聊消息
     * @param syncOtherMachine 是否同步消息到发送方(1-同步,2-不同步)
     * @param fromUserId 发送方用户id
     * @param toUserId 接收方用户id
     * @param msgType 消息对象类型
     * @param msgContent 消息内容
     */
    public String sendMsg(Integer syncOtherMachine, String fromUserId, String toUserId, String msgType, String msgContent) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.SEND_MSG.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("SyncOtherMachine", syncOtherMachine);
        if (StringUtils.isNotEmpty(fromUserId)) {
            // 发送方不为空表示指定发送用户,为空表示为管理员发送消息
            jsonObject.put("From_Account", fromUserId);
        }
        jsonObject.put("To_Account", toUserId);
        jsonObject.put("MsgRandom", random);
        List<JSONObject> msgBody = getMsgBody(msgType, msgContent);
        jsonObject.put("MsgBody", msgBody);
        log.info("腾讯云im单发单聊消息,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im单发单聊消息,返回结果:{}", result);
        return result;
    }

    /**
     * 批量发单聊消息
     * @param syncOtherMachine 是否同步消息到发送方(1-同步,2-不同步)
     * @param fromUserId 发送方用户id
     * @param toUserIds 接收方用户id集合
     * @param msgType 消息对象类型
     * @param msgContent 消息内容
     */
    public String batchSendMsg(Integer syncOtherMachine, String fromUserId, List<String> toUserIds, String msgType, String msgContent) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.BATCH_SEND_MSG.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("SyncOtherMachine", syncOtherMachine);
        if (StringUtils.isNotEmpty(fromUserId)) {
            // 发送方不为空表示指定发送用户,为空表示为管理员发送消息
            jsonObject.put("From_Account", fromUserId);
        }
        jsonObject.put("To_Account", toUserIds);
        jsonObject.put("MsgRandom", random);
        List<JSONObject> msgBody = getMsgBody(msgType, msgContent);
        jsonObject.put("MsgBody", msgBody);
        log.info("腾讯云im批量发单聊消息,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im批量发单聊消息,返回结果:{}", result);
        return result;
    }


    /**
     * 拼接发送消息内容
     * @param msgType 消息类型
     * @param msgContent 发送消息内容
     * @return 消息内容
     */
    private List<JSONObject> getMsgBody(String msgType, String msgContent) {
        List<JSONObject> msgBody = new ArrayList<>();
        if (msgType.equals(TencentCloudImConstant.TIM_TEXT_ELEM)) {
            // 文本类型
            JSONObject msgBodyJson = new JSONObject();
            msgBodyJson.put("MsgType", msgType);
            JSONObject msgContentObj = new JSONObject();
            msgContentObj.put("Text", msgContent);
            msgBodyJson.put("MsgContent", msgContentObj);
            msgBody.add(msgBodyJson);
        }
        return msgBody;
    }

    /**
     * 查询单聊消息
     * @param fromUserId 发送方用户id
     * @param toUserId 接收方用户id
     * @param maxCnt 查询条数
     * @param startTime 起始时间(单位:秒)
     * @param endTime 结束时间(单位:秒)
     * @param lastMsgKey 最后一条消息的 MsgKey
     * @return 单聊消息列表
     */
    public String adminGetRoamMsg(String fromUserId, String toUserId, Integer maxCnt, Long startTime, Long endTime, String lastMsgKey) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.ADMIN_GET_ROAM_MSG.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("From_Account", fromUserId);
        jsonObject.put("To_Account", toUserId);
        jsonObject.put("MaxCnt", maxCnt);
        jsonObject.put("MinTime", startTime);
        jsonObject.put("MaxTime", endTime);
        if (StringUtils.isNotEmpty(lastMsgKey)){
            jsonObject.put("LastMsgKey", lastMsgKey);
        }
        log.info("腾讯云im查询单聊消息,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im查询单聊消息,返回结果:{}", result);
        return result;
    }

    /**
     * 撤回单聊消息
     * @param fromUserId 发送方用户id
     * @param toUserId 接收方用户id
     * @param msgKey MsgKey
     */
    public void adminMsgWithDraw(String fromUserId, String toUserId, String msgKey) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.ADMIN_MSG_WITH_DRAW.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("From_Account", fromUserId);
        jsonObject.put("To_Account", toUserId);
        jsonObject.put("MsgKey", msgKey);
        log.info("腾讯云im撤回单聊消息,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im撤回单聊消息,返回结果:{}", result);
    }

    /**
     * 设置单聊消息已读
     * @param reportUserId 读取消息的用户
     * @param peerUserId 发送消息的用户
     */
    public void adminSetMsgRead(String reportUserId, String peerUserId) {
        Integer random = RandomUtils.nextInt(0, 999999999);
        String httpsUrl = getHttpsUrl(TencentCloudImApiEnum.ADMIN_SET_MSG_READ.getUrl(), random);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Report_Account", reportUserId);
        jsonObject.put("Peer_Account", peerUserId);
        log.info("腾讯云im设置单聊消息已读,请求参数:{}", jsonObject.toString());
        String result = HttpClientUtils.doPost(httpsUrl, jsonObject);
        log.info("腾讯云im设置单聊消息已读,返回结果:{}", result);
    }
}

        到这一步已经差不多了,可以愉快的开始开发了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐