输入关键词搜索,支持 AI 答疑

1 对 1 娱乐社交消息抄送

更新时间: 2023/08/30 03:09:08

消息抄送是网易云信提供的消息同步服务,通过这一服务,云信服务器可以将 1 对 1 娱乐社交业务的消息或事件,通过发起 HTTP/HTTPS POST 请求实时同步给您的消息抄送服务器。您可以通过消息抄送服务实现礼物事件、安全通审核事件处理等功能。

技术原理

消息抄送原理.png

消息抄送的流程如下:

  1. 应用客户端通过云信服务端收发消息和事件通知等数据。
  2. 云信服务端向应用服务器发送 HTTP-POST 请求(用 JSON 格式body 来承载数据内容)。
  3. 请求通过后,应用服务器解析来自云信的 POST 请求获取相应的数据内容。
  4. 应用服务器向云信服务器返回状态码。

接收消息抄送的服务器,可以是您的应用服务器,也可以是第三方服务器。上图仅以指定应用服务器接收消息抄送作为示例。

使用前提

您需先前往云信控制台开通消息抄送服务,配置接收抄送的服务器地址和需要抄送的消息类型。

注意事项

  • 抄送的消息中,部分字段在某些场景下可能是空,请注意各字段的判空处理。
  • 抄送中会有时间戳标识事件发生的时间,推荐您参考抄送中的时间戳辅助业务逻辑实现。当同时触发多个抄送时,由于网络原因,抄送到达顺序可能是乱序的,例如先收到用户加入房间抄送,然后收到房间创建抄送,此时如果通过收到抄送消息的顺序实现业务逻辑,可能会出现错误。
  • 1 对 1 娱乐社交场景需要开通 IM 即时通讯和音视频通话 2.0 消息抄送,请注意:
    • 网易云信 IM 即时通讯产品和音视频通话 2.0 产品的消息抄送功能相互独立,不同产品中的事件消息抄送的 eventType 可能相同。
    • 需要在消息抄送回调的 header 中进行 type 字段的解析,且将 type 字段设为必传项。若 type=G2,表示该抄送为音视频通话 2.0 相关的消息抄送。若您未对 header 进行正确解析、未通过 type 字段区分 IM 和音视频通话 2.0 的抄送内容,可能会影响您对于消息抄送功能的使用

消息抄送回调格式

消息抄送请求的Content-Typeapplication/json,而非application/x-www-form-urlencoded,请注意区分解析方式。请求的 body 格式为 JSON。字符编码为 UTF-8。

请求头header 格式

在验证数据是否在传输过程中被篡改时,需要计算验证MD5值是否被修改,以及计算验证CheckSum

Header 参数
类型
说明
AppKey String 抄送事件所属的应用的 App Key
CurTime String 当前 UTC 时间戳,从1970 年 1 月 1 日 0 时 0 分 0 秒开始到现在的毫秒数
CheckSum String sha1(AppSecret + MD5 + CurTime),其中AppSecret 值为应用的AppSecret(请勿与AppKey混淆)
MD5 String 根据request body计算出来的值, 即MD5 = md5(request body)
type String 固定为 G2。表示音视频通话 2.0 相关的消息抄送。
IM 的消息抄送中不包含此字段。如果您同时开通了 IM 消息抄送和音视频通话消息抄送,且使用同一个抄送地址,应将处理逻辑中将 type 设为必传字段。

MD5 计算示例

javaString requestBody = "{}";
String MD5 = CheckSumBuilder.getMD5(requestBody); //参考 接口概述 -> API checksum校验 部分

CheckSum 计算示例

javaString AppSecret = "90u757h67n87"; //注意:此处是AppSecret,不是AppKey。
String MD5 = "9894907e4ad9de4678091277509361f7";
String CurTime = "1440570500855";  ////当前UTC时间戳,从1970年1月1日0点0 分0 秒开始到现在的毫秒数(String)
String CheckSum = CheckSumBuilder.getCheckSum(AppSecret, MD5, CurTime); //参考 接口概述 -> API checksum校验 部分

body 格式

请求 body 为 JSON 格式,公共字段如下:

字段 说明
eventType 消息抄送的事件类型。
data 抄送的消息体。

消息抄送示例

例如,预设接收消息的第三方服务器地址为 http://yunxinservice.com.cn/receiveMsg.action,网易云信向您的服务器发送的消息抄送示例如下:

httpPOST  /receiveMsg.action   HTTP/1.1
Host:  yunxinservice.com.cn
Content-Type:  application/json
AppKey: aasasasassaassa  
CurTime: 1440570500855    
MD5: *****************   
CheckSum: 001511********************
type: G2

