Skip to content

WuKongIM JSON-RPC 协议文档

概述

本文档描述了 WuKongIM 使用 JSON-RPC 2.0 规范进行通信的协议格式。所有请求、响应和通知都遵循 JSON-RPC 2.0 标准结构。

  • jsonrpc: 可选 字符串,固定为 "2.0"。如果省略,服务器应假定其为 "2.0"。
  • method: 请求或通知的方法名。
  • params: 请求或通知的参数,通常是一个对象。
  • id: 请求的唯一标识符(字符串类型)。响应必须包含与请求相同的 id。通知没有 id。
  • result: 成功响应的结果数据。
  • error: 错误响应的错误对象。

注意事项

  1. 建立Websocket连接后,需要在2秒之内进行认证(connect),超过2秒或者认证失败的连接将断开

  2. 发送错误的数据格式或系统不支持的method方法,系统都将断开连接

通用组件

以下是一些在多个消息类型中复用的组件定义:

ErrorObject

当请求处理失败时,响应中会包含此对象。

字段类型必填描述
codeinteger错误码
messagestring错误描述
dataany附加错误数据

可选的消息头信息。

字段类型必填描述
noPersistboolean消息是否不存储
redDotboolean是否显示红点
syncOnceboolean是否只被同步一次
dupboolean是否是重发的消息

SettingFlags

消息设置标记位。

字段类型必填描述
receiptboolean消息已读回执
streamboolean是否为流式消息
topicboolean是否包含 Topic

消息类型详解

1. 连接 (Connect)

Connect Request (connect)

客户端发起的第一个请求,用于建立连接和认证。

参数 (params)

字段类型必填描述
uidstring用户ID
tokenstring认证Token
headerHeader消息头
versioninteger客户端协议版本
clientKeystring客户端公钥
deviceIdstring设备ID
deviceFlaginteger设备标识 (1:APP, 2:WEB...)
clientTimestampinteger客户端13位毫秒时间戳

最小示例

json
{
  "method": "connect",
  "params": {
    "uid": "testUser",
    "token": "testToken"
  },
  "id": "req-conn-1"
}

Connect Response

服务器对 connect 请求的响应。

成功结果 (result)

字段类型必填描述
serverKeystring服务端的DH公钥
saltstring加密盐值
timeDiffinteger客户端与服务器时间差(毫秒)
reasonCodeinteger原因码 (成功时通常为0)
headerHeader消息头
serverVersioninteger服务端版本
nodeIdinteger连接的节点ID (协议版本 >= 4)

错误结果 (error): 参考 ErrorObject

最小成功示例

json
{
  "result": {
    "serverKey": "serverPublicKey",
    "salt": "randomSalt",
    "timeDiff": -15,
    "reasonCode": 0
  },
  "id": "req-conn-1"
}

最小错误示例

json
{
  "error": {
    "code": 1001,
    "message": "Authentication Failed"
  },
  "id": "req-conn-1"
}

2. 发送消息 (Send)

Send Request (send)

客户端发送消息到指定频道。

参数 (params)

字段类型必填描述
clientMsgNostring客户端消息唯一编号(UUID)
channelIdstring频道ID
channelTypeinteger频道类型 (1:个人, 2:群组)
payloadobject消息内容 (业务自定义JSON对象)
headerHeader消息头
settingSettingFlags消息设置
msgKeystring消息验证Key
expireinteger消息过期时间(秒), 0表示不过期
streamNostring流编号 (如果 setting.stream 为 true)
topicstring消息 Topic (如果 setting.topic 为 true)

最小示例

json
{
  "method": "send",
  "params": {
    "clientMsgNo": "uuid-12345",
    "channelId": "targetUser",
    "channelType": 1,
    "payload": {"content": "Hello!","type":1}
  },
  "id": "req-send-1"
}

Send Response

服务器对 send 请求的响应,表示消息已收到并分配了服务端 ID。

成功结果 (result)

字段类型必填描述
messageIdstring服务端消息ID
messageSeqinteger服务端消息序列号
reasonCodeinteger原因码 (成功时通常为0)
headerHeader消息头

错误结果 (error): 参考 ErrorObject

最小成功示例

json
{
  "result": {
    "messageId": "serverMsgId1",
    "messageSeq": 1001,
    "reasonCode": 0
  },
  "id": "req-send-1"
}

3. 收到消息 (Recv)

Recv Notification (recv)

服务器推送消息给客户端。

参数 (params)

