小天互连 Web/H5 SDK 接入指南

将小天互连 IM 聊天能力集成到第三方 Web / H5 应用

xtelf_api.js

1. 快速接入

引入 SDK

在页面中引入 xtelf_api.js,该文件部署在小天互连 Web 应用的 static/ 目录下:

<script src="https://your-domain.com/xtelf/static/xtelf_api.js"></script>
路径自动检测:SDK 会根据 xtelf_api.js 自身的 src 路径自动推算应用基础地址,无需手动配置。

最小示例

// 1. 初始化 SDK
var xtelf = XtelfAPI.init({
  userSdkKey: "你的用户身份令牌",
  webTitle: "我的应用"
});

// 2. 打开聊天(PC 弹窗 / H5 页面跳转)
xtelf.openWebChat("目标用户ID");

// 3. 或者获取 URL 嵌入 iframe
var url = xtelf.openWebChat("目标用户ID", { returnUrl: true });
document.getElementById("myIframe").src = url;
注意:userSdkKey 是用户身份凭证,请勿硬编码在前端源码中,建议从后端接口动态获取。

2. 初始化

XtelfAPI.init(initParam)

初始化 SDK 实例。所有后续方法调用都必须通过该实例进行。

参数类型说明
userSdkKey必填String用户身份令牌,由后端签发,用于聊天类接口的认证
appId可选String应用 appId
webTitle可选StringPC 端弹窗标题,默认 "小天互连web"
oaApiBaseUrl可选String业务群开放接口的基础地址,末尾斜杠会自动补齐。未传时使用默认地址

返回值:XtelfAPI 实例

var xtelf = XtelfAPI.init({
  userSdkKey: "QnJJY0tWSC84aU05...",
  appId: "0fe6a4b2b52b4ff28d4ac918",
  webTitle: "OA协同办公",
  oaApiBaseUrl: "https://oa.example.com/"
});

3. returnUrl 模式(iframe 嵌入)

所有页面跳转类方法都支持在最后一个参数传入 { returnUrl: true },此时方法不会打开或跳转页面,而是返回目标 URL,供调用方自行处理(如嵌入 iframe)。

同步方法

openWebChatopenWebChatOnlyopenWebChatNoMenuoaOpenWebChat 直接返回 URL 字符串:

// 获取聊天页面 URL
var chatUrl = xtelf.openWebChat("user001", { returnUrl: true });

// 嵌入 iframe
document.getElementById("chatFrame").src = chatUrl;

异步方法

createGroupAndChatopenGroupAndChatopenGroupChatRecord 需要先请求后端接口,返回 Promise,resolve 后得到 URL:

// 创建业务群并获取 URL
xtelf.createGroupAndChat(
  "approval-001", "oa-approval",
  ["zhang_san"], "审批群",
  { returnUrl: true }
).then(function(url) {
  if (url) {
    document.getElementById("chatFrame").src = url;
  }
});
异步方法错误处理:如果后端接口返回错误(如群不存在),Promise 会 resolve 为 undefined(同时弹出错误提示)。请在 .then() 中判断 url 是否有值后再使用。

完整 iframe 嵌入示例

<iframe id="chatFrame"
  style="width:100%;height:600px;border:none;"
  allow="camera;microphone">
</iframe>

<script>
  var xtelf = XtelfAPI.init({
    userSdkKey: window.__USER_SDK_KEY__
  });

  // 独立会话嵌入 iframe,无底部导航和返回按钮
  var url = xtelf.openWebChatOnly("kefu_001", { returnUrl: true });
  document.getElementById("chatFrame").src = url;
</script>
注意:如果聊天页面和宿主页面不在同一域名下,需要确保服务端允许 iframe 嵌入(X-Frame-Options 或 CSP frame-ancestors 配置)。

4. 未读消息角标

xtelf.addChatNumPushEvent(showDivId)

在指定的 DOM 元素上自动显示未读消息数角标。调用后每 2 秒轮询一次未读数,自动创建/更新/移除角标 DOM。

参数类型说明
showDivId必填String要挂载角标的容器元素 ID,该元素需设置 position: relative
SDK 会自动引入角标样式文件 static/xtelf_style/xtelf.css,无需手动引入。
<div id="msg-icon" style="position: relative;">
  <img src="chat-icon.png" />
</div>

