跳到主要内容

接收服务端回调

服务端回调概述

即时通讯业务提供以下服务端回调,支持将业务的数据、状态通知同步到您设置的回调地址。所有服务端回调均需要在内嵌控制台中启用。 具体步骤:

  1. 控制台内嵌指南将 IM 服务功能配置页面(page_code: im_service_config)嵌入到自己的管理后台。
  2. 在管理后台中的 IM 服务功能配置页面,进入 全局消息 > 消息回调服务
  3. 开启所需回调类型并配置接收地址 您可以访问以下文档,了解如何配置并启用回调,以及如何解析回调数据:

设置 IP 白名单

如果您的网络有 IP 访问限制,请务必将以下 IP 地址加入到白名单中,否则无法正常接收服务端回调。

  • 国内数据中心: 39.105.128.42、39.105.147.30、123.56.88.42、182.92.215.38、182.92.84.148、39.106.150.151、39.107.75.101、101.201.34.95、39.106.2.63、101.200.62.251、47.93.57.144(控制台)
  • 海外数据中心:52.221.93.74(新加坡)、8.219.168.45(新加坡)、8.219.93.148(新加坡)、8.219.215.35(新加坡)、8.219.43.97(新加坡)、47.245.124.194(新加坡)、8.222.167.17(新加坡)、47.236.149.1(新加坡)、8.219.217.193(新加坡) 8.222.202.67(新加坡)、43.156.138.254(新加坡)、43.163.81.196(新加坡)、43.156.239.53(新加坡)、52.41.206.152(北美)、8.213.17.80(沙特)、8.213.16.171(沙特)、8.213.28.96(沙特)、101.46.58.181(沙特)、80.238.230.175(沙特)、101.46.53.241(沙特)
提示

以下 IP 地址已不再使用。如果您的 IP 白名单中已添加以下地址,请移除。 120.92.12.217、120.92.12.60、120.92.12.253、120.92.12.113、120.92.12.29、120.92.12.214、120.92.12.164、120.92.12.153、120.92.12.204、120.92.12.138、120.92.13.82、120.92.13.83、120.92.13.84、120.92.13.85、120.131.13.147、117.50.18.131、106.75.117.2、47.94.106.191

验证回调签名

即时通讯服务向应用服务器推送数据时会添加 4 个 POST 请求参数。

参数名类型说明
appKeyString应用和环境的 App Key,可从控制台获取。 例外:消息回调服务 的 POST 请求路径中不含该参数,您可以使用回调请求正文中的 appKey 字段。
nonceString随机数,不超过 18 个字符。
timestampString时间戳,从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的毫秒数。
signature (数据签名)String数据签名。将系统分配的 App Secret、Nonce (随机数)、Timestamp (时间戳)三个字符串按顺序拼接成一个字符串,进行 SHA1 哈希计算。

计算 Signature 代码示例

以下示例演示如何计算签名并校验回调请求:

Java
public void handleCallback(HttpServletRequest request) {
String appSecret = "****"; // 请替换为您从控制台获取的 App Secret。
String nonce = request.getParameter("nonce"); // 获取随机数。
String timestamp = request.getParameter("timestamp"); // 获取时间戳。
String signature = request.getParameter("signature"); // 获取签名。

if (signature == null || nonce == null || timestamp == null) {
System.out.println("Missing required parameters.");
return;
}

String localSignature = DigestUtils.sha1Hex((appSecret + nonce + timestamp).getBytes());

if (signature.equals(localSignature)) {
// TODO: 此处添加业务逻辑。
System.out.println("Signature match.");
} else {
System.out.println("Signature error.");
}
}