更新时间:2022-03-17
回调功能,即环信 IM 服务器会在事件发生之前或之后,向你的应用服务器发送请求,你可以根据业务需求来干预事件的后续处理流程(发送前回调),或据此进行必要的数据同步(发送后回调)。
一般发送前回调是对用户发送的消息内容的处理,发送后回调还包括送达回执和已读回执、群组或聊天室操作、好友关系操作和用户状态变化等事件,具体见 用户在线状态回调和发送后回调过滤规则设置。
设置消息内容回调的规则可以在环信即时通讯云控制台实现,如需单独设置特定类型不回调,请联系环信商务经理。
从处理角度看,回调分为以下两类:
环信 IM 服务器收到用户发送的上行单聊和群聊消息之后、将该消息下发给目标用户之前。
以下是使用发送前回调功能需要了解的前提条件,包括在高并发可用性的基础上的使用限制说明,请按照此限制正确使用回调。
配置说明 | 是否必填 | 内容 |
---|---|---|
规则名称 | 必填 | 填写文字,支持中英文,长度限制为 32 字符。 |
会话类型 | 必填 | * 单聊; * 群组; * 聊天室。 |
消息类型 | 必填 | 多选: 文本;图片;视频;位置;语音;文件;自定义消息。 |
等待响应时间 | 必填 | 后台判断超时时间,默认 200,单位为毫秒。 |
调用失败时默认策略 | 必填 | 当您的服务器返回结果异常或等待时间内未返回结果时,消息放行或不放行。 |
消息拦截报错时显示 | 必填 | 当消息被拦截时,是否通知发送者 SDK 消息发送失败: * 报错:通知发送者 SDK 消息发送失败,发送者会感知到消息发送失败; * 不报错:不通知发送者 SDK 消息发送失败,发送者无感知。 |
启用状态 | 必填 | 回调规则是否马上生效: * 启用:马上生效; * 不启用:暂不生效。(建议首次创建配置为“不启用”,等您的服务器配置好验证信息后再修改为“启用”) |
回调地址 | 必填 | 回调 URL,环信 IM 对 HTTP 和 HTTPS 的回调地址均支持。 |
规则说明:
从环信服务器向你的应用服务器发送请求。
请求采用 POST 方式,支持 HTTP/HTTPS,正文部分为 JSON 格式的字符串,字符集为 UTF-8。
请求 header
中包括以下字段:
字段名 | 值 |
---|---|
Content-Type | application/json |
参数 | 类型 |
---|---|
callId | callId 为 {appkey}_{uuid} ,其中 uuid 为随机生成,作为每条回调的唯一标识。 |
eventType | 有两种,chat_offline 离线消息,chat 上行消息。 |
timestamp | 环信 IM 服务器接收到此消息的时间戳。 |
chat_type | chat 单聊回调、groupchat 群聊回调包含了群组和聊天室的消息回调,默认全选。 |
group_id | 回调消息所在的群组。群聊消息回调才有此参数。 |
from | 消息的发送方。 |
to | 消息的接收方。 |
msg_id | 消息的 ID。 |
payload | 消息内容,与通过 REST API 发送过来的一致,查看消息格式文档。 |
securityVersion | 安全校验版本,目前为 1.0.0。忽略此参数,以后会改成 Console 后台做设置。 |
security | 签名,格式如下: MD5(callId+Secret+timestamp)。Secret 见 环信即时通讯云控制台回调规则。 |
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
valid | bool | 是 | 根据开发者自己服务器设定的规则判断消息是否合法。 |
code | String | 否 | 自定义信息,字符串类型。 |
payload | Object | 否 | 如果需要更改消息内容可以回传修改后的内容,不修改则无需传该内容。格式同传入的消息内容,目前仅支持文本的形式,并且消息大小不能超过 1K。 |
{
"callId":"easemob-demo#test_0990a64f-dp01-6c50-8696-cf3b48b20e7e",
"eventType":"chat_offline",
"timestamp":1600060847294,
"chat_type":"groupchat",
"group_id":"16934809238921545",
"from":"user1",
"to":"user2",
"msg_id":"8924312242322",
"payload":{
// 具体的消息内容
},
"securityVersion":"1.0.0",
"security":"2ca02c394bef9e7abc83958bcc3156d3"
}
{
"valid": true,
"code": "HX:10000",
"payload":{
// 具体的消息内容。
// 仅支持文本类型消息。
},
}
发送后回调经常用在 app 后台需要实现必要的数据同步的场景。比如:
注:如果您对聊天消息没有时效性需求,可以直接通过免费的聊天记录拉取 REST API 获取聊天记录,无需使用发送后回调。
以下是需要了解的发送后回调功能说明,包括在高并发可用性的基础上的使用限制说明,请按照此限制正确使用回调。
消息接收延时保障是 99.95% 的消息在 30s 内
。具体如下:
参数 | 说明 |
---|---|
规则名称 | 填写唯一的规则名称(不能用中文)。 |
消息类型 | 需要回调的类型,目前有两种消息类型可以回调(chat 为上行消息;chat_offline 为离线消息,可以同时选择) |
回调地址 | 环信 IM 服务器会把消息推送到指定的 URL 地址,支持针对不同类型的消息配置不同的 HTTP 和 HTTPS 回调地址。 |
Secret | (可选)默认情况下,环信 IM 服务器发给 URL(也就是您自己服务器的)的数据,签名时使用的密钥由环信 IM 服务器生成,可通过环信即时通讯 IM Console 管理后台查看。若要使用自定义密钥,可以联系环信商务经理。 |
这个消息跟通过 REST 导出聊天记录查询到的消息一致。比如:一个用户(u1)给另一个用户(u2)发送消息,那么就会产生一条 Chat 消息,与接收方是否在线无关。接收到的消息里面 from 为 u1,to 为 u2。一个用户(u1)给一个群(g1)发送消息,那么会产生一条 Chat 消息,接收到的消息里面 from 为 u1,to 为 g1,且返回值包含 group_id 字段。
App 可以根据这个消息做 APNS 推送等个性化的推广。例如:给一个用户发送消息,如果用户不在线,那么会产生一条离线消息。如果给一个群发送消息,那么群里有几个用户不在线,就会产生几条离线消息,那么这几条离线消息的 to 为接收消息用户的 ID,并不是群组 ID。
从环信服务器向你的应用服务器发送请求
请求采用 POST 方式,支持 HTTP/HTTPS,正文部分为 JSON 格式的字符串,字符集为 UTF-8。
回调时,会对发送的正文做 MD5 签名。 环信 IM 使用的 MD5 为 org.apache.commons.codec.digest.DigestUtils#md5Hex
。
app 的响应内容不能超过 1,000 个字符,否则环信服务器会认为是攻击,导致回调失败。
回调消息的参数说明
参数 | 类型 |
---|---|
callId | callId 为 {appkey}_{uuid} 其中 UUID 为随机生成,作为每条回调的唯一标识。 |
eventType | “chat” 上行消息、“chat_offline” 离线消息。 |
timestamp | 环信 IM 服务器接收到此消息的 Unix 时间戳,单位为毫秒。 |
chat_type | “chat” 单聊回调、“groupchat” 群聊回调包含了群组和聊天室的消息回调,默认全选。 |
group_id | 群聊时才有此参数,回调消息所在的群组。 |
from | 消息的发送方。 |
to | 消息的接收方。 |
msg_id | 消息的 ID。 |
payload | 消息内容,与通过 REST API 发送过来的一致,查看消息格式文档。 |
securityVersion | 安全校验版本,目前为 1.0.0。忽略此参数,以后会改成控制台做设置。 |
security | 签名,格式如下: MD5(callId+Secret+timestamp)。 Secret 见 Console 后台回调规则。 |
回调成功返回的示例
{
"callId":"easemob-demo#test_0990a64f-dp01-6c50-8696-cf3b48b20e7e",
"eventType":"chat_offline",
"timestamp":1600060847294,
"chat_type":"groupchat",
"group_id":"16934809238921545",
"from":"user1",
"to":"user2",
"msg_id":"8924312242322",
"payload":{
// 具体的消息内容。
},
"securityVersion":"1.0.0",
"security":"2ca02c394bef9e7abc83958bcc3156d3"
}
环信 IM 服务器不会验证响应的 response 内容,只要你的服务器给我们返回 HTTP 状态码是 200 即认为将消息回调成功。
查询回调存储详情和补发回调消息
查询 App Key 下由于异常(比如链接超时,响应超时,回调规则封禁等)回调失败时存储的消息和事件类型集合,按每十分钟一个 date key 存储,然后用户可以根据消息集合按需拉取。
环信即时通讯 RESTful API 要求 Bearer HTTP 认证。每次发送 HTTP 请求时,都必须在请求头部填入如下 Authorization 字段:
Authorization:Bearer ${YourAppToken}
为提高项目的安全性,使用 token(动态密钥)对即将登录即时通讯系统的用户进行鉴权。即时通讯 RESTful API 仅支持使用 App Token 的鉴权方式,详见使用 Token 鉴权。
方法:GET
接入点: /{orgName}/{appName}/callbacks/storage/info
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
orgName | String | 是 | 你在环信 IM 管理后台注册的组织唯一标识。 |
appName | String | 是 | 你在环信 IM 管理后台注册的 App 唯一标识 。 |
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | 是 | 鉴权 Token,管理员 Token(含)以上权限。 |
参数 | 类型 | 描述 |
---|---|---|
path | string | 请求路径。 |
uri | string | 请求路径的 URI。 |
timestamp | long | 环信 IM 服务器接收到此消息的 Unix 时间戳,单位为毫秒。 |
organization | string | 你在环信 IM 管理后台注册的组织唯一标识。 |
application | string | 你在环信 IM 管理后台注册的 App 唯一标识。 |
action | string | 请求方法。 |
duration | long | 请求耗时,单位为毫秒。 |
applicationName | string | 你在环信 IM 管理后台注册的 App 名称。 |
data | object | 响应数据内容。包括以下三个参数:date 、size 和 retry 。 |
date | String | 代表本次可以发送的补发的一个十分钟 date key,key 为十分钟的起点。 |
size | Int | 本时段消息数量。 |
retry | Int | 开发者已经重试补发的次数。考虑到补发也可能失败,服务器会继续存储。最开始是 0。 |
curl -X GET 'http://a1.easemob.com/easemob-demo/easeim/callbacks/storage/info' \
-H 'Authorization: Bearer {{token}}'
{
"path": "/callbacks",
"uri": "http://a1.easemob.com/easemob-demo/easeim/callbacks",
"timestamp": 1631193031254,
"organization": "easemob-demo",
"application": "8dfb1641-b6d8-450b-bbe9-d8d45a3be39f",
"action": "post",
"data": [
{
"date": "202109091440",
"size": 15,
"retry": 0
},
{
"date": "202109091450",
"size": 103,
"retry": 1
}
],
"duration": 153,
"applicationName": "easeim"
}
调用接口根据存储集合进行回调补发。
方法:POST
接入点: http://{host}/{orgName}/{appName}/callbacks/storage/retry
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
orgName | String | 是 | 你在环信 IM 管理后台注册的组织唯一标识。 |
appName | String | 是 | 你在环信 IM 管理后台注册的 App 唯一标识。 |
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Content-Type | String | 是 | application/json |
Authorization | String | 是 | 鉴权 App Token 的值。详见使用 token 鉴权。 |
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
date | String | 是 | 可以补发的一个十分钟 date key,key 为十分钟的起点。 |
retry | Int | 否 | 开发已重试的次数。考虑到补发也可能失败,服务器会继续存储。最开始是 0。 |
targetUrl | String | 否 | 补发消息的回调地址,如果为空,则使用原回调规则的回调地址。 |
参数 | 类型 | 描述 |
---|---|---|
path | String | 请求路径。 |
uri | String | 请求路径的 URI。 |
timestamp | long | 环信 IM 服务器接收到此消息的 Unix 时间戳,单位为毫秒。 |
organization | String | 你在环信 IM 管理后台注册的组织唯一标识。 |
application | String | 你在环信 IM 管理后台注册的 app 唯一标识。 |
action | String | 请求方法。 |
data | Bool | - success :成功; - failure :失败。 |
duration | long | 请求耗时,单位为毫秒。 |
retry | Int | 开发者已经重试补发的次数。考虑到补发也可能失败,服务器会继续存储。最开始是 0。 |
curl -X POST 'http://a1.easemob.com/easemob-demo/easeim/callback/storage/retry' \
-H 'Authorization: Bearer {{token}}' \
-H 'Content-Type: application/json' \
--data-raw '{
"date": "202108272230",
"retry": 0,
"targetUrl": "http://localhost:8000/test"
}'
{
"path": "/callbacks",
"uri": "http://a1.easemob.com/easemob-demo/easeim/callbacks",
"timestamp": 1631194031721,
"organization": "easemob-demo",
"application": "8dfb1641-b6d8-450b-bbe9-d8d45a3be39f",
"action": "post",
"data": "success",
"duration": 225,
"applicationName": "easeim"
}
状态码 | 描述 |
---|---|
200 | 请求成功。 |
400 | 请求参数错误,请根据返回提示检查。 |
401 | 用户权限错误。 |
403 | 服务未开通或权限不足。 |
429 | 单位时间内请求过多。 |
500 | 服务器内部错误。 |