<script>
  var xtelf = XtelfAPI.init({ userSdkKey: "..." });
  xtelf.addChatNumPushEvent("msg-icon");
</script>

5. OA 登录聊天

xtelf.oaOpenWebChat(oaToken, oaUserId, options) 页面跳转

使用 OA 系统的 Token 和用户 ID 认证,直接打开聊天首页。适用于 OA 系统免密集成场景,无需 userSdkKey

参数类型说明
oaToken必填StringOA 系统签发的认证 Token
oaUserId必填StringOA 系统中的用户 ID
options可选Object{ returnUrl: true } 时仅返回 URL 字符串,不打开页面
// 默认:打开页面
xtelf.oaOpenWebChat("oa-token-xxx", "user_zhangsan");

// returnUrl:获取 URL
var url = xtelf.oaOpenWebChat("oa-token-xxx", "user_zhangsan", { returnUrl: true });

6. 打开聊天

xtelf.openWebChat(targetChatId, options) 页面跳转

打开完整的聊天界面。传入目标 ID 时直接进入与该用户或群的聊天;不传时进入消息列表首页。包含完整的底部导航(消息、通讯录、我的)。

参数类型说明
targetChatId可选String目标用户 ID 或群组 ID。留空则打开消息列表
options可选Object{ returnUrl: true } 时仅返回 URL 字符串,不打开页面
// 默认:打开聊天
xtelf.openWebChat("user001");

// returnUrl:获取 URL 用于 iframe
var url = xtelf.openWebChat("user001", { returnUrl: true });

// 不指定目标,获取消息列表 URL
var listUrl = xtelf.openWebChat(null, { returnUrl: true });

7. 独立会话

xtelf.openWebChatOnly(targetChatId, options) 页面跳转

打开精简的独立聊天窗口,隐藏左侧菜单(PC)/ 底部导航和返回按钮(H5),用户只能在当前会话中操作,无法切换到其他功能。适用于嵌入式客服、工单沟通等场景。

参数类型说明
targetChatId可选String目标用户 ID 或群组 ID。留空则显示人员选择界面
options可选Object{ returnUrl: true } 时仅返回 URL 字符串,不打开页面
// 默认:打开独立聊天
xtelf.openWebChatOnly("kefu_001");

// returnUrl:嵌入 iframe(推荐用于客服场景)
var url = xtelf.openWebChatOnly("kefu_001", { returnUrl: true });
document.getElementById("chatFrame").src = url;

8. 无菜单聊天

xtelf.openWebChatNoMenu(options) 页面跳转

打开消息列表,但隐藏导航菜单(PC 隐藏左侧栏 / H5 隐藏底部 Tab 栏)。用户可以浏览和选择会话,但无法进入通讯录、个人中心等页面。

参数类型说明
options可选Object{ returnUrl: true } 时仅返回 URL 字符串,不打开页面
// 默认:打开无菜单聊天
xtelf.openWebChatNoMenu();

// returnUrl
var url = xtelf.openWebChatNoMenu({ returnUrl: true });

9. 创建业务群并聊天

xtelf.createGroupAndChat(bussinessId, bussinessType, groupMemberIds, groupName, options) 接口 + 跳转

调用后端接口创建业务群组,创建成功后自动打开该群聊天。适用于 OA 审批流、项目协作等需要按业务自动建群的场景。

参数类型说明
bussinessId必填String业务 ID,用于关联业务系统中的实体(如工单号、项目编号)
bussinessType必填String业务类型标识
groupMemberIds必填Array群成员用户 ID 数组,如 ["user001", "user002"]
groupName必填String群组名称
options可选Object{ returnUrl: true } 时返回 Promise<String>,resolve 后得到 URL
注意:此方法会调用真实后端接口创建群组。同一 bussinessId + bussinessType 重复调用可能创建多个群。
// 默认:创建群并打开聊天
xtelf.createGroupAndChat(
  "approval-2024-001", "oa-approval",
  ["zhang_san", "li_si"], "采购审批讨论群"
);

// returnUrl:创建群后获取 URL
xtelf.createGroupAndChat(
  "approval-2024-001", "oa-approval",
  ["zhang_san", "li_si"], "采购审批讨论群",
  { returnUrl: true }
).then(function(url) {
  if (url) document.getElementById("chatFrame").src = url;
});

10. 打开业务群聊天

xtelf.openGroupAndChat(bussinessId, bussinessType, options) 接口 + 跳转

