wecloud-im 前端Websocket对接文档

文档描述

本项目有两个文档: websocket对接文档 和 HTTP协议的API文档

本文档为websocket对接文档

HTTP协议的API以Swagger实时生成为准

 

HTTP协议API文档

Swagge文档地址:

本地环境 api文档(实时更新 开发查看此文档): IP可能有变化 联系后端

账号密码admin admin

测试外网 api文档:

只包含api接口文档 websocket对接说明在此文档中

适用对象

web端. 安卓端. ios端. flutter等一切支持websocket的语言

核心概念说明

clientId、用户和登录

即时通讯服务中的每一个终端称为一个「Client」。Client 拥有一个在应用内唯一标识自己的 ID(clientId)。这个 ID 由应用自己定义,必须是 由任意英文字母、数字、半角下划线与半角短横线组成,可以纯数字,不超过 64个字符的字符串组成。在大部分场合,Client 都可以对应到应用中的某个「用户」,但是并不是只有真的用户才能作为「Client」,你完全可以把一个探测器当成一个「Client」,把它收集到的数据通过即时通讯服务广播给更多「人」。

要使用即时通讯服务,每一个终端设备需要首先建立与即时通讯云服务端的 WebSocket 长连接,并使用唯一的 clientId 来加入即时通讯服务,我们把这一过程称为「登录」。请注意这里的登录仅仅指客户端登录即时通讯服务,与应用层面的用户账户注册登录是不一样的。

appKey与appSecret

appKey为应用在蔚可云的唯一标识, appSecret为安全密钥, 均由蔚可云控制台或联系客服下发,给应用接入方安全验证密钥,生产环境appSecret不建议保存在接入方前端客户端, appKey与appSecret总是成对出现和使用

生成sign签名

sign 由接入方后端生成, 进行加签的参数: MD5{timestamp + clientId + appKey + appSecret} timestamp:毫秒时间戳 clientId:由后端生成

在生产环境中,你需要自行部署服务器签发 sign

对话(Conversation)

用户登录之后,与其他人(client)进行消息沟通,即为开启了一个「对话(Conversation)」。在即时通讯服务中,「对话」包含了沟通的用户群体(成员),也是所有消息依托的媒介:消息都是由某一个 Client 发往一个「对话」。终端用户在开始聊天之前,需要先创建或者加入一个对话,然后再邀请其他人进来(可选),之后所有参与者在这个对话内进行交流。

已读/已接收

已接收为客户端接收到该消息,已经保存到本地缓存中,用户还未打开会话查看该条消息的情况. 服务器将不会再次下发已接收状态的离线消息,未接收的消息会在拉取离线消息时返回

已读为客户端已经查看该消息

ping / pong心跳机制

  1. 客户端接收到服务端下发"ping"字符串时, 必须立即回应"pong"字符串;
  1. 客户端可完善定时向服务端发起"ping"字符串,来保持websocket连接状态, 服务端会立即回应"pong"字符串,如果连续3次未及时响应"pong",即可认定websocket已经断开,进入重新连接流程;
  2. 建议客户端发"ping"间隔时间为5秒

 

客户端连接流程

wc_im_client连接流程-Page-1

  1. appKey, appSecret为蔚可云下发给客户方安全保护密钥,不建议保存在前端客户端;
  2. 第三方应用服务端需提供获取sign的接口, sign 由MD5{timestamp + clientId + appKey + appSecret},其中clientId由后端生成;
  3. 前端拿到sign后,调用验证sign接口进行获取token;
  4. websocket连接初始化需要带上token即可连接成功;
  5. sign 需要在你的应用服务端生成;

第三方应用后端生成sign接口示例

本文展示如何在服务端部署一个 sign 生成器。

java示例代码 ,供客户应用后端参考

第三方应用后端需要响应的参数:

连接WebSocket

ws://localhost:8899/ws?token=xxxxxx&platform=1

示例:

 

请求参数