字段类型必填描述
messageIdstring服务端消息ID
messageSeqinteger服务端消息序列号
timestampinteger服务端消息时间戳(秒)
channelIdstring频道ID
channelTypeinteger频道类型
fromUidstring发送者UID
payloadobject消息内容 (业务自定义JSON对象)
headerHeader消息头
settingSettingFlags消息设置
msgKeystring消息验证Key
expireinteger消息过期时间(秒) (协议版本 >= 3)
clientMsgNostring客户端消息唯一编号 (用于去重)
streamNostring流编号 (协议版本 >= 2)
streamIdstring流序列号 (协议版本 >= 2)
streamFlaginteger流标记 (0:Start, 1:Ing, 2:End)
topicstring消息 Topic (如果 setting.topic 为 true)

最小示例

json
{
  "method": "recv",
  "params": {
    "messageId": "serverMsgId2",
    "messageSeq": 50,
    "timestamp": 1678886400,
    "channelId": "senderUser",
    "channelType": 1,
    "fromUid": "senderUser",
    "payload": {"content": "How are you?","type":1}
  }
}

4. 收到消息确认 (RecvAck)

RecvAck Request (recvack)

客户端确认收到某条消息。

参数 (params)

字段类型必填描述
messageIdstring要确认的服务端消息ID
messageSeqinteger要确认的服务端消息序列号
headerHeader消息头

最小示例

json
{
  "method": "recvack",
  "params": {
    "messageId": "serverMsgId2",
    "messageSeq": 50
  },
  "id": "req-ack-1"
}

(注:recvack 通常没有特定的响应体,如果需要响应,服务器可能会返回一个空的成功 result 或错误)

5. 订阅频道 (Subscribe)(暂不支持)

Subscribe Request (subscribe)

客户端请求订阅指定频道的消息。

参数 (params)

字段类型必填描述
subNostring订阅请求编号 (客户端生成)
channelIdstring要订阅的频道ID
channelTypeinteger频道类型
headerHeader消息头
settingSettingFlags消息设置
paramstring订阅参数 (可选)

最小示例

json
{
  "method": "subscribe",
  "params": {
    "subNo": "sub-req-1",
    "channelId": "group123",
    "channelType": 2
  },
  "id": "req-sub-1"
}

6. 取消订阅频道 (Unsubscribe)(暂不支持)

Unsubscribe Request (unsubscribe)

客户端请求取消订阅指定频道。

参数 (params)

字段类型必填描述
subNostring取消订阅请求编号 (客户端生成)
channelIdstring要取消订阅的频道ID
channelTypeinteger频道类型
headerHeader消息头
settingSettingFlags消息设置

最小示例

json
{
  "method": "unsubscribe",
  "params": {
    "subNo": "unsub-req-1",
    "channelId": "group123",
    "channelType": 2
  },
  "id": "req-unsub-1"
}

Subscription Response

服务器对 subscribeunsubscribe 请求的响应。

成功结果 (result)

字段类型必填描述
subNostring对应的请求编号
channelIdstring对应的频道ID
channelTypeinteger对应的频道类型
actioninteger动作 (0: Subscribe, 1: Unsubscribe)
reasonCodeinteger原因码 (成功时通常为0)
headerHeader消息头

错误结果 (error): 参考 ErrorObject

最小成功示例 (Subscribe)

json
{
  "result": {
    "subNo": "sub-req-1",
    "channelId": "group123",
    "channelType": 2,
    "action": 0,
    "reasonCode": 0
  },
  "id": "req-sub-1"
}

7. 心跳 (Ping/Pong)

Ping Request (ping)

客户端发送心跳以保持连接。

参数 (params): 通常为 null 或空对象 {}

最小示例

json
{
  "method": "ping",
  "id": "req-ping-1"
}

Pong Response

服务器对 ping 请求的响应。

成功结果 (result): 通常为 null 或空对象 {}错误结果 (error): 参考 ErrorObject

最小成功示例

json
{
  "method": "pong"
}

8. 断开连接 (Disconnect)(暂不支持)

Disconnect Request (disconnect)

客户端主动通知服务器断开连接。

参数 (params)

字段类型必填描述
reasonCodeinteger原因码
headerHeader消息头
reasonstring断开原因描述 (可选)

最小示例

json
{
  "method": "disconnect",
  "params": {
    "reasonCode": 0
  },
  "id": "req-disc-1"
}

(注:disconnect 请求通常不需要服务器响应)

Disconnect Notification (disconnect)

服务器通知客户端连接已断开(例如,被踢出)。

参数 (params)

字段类型必填描述
reasonCodeinteger原因码
headerHeader消息头
reasonstring断开原因描述 (可选)

最小示例

json
{
  "method": "disconnect",
  "params": {
    "reasonCode": 401,
    "reason": "Kicked by another device"
  }
}

本文档内容版权属于 上海信必达网络科技有限公司,保留所有权利