根据业务 ID 和类型查询已有的业务群,找到后直接打开该群聊天。

参数类型说明
bussinessId必填String业务 ID
bussinessType必填String业务类型标识
options可选Object{ returnUrl: true } 时返回 Promise<String>,resolve 后得到 URL
// 默认:打开群聊天
xtelf.openGroupAndChat("approval-2024-001", "oa-approval");

// returnUrl
xtelf.openGroupAndChat("approval-2024-001", "oa-approval", { returnUrl: true })
  .then(function(url) {
    if (url) document.getElementById("chatFrame").src = url;
  });

11. 查看群聊天记录

xtelf.openGroupChatRecord(bussinessId, bussinessType, options) 接口 + 跳转

根据业务 ID 和类型查询已有的业务群,打开该群的聊天记录页面(只读查看模式)。

参数类型说明
bussinessId必填String业务 ID
bussinessType必填String业务类型标识
options可选Object{ returnUrl: true } 时返回 Promise<String>,resolve 后得到 URL
// 默认:打开聊天记录
xtelf.openGroupChatRecord("approval-2024-001", "oa-approval");

// returnUrl
xtelf.openGroupChatRecord("approval-2024-001", "oa-approval", { returnUrl: true })
  .then(function(url) {
    if (url) document.getElementById("recordFrame").src = url;
  });

12. 添加群成员

xtelf.addGroupMember(bussinessId, bussinessType, memberIds) 接口调用

向指定业务群中添加新成员。操作成功后弹出提示,不跳转页面。

参数类型说明
bussinessId必填String业务 ID
bussinessType必填String业务类型标识
memberIds必填Array要添加的成员用户 ID 数组,如 ["user003", "user004"]
xtelf.addGroupMember(
  "approval-2024-001",
  "oa-approval",
  ["wang_wu", "zhao_liu"]
);

13. 删除群成员

xtelf.delGroupMember(bussinessId, bussinessType, memberIds) 接口调用

从指定业务群中移除成员。操作成功后弹出提示,不跳转页面。

参数类型说明
bussinessId必填String业务 ID
bussinessType必填String业务类型标识
memberIds必填Array要移除的成员用户 ID 数组
xtelf.delGroupMember(
  "approval-2024-001",
  "oa-approval",
  ["zhao_liu"]
);

14. 多端适配说明

SDK 内置了终端检测,所有 页面跳转 类方法会根据当前设备自动选择打开方式:

场景PC 浏览器H5 移动端
打开方式window.open 新窗口弹出location.href 当前页跳转
隐藏菜单 showLeft=false隐藏左侧导航栏隐藏底部 Tab 栏
独立会话 onlyChat隐藏左侧栏 + 会话列表隐藏底部 Tab + 搜索栏 + 返回按钮
聊天记录 viewRecord同一页面组件,自动适配 PC/H5 布局
returnUrl 模式不区分终端,直接返回 URL 字符串,由调用方决定如何使用
H5 页面跳转后的返回:移动端使用 location.href 跳转,用户可通过浏览器返回键回到原页面。如果是在 WebView 中集成,需确保 WebView 支持返回导航。使用 returnUrl 模式嵌入 iframe 则无此问题。

完整集成示例

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>OA 系统</title>
</head>
<body>
  <!-- 消息入口,显示未读角标 -->
  <div id="msg-entry" style="position:relative;display:inline-block">
    <button onclick="openChat()">消息中心</button>
  </div>

  <!-- 客服 iframe 嵌入 -->
  <iframe id="chatFrame"
    style="width:400px;height:600px;border:1px solid #e0e0e0;border-radius:8px;"
    allow="camera;microphone">
  </iframe>

  <script src="https://your-domain.com/xtelf/static/xtelf_api.js"></script>
  <script>
    var xtelf = XtelfAPI.init({
      userSdkKey: window.__USER_SDK_KEY__,
      webTitle: "OA协同办公"
    });

    // 启动未读数角标
    xtelf.addChatNumPushEvent("msg-entry");

    // 弹窗打开完整聊天
    function openChat() {
      xtelf.openWebChat();
    }

    // iframe 嵌入独立客服会话
    var kefuUrl = xtelf.openWebChatOnly("kefu_001", { returnUrl: true });
    document.getElementById("chatFrame").src = kefuUrl;
  </script>
</body>
</html>