From 605ae53ba86b08c5458c74ead7d01dcd8dbb0dd3 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Mon, 9 Dec 2024 18:39:17 +0800 Subject: [PATCH 1/2] modify RESTful API --- docs/document/server-side/message_download.md | 6 +++--- docs/document/server-side/message_import.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/document/server-side/message_download.md b/docs/document/server-side/message_download.md index d2dbd83ed..912d7ed7e 100644 --- a/docs/document/server-side/message_download.md +++ b/docs/document/server-side/message_download.md @@ -196,9 +196,9 @@ GET https://{host}/{org_name}/{app_name}/chatfiles/{file_uuid} 以下载图片为例: ```bash -# 将 替换为你在服务端生成的 App Token +# 将 替换为你的用户 token 或在服务端生成的 App Token -curl -X GET -H 'Accept: application/octet-stream' -H 'Authorization: Bearer ' -H 'share-secret: f0Vr-uyyEeiHpHmsu53XXXXXXXXZYgyLkdfsZ4xo2Z0cSBnB' 'https://XXXX/XXXX/XXXX/chatfiles/7f456bf0-XXXX-XXXX-b630-777db304f26c'-o /Users/test/easemob/image/image.JPG +curl -X GET -H 'Accept: application/octet-stream' -H 'Authorization: Bearer ' -H 'share-secret: f0Vr-uyyEeiHpHmsu53XXXXXXXXZYgyLkdfsZ4xo2Z0cSBnB' 'https://XXXX/XXXX/XXXX/chatfiles/7f456bf0-XXXX-XXXX-b630-777db304f26c'-o /Users/test/easemob/image/image.JPG ``` :::notice @@ -248,7 +248,7 @@ GET https://{host}/{org_name}/{app_name}/chatfiles/{file_uuid} | :-------------- | :----- | :--------------------- | :------------------ | | `Accept` | String | 否 | 内容类型。请填 `application/octet-stream`,表示下载二进制数据流格式的文件。 | | `Authorization` | String | 否 | App 管理员的鉴权 token,格式为 `Bearer YourAppToken`,其中 `Bearer` 为固定字符,后面为英文空格和获取到的 app token。 | -| `thumbnail` | Bool | 否 | 是否下载缩略图:
  • `true`:是,下载缩略图。
  • `false`:否,下载原文件。
若该参数为空,下载原文件。 | +| `thumbnail` | Bool | 否 | 是否下载缩略图:
  • `true`:是,下载缩略图。
  • (默认)`false`:否,下载原文件。