{"eventType": 1,"data": {"channelId": 123,"channelName": "abc","creaetime": 1606974852379,"timestamp": 1606974852479}}

在本地服务器实现消息抄送的处理逻辑

实现说明

处理逻辑
说明
异步机制
  • 消息抄送的超时时间是5秒,如果在5秒内收到预设服务器返回HTTP 200HTTP 500状态码,则认为抄送成功,否则认为抄送失败。因此,如果您在接收到同步数据后,需要做比较耗时的操作(如数据库入库),那么需要在预设服务器接收抄送的接口实现异步机制(例如可以将消息先存到消息队列中),以免被网易云信判定为超时。
  • 如果有特殊需求不能丢弃同步数据,请通过云信官网首页提供的联系方式联系商务经理开通高保障抄送。开通后,如果抄送失败,网易云信服务端将会尝试重新抄送一定次数(目前最多 1000 次)。
  • 如果预设服务器接收消息抄送的接口在一段时间内持续无法响应,网易云信服务端支持最多缓存 50 万条消息。待接收接口恢复后,联系云信技术支持申请重新抄送。

去重机制 考虑到网络环境的不稳定,为了确保开发者的接收接口能收到抄送的消息,网易云信可能会重复发送同一条消息,建议您对所收到的消息与事件通知进行一定的去重操作
兜底机制 在问题故障等其他情况下,消息抄送可能不会及时返回,建议您在本地业务中考虑相关兜底策略。例如事件发生后 10 秒内,若未收到网易云信的消息抄送,可忽略抄送,继续其他业务流程。

示例代码

Nemo Server消息抄送相关处理逻辑,请参考 nemo 示例源码

   /**
     * TODO 注:仅为云信派对1v1娱乐社交demo处理逻辑
     *  在演示项目中rtc相关的数据都保存在Redis中, 线上业务处理需结合实际业务需求实现
     */
    public void handleRtcMsg(String body) {
        log.info("handleRtcMsg body: {}", body);
        try {
            JsonObject jsonObject = GsonUtil.parseJsonObject(body);
            Integer eventType = GsonUtil.getInt(jsonObject, "eventType");
            RtcNotifyEnum eventTypeEnum = RtcNotifyEnum.fromCode(eventType);
            if (eventTypeEnum == null) {
                log.info("handleRtcMsg eventType:{} not support", eventType);
                return;
            }
            JsonObject data = GsonUtil.getJsonObject(jsonObject, "data");
            switch (eventTypeEnum) {
                case EVENT_TYPE_ROOM_START: {
                    RtcRoomNotifyParam param = GsonUtil.fromJson(data, RtcRoomNotifyParam.class);
                    param.setStatus(RtcStatusEnum.START.getStatus());
                    oneToOneChatService.saveRtcRecord(param);
                    securityAuditService.submitSecurityAuditTask(param);
                    break;
                }
                case EVENT_TYPE_ROOM_END: {
                    RtcRoomNotifyParam param = GsonUtil.fromJson(data, RtcRoomNotifyParam.class);
                    param.setStatus(RtcStatusEnum.END.getStatus());
                    securityAuditService.stopSecurityAuditTask(param.getChannelId(), param.getChannelName());
                    break;
                }
                case EVENT_TYPE_ROOM_USER_IN: {
                    RtcRoomUserNotifyParam param = GsonUtil.fromJson(data, RtcRoomUserNotifyParam.class);
                    param.setStatus(RtcUserStatusEnum.IN_ROOM.getStatus());
                    oneToOneChatService.saveRtcUserRecord(param);
                    break;
                }
                case EVENT_TYPE_ROOM_USER_OUT: {
                    RtcRoomUserNotifyParam param = GsonUtil.fromJson(data, RtcRoomUserNotifyParam.class);
                    param.setStatus(RtcUserStatusEnum.LEAVE.getStatus());
                    oneToOneChatService.saveRtcUserRecord(param);
                    break;
                }
                case EVENT_TYPE_ROOM_SECURITY_AUDIT:
                    RtcAntispamDto rtcAntispamDto = RtcAntispamDto.build(data);
                    securityAuditService.antispamHandler(rtcAntispamDto);
                    break;
                default:
                    break;
            }
        } catch (BsException e) {
            log.warn(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

安全通审核事件

实时音视频安全审核结果抄送,其中包含抄送任务详情、审核结果、截图证据等信息,具体请参见实时音视频安全通审核抄送

此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 使用前提
  • 注意事项
  • 消息抄送回调格式
  • 请求头header 格式
  • body 格式
  • 消息抄送示例
  • 在本地服务器实现消息抄送的处理逻辑
  • 安全通审核事件