字段名字段类型是否可空说明
tokenStringtoken
platformint设备平台类型: 1 安卓; 2 ios; 3 web

不同环境连接

本地环境

 

测试外网


 

生产环境

 

请求CMD指令说明

响应CMD指令说明

消息type说明

事件类型type

(xx表示为某客户端)

以上基础平台固定类型均使用负数,所有正数留给自定义扩展类型使用,0 作为「没有类型」被保留起来。

code错误码

websocket客户端请求参数说明

reqId 为每次客户端通过websocket通道发送请求的唯一request Id, 用来标识每次请求,方便定位问题,以及用于绑定服务端响应对此请求request id的数据.

websocket像服务端发送数据不同于http请求接口. http发送请求 会一个请求对应一个响应,客户端接收也知道该响应数据是针对哪个请求的.

websocket是异步的 有可能你很快速的发送了几条消息,服务器响应的数据不一定是按你发送的消息顺序响应, 所以你每个请求要自己定一个id, 服务器就算乱序响应数据,客户端也能知道响应的数据对应哪个请求

cmd 为请求指令

data 为数据,所有需要发送的数据都在此参数下

data内的参数: toConversation(会话id)与type(消息类型)为固定的,其它参数名与参数值皆可由使用方自定义

 

websocket服务器响应参数说明

reqId 一个请求唯一的id,服务端响应时,会将对应的id与数据一同返回

cmd 为响应指令

image-20210521104503728

消息收发流程

IM_client在线消息发送流程

IM_client在线消息接收流程

1. 客户端发送文本消息

示例一: 必传参数:

示例二: 全部可选参数:

参数描述

字段名字段类型是否可空说明
cmdString指令码
dataObject除toConversation与type为固定的参数,其它参数皆可由使用方自定义
attrsObject自定义拓展字段
toConversationLong发送到会话id
diyParam自定义字段Object自定义拓展字段
pushString客户端自定义系统推送内容

2. 服务端响应给发送者

参数描述

字段名字段类型是否可空说明
cmdString指令码
msgIdString消息唯一ID

3. 接收方收到在线消息

参数描述

字段名字段类型是否可空说明
cmdString指令码
dataObject除toConversation与type为固定的参数,其它参数皆可由使用方自定义
attrsObject自定义拓展字段
toConversationLong发送到会话id
diyParam自定义字段Object自定义拓展字段
pushString客户端自定义系统推送内容
senderString发送方
withdrawTimetime撤回时间戳
createTimetime消息发送时间戳
atString提到了其他客户端,以英文逗号分开
withdrawBoolean是否撤回
eventBoolean是否为事件类型
withdrawBoolean是否撤回
systemBoolean是否为系统消息

4.接收方收到,需要回执

已接收回执需参考API对接文档

发送图片

上面是完整的例子,如果只想简单的发送图像 URL:

其他富媒体消息

如视频 位置 音频 发送红包 好友验证等等

可参考:https://leancloud.cn/docs/realtime_v2.html#hash939050100

 

客户端在线接收事件类型消息

事件类型type (xx表示为某客户端)

服务端在线下发 某消息已接收状态

receiverId:接收方客户端id

conversationId:会话id

type为-1009 : 某消息已接收状态

msgId: 消息id;

该event事件消息类型不需要已读和已接收回执,不会保存进离线,仅下发给当前在线会话客户端.

参数描述

字段名字段类型是否可空说明
cmdString指令码
conversationIdLong会话id
senderString发送方
createTimetime消息发送时间戳
eventBoolean是否为事件类型

服务端在线下发 某消息已读状态

receiverId:接收方客户端id

conversationId:会话id

type为-1010 : 某消息已读状态

msgId: 消息id;

该event事件消息类型不需要回执,不会保存进离线,仅下发给当前在线会话客户端.

参数描述

字段名字段类型是否可空说明
cmdString指令码
conversationIdLong会话id
senderString发送方
createTimetime消息发送时间戳
eventBoolean是否为事件类型