若该参数为空,下载原文件。 | | `share-secret` | String | 否 | 缩略图访问密钥。若上传图片时限制了访问(`restrict-access` 设置为 `true`),下载缩略图时则需要该访问密钥。成功上传图片后,从 [文件上传](#上传文件) 的响应 body 中获取该密钥。 | ### HTTP 响应 diff --git a/docs/document/server-side/message_import.md b/docs/document/server-side/message_import.md index 292358129..2283e1ab1 100644 --- a/docs/document/server-side/message_import.md +++ b/docs/document/server-side/message_import.md @@ -202,7 +202,7 @@ POST https://{host}/{org_name}/{app_name}/messages/chatgroups/import | `type` | String | 是 | 消息类型:
- `txt`:文本消息;
- `img`:图片消息;
- `audio`:语音消息;
- `video`:视频消息;
- `file`:文件消息;
- `loc`:位置消息;
- `cmd`:透传消息;
- `custom`:自定义消息。 | | `body` | JSON | 是 | 消息内容。 | | `ext` | JSON | 否 | 消息支持扩展字段,可添加自定义信息。例如,请求中的 "key1": "value1"。 | -| `is_ack_read` | Bool | 否 | 是否设置会话已读。
- `true`:是;
- `false`:否。
调用该接口导入消息后会生成对应的会话,若该字段为 `true`,则会话为已读状态,为 `false` 表示会话为未读状态。 | +| `is_ack_read` | Bool | 否 | 是否设置消息是否已读。
- `true`:是;
- `false`:否。 | | `msg_timestamp` | Long | 否 | 要导入的消息的时间戳,单位为毫秒。若不传该参数,环信服务器会将导入的消息的时间戳设置为当前时间。 | | `need_download` | Bool | 否 | 是否需要下载附件并上传到服务器。
- `true`:是。这种情况下,需确保附件地址可直接访问,没有访问权限的限制。
- (默认)`false`:否。 | From cc5624468936c0f4f6249e8a25c9303c5372bb68 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Tue, 10 Dec 2024 10:02:26 +0800 Subject: [PATCH 2/2] modify --- docs/.vuepress/sidebar/document.ts | 4 +- docs/README.md | 2 +- docs/document/android/releasenote.md | 4 +- docs/document/ios/releasenote.md | 2 +- docs/document/server-side/callback.md | 375 ------------------ .../server-side/callback_group_ban.md | 2 +- .../server-side/callback_group_block.md | 2 +- .../server-side/callback_group_room_admin.md | 2 +- .../callback_group_room_allowlist.md | 2 +- .../callback_group_room_announcement.md | 2 +- .../callback_group_room_blocklist.md | 2 +- .../server-side/callback_group_room_create.md | 2 +- .../server-side/callback_group_room_delete.md | 2 +- .../server-side/callback_group_room_info.md | 2 +- .../server-side/callback_group_room_join.md | 2 +- .../server-side/callback_group_room_leave.md | 2 +- .../server-side/callback_group_room_mute.md | 2 +- .../callback_group_room_muteall.md | 2 +- .../server-side/callback_group_room_owner.md | 2 +- .../server-side/callback_group_shared_file.md | 2 +- .../document/server-side/callback_overview.md | 58 +++ .../server-side/callback_postsending.md | 272 +++++++++++++ .../server-side/callback_presending.md | 104 +++++ .../server-side/callback_room_superadmin.md | 2 +- docs/private/im/uc_configure.md | 2 +- .../moderation/moderation_record_callback.md | 2 +- docs/product/pricing.md | 4 +- 27 files changed, 461 insertions(+), 400 deletions(-) delete mode 100644 docs/document/server-side/callback.md create mode 100644 docs/document/server-side/callback_overview.md create mode 100644 docs/document/server-side/callback_postsending.md create mode 100644 docs/document/server-side/callback_presending.md diff --git a/docs/.vuepress/sidebar/document.ts b/docs/.vuepress/sidebar/document.ts index 9062ab320..4ff03a56d 100644 --- a/docs/.vuepress/sidebar/document.ts +++ b/docs/.vuepress/sidebar/document.ts @@ -431,7 +431,9 @@ const documentSidebar = [ { text: '设置回调', children: [ - { text: '设置回调', link: 'callback.html' }, + { text: '回调概述', link: 'callback_overview.html' }, + { text: '发送前回调', link: 'callback_presending.html' }, + { text: '发送后回调', link: 'callback_postsending.html' }, { text: '发送后回调事件', collapsible: true, children: [ diff --git a/docs/README.md b/docs/README.md index bb9fc81fd..f89a7f0df 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1211,7 +1211,7 @@ projects: icon: /feature/others.svg contexts: - text: 回调 - link: /document/server-side/callback.html + link: /document/server-side/callback_overview.html - text: 错误码 desc: SDK 中的接口和 REST 接口调用或者回调中的错误码。 sdks: diff --git a/docs/document/android/releasenote.md b/docs/document/android/releasenote.md index b77686f53..a3e357891 100644 --- a/docs/document/android/releasenote.md +++ b/docs/document/android/releasenote.md @@ -46,7 +46,7 @@ ### 优化 -- [IM SDK] [发送前回调](/document/server-side/callback.html#_1、发送前回调)时修改的[消息扩展字段](/document/android/message_send_receive.html#使用消息扩展字段),会同步到发送方。 +- [IM SDK] [发送前回调](/document/server-side/callback_presending.html)时修改的[消息扩展字段](/document/android/message_send_receive.html#使用消息扩展字段),会同步到发送方。 - [IM SDK] 调用[删除服务端会话 API](conversation_delete.html#单向删除服务端会话及本地会话),成功后会删除本地会话。之前版本调用该接口可设置删除会话的本地消息,不能删除本地会话。 - [IM SDK] 适配 Android 15 的 16K page size。 - [IM SDK] 群组和聊天室操作的默认错误码提示由 `GROUP_MEMBERS_FULL`(604)和 `CHATROOM_MEMBERS_FULL`(704)调整为 `GROUP_PERMISSION_DENIED`(603)和 `CHATROOM_PERMISSION_DENIED`(703)。例如,群组普通成员设置群组管理员时,由于缺乏权限,会提示 603 错误。 @@ -551,7 +551,7 @@ - [IM SDK] 新增群组详情中群组禁用状态:[EMGroup#isDisabled()](https://sdkdocs.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1chat_1_1_e_m_group.html#acd072d7fc16e6ff89110173979ed318b) 属性,该属性需要开发者在服务端设置; - [IM SDK] 优化遇到连接问题时更新接入点的策略,增强可用性; -- [IM SDK] [发送前回调](/document/server-side/callback.html#_1、发送前回调):发送失败时返回给 app 用户的错误描述中增加你自定义的错误信息(即 [响应体参数](/document/server-side/callback.html#响应体参数) code 信息)。 +- [IM SDK] [发送前回调](/document/server-side/callback_presending.html):发送失败时返回给 app 用户的错误描述中增加你自定义的错误信息(即 [响应体参数](/document/server-side/callback_presending.html#响应-body) code 信息)。 - [IM SDK] 在 [EMError](https://sdkdocs.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1_e_m_error.html) 中新增错误码 1101:[EMError#PRESENCE_CANNOT_SUBSCRIBE_YOURSELF](https://sdkdocs.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1_e_m_error.html#abc9130b164d5cccb3559585ec38e8e99),用来提示用户不能订阅自己的在线状态。 ### 优化: diff --git a/docs/document/ios/releasenote.md b/docs/document/ios/releasenote.md index 39290eeb5..66624185b 100644 --- a/docs/document/ios/releasenote.md +++ b/docs/document/ios/releasenote.md @@ -75,7 +75,7 @@ end ### 优化 -- [IM SDK] [发送前回调](/document/server-side/callback.html#_1、发送前回调)时修改的[消息扩展字段](/document/android/message_send_receive.html#使用消息扩展字段),会同步到发送方。 +- [IM SDK] [发送前回调](/document/server-side/callback_presending.html)时修改的[消息扩展字段](/document/android/message_send_receive.html#使用消息扩展字段),会同步到发送方。 - [IM SDK] 调用[删除服务端会话 API](conversation_delete.html#单向删除服务端会话及其历史消息),成功后会删除本地会话。之前版本调用该接口可设置删除会话的本地消息,不能删除本地会话。 - [IM SDK] 群组和聊天室操作的默认错误码提示由 `EMErrorGroupMembersFull`(604)和 `EMErrorChatroomMembersFull`(704)调整为 `EMErrorGroupPermissionDenied`(603)和 `EMErrorChatroomPermissionDeniedD`(703)。例如,群组普通成员设置群组管理员时,由于缺乏权限,会提示 603 错误。 diff --git a/docs/document/server-side/callback.md b/docs/document/server-side/callback.md deleted file mode 100644 index 6850075d5..000000000 --- a/docs/document/server-side/callback.md +++ /dev/null @@ -1,375 +0,0 @@ -# 回调功能 - - - -回调功能,即环信 IM 服务器会在事件发生之前或之后,向你的应用服务器发送请求,你可以根据业务需求来干预事件的后续处理流程(发送前回调),或据此进行必要的数据同步(发送后回调)。 - -一般发送前回调是对用户发送的消息内容的处理,发送后回调还包括送达回执和已读回执、群组或聊天室操作、好友关系操作和用户状态变化等事件,详见发送后回调过滤规则设置。 - -设置消息内容回调的规则可以在环信即时通讯云控制台实现,如需单独设置特定类型不回调,请联系环信商务经理。 - -从处理角度看,回调分为以下两类: - -- 发送前回调:回调的主要目的在于让 app 后台可以干预该事件的处理逻辑,环信 IM 服务器会根据响应中的返回值确定后续处理流程; -- 发送后回调:回调的主要目的在于让 app 后台实现必要的数据同步,环信 IM 服务器忽略回调返回码。 - -## 1、发送前回调 - -### 技术原理 - -**发送前回调只对客户端发送的消息有效,不包含 REST API 发送的消息。** - -应用服务器可以通过发送前回调实时监控用户的聊天消息,对消息进行处理,例如,拦截用户的消息请求。可拦截所有类型的消息,包含文本、图片、自定义消息等; - -![](/images/server-side/im-callback.jpeg) - -### 回调发生时间 - -环信 IM 服务器收到用户发送的上行单聊和群聊消息之后、将该消息下发给目标用户之前。 - -### 前提条件 - -以下是使用发送前回调功能需要了解的前提条件,包括在高并发可用性的基础上的使用限制说明,请按照此限制正确使用回调。 - -- 回调的方向是环信 IM 服务器向应用服务器发起 HTTP/HTTPS POST 请求。 -- 若同时设置了消息发送前和发送后两种回调,且消息发送前回调返回拒绝,则消息发送后回调将不会被触发。 -- 对同一个 app,可以针对不同类型的消息(“TEXT”,“IMAGE”,“VIDEO”,“LOCATION”,“VOICE” 和 ”FILE”)做配置;规则支持选择两种以上消息类型同时回调至一个指定服务器地址,接收到消息后,你可以区分消息的类型以便进行分类处理。详见 [消息管理 REST API](message_single.html)。 -- 环信 IM 服务器执行发送前回调后,如果你的应用服务器没有返回 valid 状态或者未收到应答包,该条消息会根据默认设置(console 后台发送前回调中 ”调用失败时默认策略”)处理,不会重试;后续消息依然正常执行回调。 -- 消息发送到你的应用服务器后,应用服务器需返回 HTTP 响应码 200 和 valid 属性,根据 valid 状态决定是否进行下发。 - -### 实现步骤 - -1. 在管理后台开通消息回调服务。 -2. [在环信控制台配置发送前回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 从环信服务器向你的应用服务器发送请求。 - -请求采用 POST 方式,支持 `HTTP/HTTPS`,正文部分为 JSON 格式的字符串,字符集为 UTF-8。 - -#### 请求 header - -| 字段名 | 值 | -| :------------- | :---------------------------------- | -| `Content-Type` | 内容类型,请填 `application/json`。 | - -#### 请求 body - -| 参数 | 类型 | -| :---------------- | :--------------------------------------- | -| `callId` | `callId` 为 `{appkey}_{uuid}`,其中 `uuid` 为随机生成,作为每条回调的唯一标识。 | -| `timestamp` | 环信 IM 服务器接收到此消息的时间戳。 | -| `chat_type` | 聊天类型:`chat` 为单聊,`group` 为群组聊天,`chatroom` 为聊天室。| -| `group_id` | 回调消息所在的群组或聊天室。该参数仅对群组聊天或聊天室中的消息回调生效。 | -| `from` | 消息的发送方。 | -| `to` | 消息的接收方。单聊为消息接收方,群组聊天和聊天室为群组 ID 和聊天室 ID。 | -| `msg_id` | 消息的 ID。 | -| `payload` | 消息内容,与通过 REST API 发送过来的一致,查看 [消息格式文档](message_historical.html#历史消息记录的内容)。 | -| `securityVersion` | 安全校验版本,目前为 1.0.0。忽略此参数,以后会改成 Console 后台做设置。 | -| `security` | 签名,格式如下: MD5(callId+Secret+timestamp)。Secret 见 [环信即时通讯云控制台](https://console.easemob.com/user/login)回调规则。 | - -#### 响应 body - -响应内容不能超过 1,000 个字符,否则环信服务器会认为是攻击,导致回调失败。 - -| 参数 | 类型 | 是否必需
| 描述 | -| :-------- | :----- | :----------------- | :----------- | -| `valid` | bool | 是 | 根据开发者自己服务器设定的规则判断消息是否合法:
- `true` :消息合法,环信服务器应下发该消息;`false` :消息非法,环信服务器应拦截该消息。| -| `code` | String | 否 | 客户端上报的自定义发送前回调错误。环信控制台上的**发送前回调**页面中的**消息拦截报错时显示**设置为**报错** 时,该 `code` 的内容为客户端提示的错误。错误分为以下几种情况:
- 若 `code` 的内容为字符串类型,客户端上的错误为该参数的内容;
- 响应中不包含 `code` 字段, 客户端提示 `custom logic denied`;
- 若 `code` 为空字符串,移动客户端提示 `Message blocked by external logic` 错误;
- 若在指定时间内未收到应答包,则按默认配置处理,客户端提示 `custom internal error` 错误;
- 如果返回的应答包出现错误,包括缺少必填字段 `valid` 或字段类型不符合约定类型,客户端提示 `custom internal error` 错误。| -| `payload` | Object | 否 | 修改后的消息内容。若无需修改消息内容,**请勿传该参数**。
若需要更改消息内容可以回传修改后的内容,格式同传入的消息内容。目前仅支持文本的形式,并且消息大小不能超过 1 KB。如果需要支持修改其他类型的消息,需要联系商务配置。 | - -### 示例 - -#### 请求示例 - -```shell -{ - "callId":"easemob-demo#test_0990a64f-dp01-6c50-8696-cf3b48b20e7e", - "timestamp":1600060847294, - "chat_type":"groupchat", - "group_id":"16934809238921545", - "from":"user1", - "to":"user2", - "msg_id":"8924312242322", - "payload":{ - // 具体的消息内容 - }, - "securityVersion":"1.0.0", - "security":"2ca02c394bef9e7abc83958bcc3156d3" -} -``` - -#### 响应示例 - -```json -{ - "valid": true, - "code": "HX:10000", - "payload": { - // 具体的消息内容。 - // 仅支持文本类型消息。 - } -} -``` - -## 2、发送后回调 - -### 技术原理 - -发送后回调经常用在 app 后台需要实现必要的数据同步的场景。比如: - -- 针对客户消息的内容进行自动回复; -- 在你的应用服务器端及时保存聊天历史记录或者离线消息。 - -:::notice -如果您对聊天消息没有时效性需求,可以直接通过免费的 [聊天记录拉取 REST API](message_historical.html#历史消息记录的内容) 获取聊天记录,无需使用发送后回调。 -::: - -![](/images/server-side/im-callback1.png) - -### 前提条件 - -以下是需要了解的发送后回调功能说明,包括在高并发可用性的基础上的使用限制说明,请按照此限制正确使用回调。 - -- 消息回调属于增值服务,需要开通相应版本后才能使用,详见 [环信即时通讯 IM 价格](https://www.easemob.com/pricing/im)。 -- 消息回调规则设置成功即可正常使用。最多支持 4 个回调规则(包含发送前回调和发送后回调),如果需要提升回调规则数量上限,需要联系商务经理开通。 -- 发送后回调范围,所有聊天消息有效(包含通过 SDK 和 REST API 发送的消息),包含单聊/群聊;如果 app 开通了反垃圾/敏感词过滤,被识别的消息会在服务器被拦截并禁止发送,将不会回调。 -- 发送后回调接收延时,是指消息服务器接收到客户端聊天消息、再将消息成功回调至客户指定服务器地址的时间间隔。消息接收延时保障是 99.95% 的消息在 30s 内。 -- 发送后回调对同一个 app 可以针对不同类型的消息(聊天消息、离线消息和通过 REST API 发送的消息)进行配置,如果 app 同时需要聊天消息和离线消息两种消息,建议区分回调地址。当然,规则也可以把这两种消息同时回调至一个指定服务器地址,在接收到消息后,可以对 eventType 做判断,区分消息的类型。 -- **发送后回调重试,当环信服务器执行发出回调后,响应状态码非 200,则认为回调失败,然后立即重试,若再次失败,再记录一次失败;针对一条回调仅重试一次,重试失败后即丢弃。若开通了[补发回调存储信息功能](#补发回调存储信息接口描述),则将消息放入异常存储中。若 30 秒内累计 90 次失败,会封禁该 app 的回调规则。封禁规则为,24 小时内连续封禁计数最大为 5(若封禁次数超过 5 次,仍计为 5),首次封禁默认 5 分钟,后续封禁时间为封禁次数 * 5 分钟,即第一次封禁 5 分钟,第二次封禁 10 分钟,第三次封禁 15 分钟,第四次封禁 20 分钟,第五次封禁 25 分钟,后续封禁时间与第 5 次保持一致为 25 分钟。重试失败以及封禁期间的回调不会自动补录,可以下载历史消息记录自行补充。** -- 指定服务器收到回调消息后,向消息服务器发出响应内容不能超过 1,000 字符长度,如果连续发送超长的响应内容,会导致回调规则封禁,只能手动解除,需要用户手动重新设置。 -- 客户有特殊需求不能丢失回调消息的情况下,请联系环信商务经理开通回调异常缓存功能,并使用 [查询回调异常缓存](#查询回调储存详情接口描述) 和 [补发回调储存信息](#补发回调存储信息接口描述) 接口。 - -### 实现步骤 - -1. 配置发送后回调规则; -2. 从环信服务器向你的应用服务器发送请求; -3. 在不能丢失回调消息的情况下,请联系环信商务经理开通回调异常缓存功能后,进行回调异常缓存的查询和重新发送。 - -具体如下: - -1. 在[环信即时通讯云控制台](https://console.easemob.com/) [配置发送回回调规则](/product/enable_and_configure_IM.html#配置消息回调)。App Key 可以配置回调规则的数据格式,默认最多开通 4 个规则,开通服务后才允许用户配置。 - -2. 从环信服务器向你的应用服务器发送请求。 - -请求采用 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 发送过来的一致,查看 [消息格式文档](message_historical.html#历史消息记录的内容)。 | -| `securityVersion` | 安全校验版本,目前为 1.0.0。忽略此参数,以后会改成控制台做设置。 | -| `security` | 签名,格式如下: MD5(callId+Secret+timestamp)。Secret 见 Console 后台回调规则。 | - -**回调成功返回的示例** - -```json -{ - "callId": "XXXX-demo#XXXX-dp01-XXXX-8696-cf3b48b20e7e", - "eventType": "chat_offline", - "timestamp": 1600060847294, - "chat_type": "groupchat", - "group_id": "169XXXX21545", - "from": "user1", - "to": "user2", - "msg_id": "8924312242322", - "payload": { - // 具体的消息内容。 - }, - "securityVersion": "1.0.0", - "security": "2ca02c394bef9e7abc83958bcc3156d3" -} -``` - -#### 应答包字段说明 - -环信 IM 服务器不会验证响应的 response 内容,只要你的服务器给我们返回 HTTP 状态码是 200 即认为将消息回调成功。 - -### 查询回调储存详情接口描述 - -查询 App Key 下由于异常(比如链接超时,响应超时,回调规则封禁等)回调失败时存储的消息和事件类型集合,按每十分钟一个 date key 存储,然后用户可以根据消息集合按需拉取。 - -#### 功能限制说明 - -- 异常存储过期时间默认 3 天,若有存储需及时补发。 -- 补发重试次数建议控制在 10 次以内。 - -#### 认证方式 - -环信即时通讯 RESTful API 要求 Bearer HTTP 认证。每次发送 HTTP 请求时,都必须在请求头部填入如下 `Authorization` 字段: - -`Authorization:Bearer YourAppToken` - -为提高项目的安全性,使用 token(动态密钥)对即将登录即时通讯系统的用户进行鉴权。即时通讯 RESTful API 支持使用 App Token 的鉴权方式,详见 [使用 App Token 鉴权](easemob_app_token.html)。 - -#### 基本信息 - -方法:`GET` - -接入点: `/{org_name}/{app_name}/callbacks/storage/info` - -#### 路径参数 - -| 参数 | 类型 | 是否必需 | 描述 | -| :--------- | :----- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------- | -| `org_name` | String | 是 | 环信即时通讯 IM 为每个公司(组织)分配的唯一标识。详见 [获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | -| `app_name` | String | 是 | 你在环信即时通讯云控制台创建应用时填入的应用名称。详见 [获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | - -#### 请求 header - -| 参数 | 类型 | 是否必需 | 描述 | -| :-------------- | :----- | :------- | :--------------------------------------- | -| `Authorization` | String | 是 | 鉴权 Token,管理员 Token(含)以上权限。 | - -#### 响应 body - -| 参数 | 类型 | 描述 | -| :---------------- | :----- | :----------------------------------------------------------------------------- | -| `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,即每 10 分钟内的消息和事件。key 为 10 分钟的起点。 | -| - `size` | Int | 该 date key 内的消息数量。 | -| - `retry` | Int | 该 date key 内的数据已经重试补发的次数。未重试时值为 `0`。 | - -#### 请求示例 - -```shell -curl -X GET 'https://a1.easemob.com/easemob-demo/easeim/callbacks/storage/info' \ --H 'Authorization: Bearer ' -``` - -#### 响应示例 - -```json -{ - "path": "/callbacks", - "uri": "https://XXXX/XXXX/XXXX/callbacks", - "timestamp": 1631193031254, - "organization": "XXXX", - "application": "8dfb1641-XXXX-XXXX-bbe9-d8d45a3be39f", - "action": "post", - "data": [ - { - "date": "202109091440", - "size": 15, - "retry": 0 - }, - { - "date": "202109091450", - "size": 103, - "retry": 1 - } - ], - "duration": 153, - "applicationName": "XXXX" -} -``` - -### 补发回调存储信息接口描述 - -调用接口根据存储集合进行回调补发。 - -#### 基本信息 - -方法:`POST` - -接入点: `https://{host}/{org_name}/{app_name}/callbacks/storage/retry` - -#### 路径参数 - -| 参数 | 类型 | 是否必需 | 描述 | -| :--------- | :----- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------- | -| `org_name` | String | 是 | 环信即时通讯 IM 为每个公司(组织)分配的唯一标识。详见 [获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | -| `app_name` | String | 是 | 你在环信即时通讯云控制台创建应用时填入的应用名称。详见 [获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | - -#### 请求 header - -| 参数 | 类型 | 是否必需 | 描述 | -| :-------------- | :----- | :------- | :------------------------------------------------------------------------ | -| `Content-Type` | String | 是 | 内容类型,请填 `application/json`。 | -| `Authorization` | String | 是 | 鉴权 App Token 的值。详见 [使用 App Token 鉴权](easemob_app_token.html)。 | - -#### 请求 body - -| 参数 | 类型 | 是否必需 | 描述 | -| :---------- | :----- | :------- | :--------------------------------------------------------------------- | -| `date` | String | 是 | 可以补发的一个十分钟 date key,key 为十分钟的起点。 | -| `retry` | Int | 否 | 开发已重试的次数。考虑到补发也可能失败,服务器会继续存储。最开始是 0。 | -| `targetUrl` | String | 否 | 补发消息的回调地址,如果为空,则使用原回调规则的回调地址。 | - -#### 响应 body - -| 参数 | 类型 | 描述 | -| :------------- | :----- | :----------------------------------------------------------------------------- | -| `path` | String | 请求路径。 | -| `uri` | String | 请求路径的 URI。 | -| `timestamp` | long | 环信 IM 服务器接收到此消息的 Unix 时间戳,单位为毫秒。 | -| `organization` | String | 环信即时通讯 IM 为每个公司(组织)分配的唯一标识,与请求参数 `org_name` 相同。 | -| `application` | String | 你在环信 IM 管理后台注册的 app 唯一标识。 | -| `action` | String | 请求方法。 | -| `data` | Bool | • `success`:成功;
• `failure`:失败。 | -| `duration` | long | 请求耗时,单位为毫秒。 | - -#### 请求示例 - -```shell -curl -X POST 'https://XXXX/XXXX/XXXX/callback/storage/retry' \ --H 'Authorization: Bearer ' \ --H 'Content-Type: application/json' \ ---data-raw '{ - "date": "202108272230", - "retry": 0, - "targetUrl": "https://localhost:8000/test" -}' -``` - -#### 响应示例 - -```json -{ - "path": "/callbacks", - "uri": "https://XXXX/XXXX/XXXX/callbacks", - "timestamp": 1631194031721, - "organization": "XXXX", - "application": "8dfb1641-XXXX-XXXX-bbe9-d8d45a3be39f", - "action": "post", - "data": "success", - "duration": 225, - "applicationName": "XXXX" -} -``` - -#### 响应码说明 - -| 状态码 | 描述 | -| :----- | :--------------------------------- | -| 200 | 请求成功。 | -| 400 | 请求参数错误,请根据返回提示检查。 | -| 401 | 用户权限错误。 | -| 403 | 服务未开通或权限不足。 | -| 429 | 单位时间内请求过多。 | -| 500 | 服务器内部错误。 | - -## 常见问题 - -1. Q: 发送前回调响应中的 `valid` 为 `false`,但为什么消息还是下发了? - - A:可能是你的服务器在发送前回调规则中配置的等待时间内未返回响应。这种情况下,如果你在环信控制台的发送前回调规则页面配置的**调用失败时默认策略**为**放行**,消息则会下发。为了避免这种情况,建议将**等待响应时间**(**即时通讯** > **功能配置** > **消息回调** > **添加回调地址** > **发送前回调**,默认为 200 毫秒)参数的值提升,例如,增加至 3000 毫秒。 diff --git a/docs/document/server-side/callback_group_ban.md b/docs/document/server-side/callback_group_ban.md index dd5193540..67814fdad 100644 --- a/docs/document/server-side/callback_group_ban.md +++ b/docs/document/server-side/callback_group_ban.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组封禁或解禁的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 回调时机 diff --git a/docs/document/server-side/callback_group_block.md b/docs/document/server-side/callback_group_block.md index be9045f6c..2c17cc819 100644 --- a/docs/document/server-side/callback_group_block.md +++ b/docs/document/server-side/callback_group_block.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果你需要屏蔽/解除屏蔽群组的事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 屏蔽群组 diff --git a/docs/document/server-side/callback_group_room_admin.md b/docs/document/server-side/callback_group_room_admin.md index cb7b168b3..8887b651f 100644 --- a/docs/document/server-side/callback_group_room_admin.md +++ b/docs/document/server-side/callback_group_room_admin.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要添加/删除群组/聊天室管理员事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 添加管理员 diff --git a/docs/document/server-side/callback_group_room_allowlist.md b/docs/document/server-side/callback_group_room_allowlist.md index 16d0625d1..b9cf54439 100644 --- a/docs/document/server-side/callback_group_room_allowlist.md +++ b/docs/document/server-side/callback_group_room_allowlist.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要将群组/聊天室成员加入或移出白名单的事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 将成员加入白名单 diff --git a/docs/document/server-side/callback_group_room_announcement.md b/docs/document/server-side/callback_group_room_announcement.md index 76b60adee..e2d20f2fa 100644 --- a/docs/document/server-side/callback_group_room_announcement.md +++ b/docs/document/server-side/callback_group_room_announcement.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室公告事件的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 回调时机 diff --git a/docs/document/server-side/callback_group_room_blocklist.md b/docs/document/server-side/callback_group_room_blocklist.md index a06b33001..3fd73fc45 100644 --- a/docs/document/server-side/callback_group_room_blocklist.md +++ b/docs/document/server-side/callback_group_room_blocklist.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室成员被加入/移出黑名单事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 将成员加入黑名单 diff --git a/docs/document/server-side/callback_group_room_create.md b/docs/document/server-side/callback_group_room_create.md index 1c4c3360d..49a43e0de 100644 --- a/docs/document/server-side/callback_group_room_create.md +++ b/docs/document/server-side/callback_group_room_create.md @@ -4,7 +4,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要创建群组/聊天室的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 回调时机 diff --git a/docs/document/server-side/callback_group_room_delete.md b/docs/document/server-side/callback_group_room_delete.md index 7f86bc4b0..2724356f8 100644 --- a/docs/document/server-side/callback_group_room_delete.md +++ b/docs/document/server-side/callback_group_room_delete.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室解散的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 回调时机 diff --git a/docs/document/server-side/callback_group_room_info.md b/docs/document/server-side/callback_group_room_info.md index 92686b67c..778116ef5 100644 --- a/docs/document/server-side/callback_group_room_info.md +++ b/docs/document/server-side/callback_group_room_info.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室信息更新的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 回调时机 diff --git a/docs/document/server-side/callback_group_room_join.md b/docs/document/server-side/callback_group_room_join.md index ef25c8650..b40f67447 100644 --- a/docs/document/server-side/callback_group_room_join.md +++ b/docs/document/server-side/callback_group_room_join.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室加人的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 直接加入 diff --git a/docs/document/server-side/callback_group_room_leave.md b/docs/document/server-side/callback_group_room_leave.md index 18250146d..7efa2cc00 100644 --- a/docs/document/server-side/callback_group_room_leave.md +++ b/docs/document/server-side/callback_group_room_leave.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室成员离开的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 主动退出 diff --git a/docs/document/server-side/callback_group_room_mute.md b/docs/document/server-side/callback_group_room_mute.md index 1d1dfc3fb..465dde12e 100644 --- a/docs/document/server-side/callback_group_room_mute.md +++ b/docs/document/server-side/callback_group_room_mute.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要将群组或聊天室成员添加或移出禁言列表的事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 将成员加入禁言列表 diff --git a/docs/document/server-side/callback_group_room_muteall.md b/docs/document/server-side/callback_group_room_muteall.md index 837d9211f..19c37ccd6 100644 --- a/docs/document/server-side/callback_group_room_muteall.md +++ b/docs/document/server-side/callback_group_room_muteall.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要群组/聊天室全员禁言或解除禁言的事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 全员禁言/解除全员禁言 diff --git a/docs/document/server-side/callback_group_room_owner.md b/docs/document/server-side/callback_group_room_owner.md index ec089683a..c8730687b 100644 --- a/docs/document/server-side/callback_group_room_owner.md +++ b/docs/document/server-side/callback_group_room_owner.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要变更群主或聊天室所有者的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 回调时机 diff --git a/docs/document/server-side/callback_group_shared_file.md b/docs/document/server-side/callback_group_shared_file.md index 3c31fee47..b6dcd3d0f 100644 --- a/docs/document/server-side/callback_group_shared_file.md +++ b/docs/document/server-side/callback_group_shared_file.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要上传或删除群组共享文件的回调事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 群组共享文件上传事件 diff --git a/docs/document/server-side/callback_overview.md b/docs/document/server-side/callback_overview.md new file mode 100644 index 000000000..f86c4ce74 --- /dev/null +++ b/docs/document/server-side/callback_overview.md @@ -0,0 +1,58 @@ +# 回调功能 + + + +## 概述 + +环信即时通讯云支持回调功能,即会在事件发生之前或之后,环信 IM 服务器会以 HTTP POST 请求的形式向你的应用服务器发送通知。根据是否干预消息投递,回调分为两类: + +- **发送前回调**:旨在让 app 后台干预该事件的处理逻辑,环信服务器会根据响应中的返回值确定后续处理流程。**该类回调仅适用于从你的客户端应用发送的消息。** + + 该类回调一般是对用户发送的消息内容的处理,典型的应用场景为内容审核:当环信服务器收到来自客户端应用的消息时,会向你的应用服务器发送请求并等待响应,从而决定是否通过或拒绝消息投递。 + +- **发送后回调**:旨在让 app 后台实现必要的数据同步,环信服务器忽略回调返回码。 + + 发送后回调包括发送消息、发送消息已读回执、进行群组或聊天室操作、好友关系操作和用户状态变化等事件,详见[发送后回调过滤规则设置](/product/enable_and_configure_IM.html#配置回调规则)。 + +使用回调功能前,请查看你的产品套餐是否支持,详见[增值服务说明](/product/pricing.html#增值服务费用)。若不支持,你需首先在[环信即时通讯云控制台](https://console.easemob.com/user/login)[开通该功能](/product/enable_and_configure_IM.html#开通消息回调),然后[配置发送前回调规则发送后回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 + +:::tip +若使用了一段时间回调功能后需要将其关闭,请联系环信商务。关闭该功能会导致回调所有相关配置删除,请谨慎操作。 +::: + +## 两类回调的区别 + +| 类别 | 发送前回调 | 发送后回调 | +| ---------- | ---------- | ---------------------- | +| 支持的消息发送方式 | 客户端 SDK | 客户端 SDK 和 RESTful API | +| 支持的范围 | 仅限消息 | 消息和其他事件 | +| 发生的时间 | 环信服务器收到用户发送的上行单聊和群聊消息之后、且将该消息下发给目标用户之前 | 发送消息后或进行单聊、群聊、聊天室、联系人等相关的操作后 | +| 是否需要响应 | 是 | 否 | +| 典型用例 | 内容审核 | 聊天记录同步 | + +## 回调安全 + +对于发送前和发送后回调,环信服务器会向你的应用服务器发送带有 JSON 负载的 HTTP/HTTPS POST 请求。请求采用 UTF-8 编码,每个请求中的消息都使用 MD5 签名。在每个请求头中,`Content-Type` 字段为 `application/json`。 + +对于发送后回调,请求中的消息使用通过 `org.apache.commons.codec.digest.DigestUtils#md5Hex` 计算的 MD5 签名。 + +你可以通过以下步骤验证签名检查回调是否从环信服务器发送: + +1. 查找以下信息: + + - 回调 ID:回调请求体中的 `callId` 参数。 + + - 环信服务器为回调规则生成的 secret:你可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**消息回调**页面的回调规则列表中查看。 + + ![img](1.png) + + - 回调时间戳:回调请求体中的时间戳参数。 + +2. 计算回调 ID、secret、回调时间戳拼接后的字符串的 MD5 值。 + +3. 检查计算的值是否与请求体中的 secret 参数相同。若相同,则表示该回调请求由环信服务器发送。 + + + + + diff --git a/docs/document/server-side/callback_postsending.md b/docs/document/server-side/callback_postsending.md new file mode 100644 index 000000000..87a998dc8 --- /dev/null +++ b/docs/document/server-side/callback_postsending.md @@ -0,0 +1,272 @@ +# 发送后回调 + +## 概述 + +发送后回调对所有聊天消息有效,包含通过 SDK 和 RESTful API 发送的单聊、群组和聊天室的消息。发送后回调通常用于 app 后台需要实现必要的数据同步的场景,例如: +- 针对客户消息的内容进行自动回复; +- 在你的应用服务器端及时保存聊天历史记录或者离线消息。 + +:::tip +1. 如果你对聊天消息没有时效性需求,可以直接通过免费的[聊天记录文件拉取 REST API](message_historical.html#历史消息记录的内容) 获取聊天记录,无需使用发送后回调。 +2. 如果 app 开通了反垃圾/敏感词过滤,被识别的消息会在服务器被拦截并禁止发送,将不会回调。 +::: + +![](/images/server-side/im-callback1.png) + +## 实现步骤 + +1. 开通发送后回调服务:在[环信即时通讯云控制台](https://console.easemob.com/user/login)[开通回调服务](/product/enable_and_configure_IM.html#开通消息回调)。 +2. 配置发送后回调规则:详见[规则配置说明](/product/enable_and_configure_IM.html#配置回调规则)。 +3. 发送消息或进行群组、聊天室或联系人相关操作后,环信服务器向你的应用服务器发送回调请求。 + +## 发送后回调规则 + +要使用发送后回调,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)配置回调规则,详见[规则配置说明](/product/enable_and_configure_IM.html#配置回调规则)。 + +对于同一个 app 可以针对聊天消息、离线消息和通过 REST API 发送的消息配置不同的规则。如果 app 同时需要聊天消息和离线消息两种消息,建议区分回调地址。不过,规则也可以将这两种消息同时回调至一个指定服务器地址,在接收到消息后,可以对 `eventType` 判断,区分消息类型。 + +## 发送后回调延时 + +发送后回调接收延时指消息服务器接收到客户端聊天消息、再将消息成功回调至客户指定服务器地址的时间间隔。消息接收延时保障是 99.95% 的消息在 30s 内。 + +## 发送后回调重试 + +发送后回调重试,当环信服务器执行发出回调后,响应状态码非 200,则认为回调失败,然后立即重试。若再次失败,再记录一次失败。针对一条回调仅重试一次,重试失败后即丢弃。若开通了[补发回调存储信息功能](#补发回调存储信息),则将消息放入异常存储中。 + +若 30 秒内累计 90 次失败,会封禁该 app 的回调规则。封禁规则为,24 小时内连续封禁计数最大为 5(若封禁次数超过 5 次,仍计为 5),首次封禁默认 5 分钟,后续封禁时间为封禁次数 * 5 分钟,即第一次封禁 5 分钟,第二次封禁 10 分钟,第三次封禁 15 分钟,第四次封禁 20 分钟,第五次封禁 25 分钟,后续封禁时间与第 5 次保持一致为 25 分钟。重试失败以及封禁期间的回调不会自动补录,可以下载历史消息记录自行补充。 + +:::tip +若有特殊需求不能丢失回调消息的情况下,请联系环信商务经理开通回调异常缓存功能,并使用[查询回调异常缓存](#查询回调存储详情)和[补发回调储存信息](#补发回调存储信息) 接口。 +::: + +## 回调示例 + +消息发送或相关操作发送时,环信服务器会向你的应用服务器发送 HTTP/HTTPS POST 请求,正文部分为 JSON 格式的字符串,字符集为 UTF-8。 + +回调时,环信服务器会对发送的正文进行 MD5 签名,使用的 MD5 为 `org.apache.commons.codec.digest.DigestUtils#md5Hex`。 + +### 请求示例 + +```json +{ + "callId": "XXXX-demo#XXXX-dp01-XXXX-8696-cf3b48b20e7e", + "eventType": "chat_offline", + "timestamp": 1600060847294, + "chat_type": "groupchat", + "group_id": "169XXXX21545", + "from": "user1", + "to": "user2", + "msg_id": "8924312242322", + "payload": { + // 具体的消息内容。 + }, + "securityVersion": "1.0.0", + "security": "2ca02c394bef9e7abc83958bcc3156d3" +} +``` + +| 参数 | 类型 | +| :---------------- | :------------------------------ | +| `callId` | callId 为 `{appkey}\_{uuid}` 其中 UUID 为随机生成,作为每条回调的唯一标识。 | +| `eventType` | - `chat` 聊天消息;
- `chat_offline` 离线消息。 | +| `timestamp` | 环信 IM 服务器接收到此消息的 Unix 时间戳,单位为毫秒。 | +| `chat_type` | - `chat` 单聊回调;
- `groupchat` 群聊回调包含了群组和聊天室的消息回调,默认全选。 | +| `group_id` | 回调消息所在的群组,群聊时才有此参数。 | +| `from` | 消息的发送方。 | +| `to` | 消息的接收方。 | +| `msg_id` | 消息的 ID。 | +| `payload` | 消息内容,与通过 RESTful API 发送过来的一致,查看 [消息格式文档](message_historical.html#历史消息记录的内容)。 | +| `securityVersion` | 安全校验版本,目前为 1.0.0。请忽略此参数。 | +| `security` | 签名,格式如下: MD5(callId+Secret+timestamp)。关于 Secret,详见[规则配置说明](/product/enable_and_configure_IM.html#配置回调规则)。 | + +### 回调响应 + +环信 IM 服务器不会验证响应的内容,只要应用服务器返回的 HTTP 状态码为 200,即视为消息回调成功。 + +应用服务器收到回调消息后,向环信服务器发送的响应内容不能超过 1,000 个字符长度。如果连续发送超长的响应内容(30 秒内累计 90 次),会导致[回调规则封禁](#发送后回调重试)。 + +## 查询回调存储详情 + +查询 App Key 下由于异常(例如,连接超时、响应超时、回调规则封禁等)回调失败时存储的消息和事件类型集合,按每十分钟一个 date key 存储,然后用户可以根据消息集合按需拉取。 + +### 功能限制 + +- 异常存储过期时间默认 3 天,若有存储需及时补发。 +- 补发重试次数建议控制在 10 次以内。 + +### 认证方式 + +环信即时通讯 RESTful API 要求 Bearer HTTP 认证。每次发送 HTTP 请求时,都必须在请求头部填入如下 `Authorization` 字段: + +`Authorization:Bearer YourAppToken` + +为提高项目的安全性,使用 token(动态密钥)对即将登录即时通讯系统的用户进行鉴权。即时通讯 RESTful API 支持使用 App Token 的鉴权方式,详见 [使用 App Token 鉴权](easemob_app_token.html)。 + +### HTTP 请求 + +```http +GET https://{host}/{org_name}/{app_name}/callbacks/storage/info +``` + +### 路径参数 + +| 参数 | 类型 | 是否必需 | 描述 | +| :--------- | :----- | :------- | :--------------------- | +| `org_name` | String | 是 | 环信即时通讯 IM 为每个公司(组织)分配的唯一标识。详见[获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | +| `app_name` | String | 是 | 你在环信即时通讯云控制台创建应用时填入的应用名称。详见[获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | + +### 请求 header + +| 参数 | 类型 | 是否必需 | 描述 | +| :-------------- | :----- | :------- | :--------------------------------------- | +| `Authorization` | String | 是 | 鉴权 Token,管理员 Token(含)以上权限。 | + +### 响应 body + +如果返回的 HTTP 状态码为 `200`,表示请求成功,响应 body 包含如下字段: + +| 参数 | 类型 | 描述 | +| :---------------- | :----- | :------------------ | +| `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,即每 10 分钟内的消息和事件。key 为 10 分钟的起点。 | +| - `size` | Int | 该 date key 内的消息数量。 | +| - `retry` | Int | 该 date key 内的数据已经重试补发的次数。未重试时值为 `0`。 | + +如果返回的 HTTP 状态码非 `200`,表示请求失败。你可以参考[响应状态码](#响应状态码)了解可能的原因。 + +### 示例 + +#### 请求示例 + +```shell +curl -X GET 'https://a1.easemob.com/easemob-demo/easeim/callbacks/storage/info' \ +-H 'Authorization: Bearer ' +``` + +#### 响应示例 + +```json +{ + "path": "/callbacks", + "uri": "https://XXXX/XXXX/XXXX/callbacks", + "timestamp": 1631193031254, + "organization": "XXXX", + "application": "8dfb1641-XXXX-XXXX-bbe9-d8d45a3be39f", + "action": "post", + "data": [ + { + "date": "202109091440", + "size": 15, + "retry": 0 + }, + { + "date": "202109091450", + "size": 103, + "retry": 1 + } + ], + "duration": 153, + "applicationName": "XXXX" +} +``` + +## 补发回调存储信息 + +调用接口根据存储集合进行回调补发。 + +### HTTP 请求 + +```http +POST https://{host}/{org_name}/{app_name}/callbacks/storage/retry +``` + +#### 路径参数 + +| 参数 | 类型 | 是否必需 | 描述 | +| :--------- | :----- | :------- | :---------------------------- | +| `org_name` | String | 是 | 环信即时通讯 IM 为每个公司(组织)分配的唯一标识。详见[获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | +| `app_name` | String | 是 | 你在环信即时通讯云控制台创建应用时填入的应用名称。详见[获取环信即时通讯 IM 的信息](enable_and_configure_IM.html#获取环信即时通讯-im-的信息)。 | + +#### 请求 header + +| 参数 | 类型 | 是否必需 | 描述 | +| :-------------- | :----- | :------- | :------------------------------------------------------------------------ | +| `Content-Type` | String | 是 | 内容类型,请填 `application/json`。 | +| `Authorization` | String | 是 | 鉴权 App Token 的值。详见[使用 App Token 鉴权](easemob_app_token.html)。 | + +#### 请求 body + +| 参数 | 类型 | 是否必需 | 描述 | +| :---------- | :----- | :------- | :--------------------------------------------------------------------- | +| `date` | String | 是 | 可以补发的一个十分钟 date key,key 为十分钟的起点。 | +| `retry` | Int | 否 | 开发已重试的次数。考虑到补发也可能失败,服务器会继续存储。最开始是 0。 | +| `targetUrl` | String | 否 | 补发消息的回调地址,如果为空,则使用原回调规则的回调地址。 | + +### HTTP 响应 + +#### 响应 body + +如果返回的 HTTP 状态码为 `200`,表示请求成功,响应 body 包含如下字段: + +| 参数 | 类型 | 描述 | +| :------------- | :----- | :----------------------------------------------------------------------------- | +| `path` | String | 请求路径。 | +| `uri` | String | 请求路径的 URI。 | +| `timestamp` | long | 环信 IM 服务器接收到此消息的 Unix 时间戳,单位为毫秒。 | +| `organization` | String | 环信即时通讯 IM 为每个公司(组织)分配的唯一标识,与请求参数 `org_name` 相同。 | +| `application` | String | 你在环信 IM 管理后台注册的 app 唯一标识。 | +| `action` | String | 请求方法。 | +| `data` | Bool | - `success`:成功;
- `failure`:失败。 | +| `duration` | long | 请求耗时,单位为毫秒。 | + +如果返回的 HTTP 状态码非 `200`,表示请求失败。你可以参考[响应状态码](#响应状态码)了解可能的原因。 + +### 示例 + +#### 请求示例 + +```shell +curl -X POST 'https://XXXX/XXXX/XXXX/callback/storage/retry' \ +-H 'Authorization: Bearer ' \ +-H 'Content-Type: application/json' \ +--data-raw '{ + "date": "202108272230", + "retry": 0, + "targetUrl": "https://localhost:8000/test" +}' +``` + +#### 响应示例 + +```json +{ + "path": "/callbacks", + "uri": "https://XXXX/XXXX/XXXX/callbacks", + "timestamp": 1631194031721, + "organization": "XXXX", + "application": "8dfb1641-XXXX-XXXX-bbe9-d8d45a3be39f", + "action": "post", + "data": "success", + "duration": 225, + "applicationName": "XXXX" +} +``` + +### 响应状态码 + +| 状态码 | 描述 | +| :----- | :--------------------------------- | +| 200 | 请求成功。 | +| 400 | 请求参数错误,请根据返回提示检查。 | +| 401 | 用户权限错误。 | +| 403 | 服务未开通或权限不足。 | +| 429 | 单位时间内请求过多。 | +| 500 | 服务器内部错误。 | diff --git a/docs/document/server-side/callback_presending.md b/docs/document/server-side/callback_presending.md new file mode 100644 index 000000000..fe4e3c028 --- /dev/null +++ b/docs/document/server-side/callback_presending.md @@ -0,0 +1,104 @@ +# 发送前回调 + +## 概述 + +环信服务器收到用户发送的上行单聊和群聊消息之后、将该消息下发给目标用户之前,环信服务器会通过 HTTP/HTTPS POST 请求通知给你的应用服务器。 + +**发送前回调只对客户端发送的消息有效,不包含通过 RESTful API 发送的消息。** + +应用服务器可以通过发送前回调实时处理用户的聊天消息,例如,拦截包含文本、图片、自定义消息等类型的消息。 + +![](/images/server-side/im-callback.jpeg) + +## 实现步骤 + +1. 开通发送后回调服务:在[环信即时通讯云控制台](https://console.easemob.com/user/login)[开通消息回调服务](/product/enable_and_configure_IM.html#开通消息回调)。 +2. 配置发送后回调规则:详见[环信即时通讯云控制台](https://console.easemob.com/user/login)[规则配置说明](/product/enable_and_configure_IM.html#配置回调规则)。 +3. 环信服务器向你的应用服务器发送 HTTP/HTTPS POST 请求。 + +## 回调规则 + +要使用发送前回调,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)配置回调规则,详见[规则配置说明](/product/enable_and_configure_IM.html#配置回调规则)。 + +对同一 app,可针对文本、图片、自定义消息等类型的消息配置不同的规则,也支持通过同一规则选择两种以上消息类型同时回调至一个指定服务器地址。接收到消息后,你可以根据消息类型进行分类处理。 + +## 与发送后回调的关系 + +若同时设置了消息发送前和发送后两种回调,且消息发送前回调返回拒绝,则消息发送后回调将不会被触发。 + +## 回调示例 + +请求采用 POST 方式,支持 `HTTP/HTTPS`,正文部分为 JSON 格式的字符串,字符集为 UTF-8。 + +### 请求 header + +| 字段名 | 值 | +| :------------- | :---------------------------------- | +| `Content-Type` | 内容类型,请填 `application/json`。 | + +### 请求 body + +| 参数 | 类型 | +| :---------------- | :--------------------------------------- | +| `callId` | `callId` 为 `{appkey}_{uuid}`,其中 `uuid` 为随机生成,作为每条回调的唯一标识。 | +| `timestamp` | 环信 IM 服务器接收到此消息的时间戳。 | +| `chat_type` | 聊天类型:`chat` 为单聊,`group` 为群组聊天,`chatroom` 为聊天室。| +| `group_id` | 回调消息所在的群组或聊天室。该参数仅对群组聊天或聊天室中的消息回调生效。 | +| `from` | 消息的发送方。 | +| `to` | 消息的接收方。单聊为消息接收方,群组聊天和聊天室为群组 ID 和聊天室 ID。 | +| `msg_id` | 消息的 ID。 | +| `payload` | 消息内容,与通过 REST API 发送过来的一致,查看 [消息格式文档](message_historical.html#历史消息记录的内容)。 | +| `securityVersion` | 安全校验版本,目前为 1.0.0。请忽略此参数。 | +| `security` | 签名,格式如下: MD5(callId+Secret+timestamp)。Secret 见 [环信即时通讯云控制台](https://console.easemob.com/user/login)[回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 | + +### 响应 body + +消息发送到你的应用服务器后,应用服务器需返回 HTTP 响应码 200 和 `valid` 属性,根据 `valid` 状态决定是否进行下发。环信服务若未收到响应或你的应用服务器没有返回 `valid` 状态,该条消息会根据默认设置(规则中的**调用失败时默认策略**)处理,不会重试;后续消息依然正常执行回调。 + +响应内容不能超过 1,000 个字符,否则环信服务器会认为是攻击,导致回调失败。 + +| 参数 | 类型 | 是否必需
| 描述 | +| :-------- | :----- | :----------------- | :----------- | +| `valid` | bool | 是 | 根据你的服务器设定的规则判断消息是否合法:
- `true` :消息合法,环信服务器应下发该消息;`false` :消息非法,环信服务器应拦截该消息。| +| `code` | String | 否 | 客户端上报的自定义发送前回调错误。环信控制台上的**发送前回调**页面中的**消息拦截报错时显示**设置为**报错** 时,该 `code` 的内容为客户端提示的错误。错误分为以下几种情况:
- 若 `code` 的内容为字符串类型,客户端上的错误为该参数的内容;
- 响应中不包含 `code` 字段, 客户端提示 `custom logic denied`;
- 若 `code` 为空字符串,移动客户端提示 `Message blocked by external logic` 错误;
- 若在指定时间内未收到应答包,则按默认配置处理,客户端提示 `custom internal error` 错误;
- 如果返回的应答包出现错误,包括缺少必填字段 `valid` 或字段类型不符合约定类型,客户端提示 `custom internal error` 错误。| +| `payload` | Object | 否 | 修改后的消息内容。若无需修改消息内容,**请勿传该参数**。
若需要更改消息内容可以回传修改后的内容,格式同传入的消息内容。目前仅支持文本的形式,并且消息大小不能超过 1 KB。如果需要支持修改其他类型的消息,需要联系商务配置。 | + +### 示例 + +#### 请求示例 + +```shell +{ + "callId":"XXXX-XXXX#test_0990a64f-XXXX-XXXX-8696-cf3b48b20e7e", + "timestamp":1600060847294, + "chat_type":"groupchat", + "group_id":"16934809238921545", + "from":"user1", + "to":"user2", + "msg_id":"8924312242322", + "payload":{ + // 具体的消息内容 + }, + "securityVersion":"1.0.0", + "security":"2ca02c394bef9e7abc83958bcc3156d3" +} +``` + +#### 响应示例 + +```json +{ + "valid": true, + "code": "HX:10000", + "payload": { + // 具体的消息内容。 + // 仅支持文本类型消息。 + } +} +``` + +## 常见问题 + +1. Q: 发送前回调响应中的 `valid` 为 `false`,但为什么消息还是下发了? + + A:可能是你的服务器在发送前回调规则中配置的等待时间内未返回响应。这种情况下,如果你在环信控制台的发送前回调规则页面配置的**调用失败时默认策略**为**放行**,消息则会下发。为了避免这种情况,建议将**等待响应时间**(**即时通讯** > **功能配置** > **消息回调** > **添加回调地址** > **发送前回调**,默认为 200 毫秒)参数的值提升,例如,增加至 3000 毫秒。 \ No newline at end of file diff --git a/docs/document/server-side/callback_room_superadmin.md b/docs/document/server-side/callback_room_superadmin.md index a9037cf65..a22dde364 100644 --- a/docs/document/server-side/callback_room_superadmin.md +++ b/docs/document/server-side/callback_room_superadmin.md @@ -5,7 +5,7 @@ :::tip 1. 你所使用的环信即时通讯 IM 的版本可能需要单独开通回调服务,详见[增值服务说明](/product/pricing.html#增值服务费用)。 2. 如果需要添加/删除聊天室超级管理员事件,你需要在[环信控制台](https://console.easemob.com/user/login)设置发送后回调规则,详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 -3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback.html)。 +3. 发送后回调的相关介绍,详见[回调说明](/document/server-side/callback_postsending.html)。 ::: ## 添加超级管理员 diff --git a/docs/private/im/uc_configure.md b/docs/private/im/uc_configure.md index 65ed45613..446d93346 100644 --- a/docs/private/im/uc_configure.md +++ b/docs/private/im/uc_configure.md @@ -94,7 +94,7 @@ ![img](/images/privitization/deploy_push_callback.png) -3. 点击 **添加回调地址** 按钮,打开回调配置对话框,在回调配置对话框中,填写回调相关配置信息,点击 **保存** 按钮,完成回调配置,具体配置内容说明见 [回调配置](/document/server-side/callback.html#实现步骤)。 +3. 点击 **添加回调地址** 按钮,打开回调配置对话框,在回调配置对话框中,填写回调相关配置信息,点击 **保存** 按钮,完成回调配置,具体配置内容说明见 [回调配置](/product/enable_and_configure_IM.html#配置回调规则)。 ![img](/images/privitization/deploy_push_window.png) diff --git a/docs/product/moderation/moderation_record_callback.md b/docs/product/moderation/moderation_record_callback.md index 3c9bcd752..78558776f 100644 --- a/docs/product/moderation/moderation_record_callback.md +++ b/docs/product/moderation/moderation_record_callback.md @@ -12,7 +12,7 @@ ![img](/images/moderation/moderation_callback_02.png) -3. 勾选 **内容审核**,其他字段的设置详见[设置回调](/document/server-side/callback.html)。 +3. 勾选 **内容审核**,其他字段的设置详见[配置回调规则](/product/enable_and_configure_IM.html#配置回调规则)。 ![img](/images/moderation/moderation_callback_03.png) diff --git a/docs/product/pricing.md b/docs/product/pricing.md index 26845978f..6e3aac2f9 100644 --- a/docs/product/pricing.md +++ b/docs/product/pricing.md @@ -101,12 +101,12 @@ | 扩展单个用户可加入群组数上限 | 对单个 App Key 内的所有用户生效 | 预付费 | 2000 群/人:1000 元/月 | — | | 群聊消息已读回执 | 功能介绍详见[群聊消息已读回执](/document/android/message_receipt.html#群聊)。 | 预付费 | 1000 元/月 | — | | 全局禁言 | 功能介绍详见[全局禁言](/document/server-side/user_global_mute.html)。 | 预付费 | 500 元/月 | — | -| 回调 | 功能介绍详见[回调](/document/server-side/callback.html)。 | 预付费 | 1000 元/月 | — | +| 回调 | 功能介绍详见[回调](/document/server-side/callback_overview.html)。 | 预付费 | 1000 元/月 | — | | 用户在线状态(Presence)订阅 | 功能介绍详见[用户在线状态订阅](/document/server-side/presence.html)。 | 预付费 | 1000 元/月 | — | | 消息表情回复 Reaction | 功能介绍详见[消息表情回复](/document/server-side/reaction.html)。 | 预付费 | 600 元/月 | — | | 子区 Thread | 功能介绍详见[管理子区](/document/server-side/group_thread.html#管理子区)。 | 预付费 | 600 元/月 | — | | 消息举报 | 功能介绍详见[消息举报](/document/android/moderation.html)。 | 预付费 | 500 元/月 | — | -| 回调异常缓存 | 功能介绍详见[补发回调存储信息接口描述](/document/server-side/callback.html#补发回调存储信息接口描述)。 | 预付费 | 2000 元/月 | 2000 元/月 | +| 回调异常缓存 | 功能介绍详见[补发回调存储信息接口描述](/document/server-side/callback_postsending.html#补发回调存储信息)。 | 预付费 | 2000 元/月 | 2000 元/月 | | 消息人工审核 | 功能介绍详见[消息人工审核](https://docs-im.easemob.com/ccim/moderation/censor)。 | 预付费 |1000 元/月 | 1000 元/月 | | 质量监控 | 功能介绍详见[请求质量](request_quality_overview.html)。 | 预付费 | 2000 元/月 | 2000 元/月 |