小天互连 Web/H5 SDK 接入指南
将小天互连 IM 聊天能力集成到第三方 Web / H5 应用
xtelf_api.js1. 快速接入
引入 SDK
在页面中引入 xtelf_api.js,该文件部署在小天互连 Web 应用的 static/ 目录下:
<script src="https://your-domain.com/xtelf/static/xtelf_api.js"></script>
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. 初始化
初始化 SDK 实例。所有后续方法调用都必须通过该实例进行。
| 参数 | 类型 | 说明 |
|---|---|---|
| userSdkKey必填 | String | 用户身份令牌,由后端签发,用于聊天类接口的认证 |
| appId可选 | String | 应用 appId |
| webTitle可选 | String | PC 端弹窗标题,默认 "小天互连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)。
同步方法
openWebChat、openWebChatOnly、openWebChatNoMenu、oaOpenWebChat 直接返回 URL 字符串:
// 获取聊天页面 URL
var chatUrl = xtelf.openWebChat("user001", { returnUrl: true });
// 嵌入 iframe
document.getElementById("chatFrame").src = chatUrl;
异步方法
createGroupAndChat、openGroupAndChat、openGroupChatRecord 需要先请求后端接口,返回 Promise,resolve 后得到 URL:
// 创建业务群并获取 URL
xtelf.createGroupAndChat(
"approval-001", "oa-approval",
["zhang_san"], "审批群",
{ returnUrl: true }
).then(function(url) {
if (url) {
document.getElementById("chatFrame").src = url;
}
});
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>
X-Frame-Options 或 CSP frame-ancestors 配置)。
4. 未读消息角标
在指定的 DOM 元素上自动显示未读消息数角标。调用后每 2 秒轮询一次未读数,自动创建/更新/移除角标 DOM。
| 参数 | 类型 | 说明 |
|---|---|---|
| showDivId必填 | String | 要挂载角标的容器元素 ID,该元素需设置 position: relative |
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 登录聊天
使用 OA 系统的 Token 和用户 ID 认证,直接打开聊天首页。适用于 OA 系统免密集成场景,无需 userSdkKey。
| 参数 | 类型 | 说明 |
|---|---|---|
| oaToken必填 | String | OA 系统签发的认证 Token |
| oaUserId必填 | String | OA 系统中的用户 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. 打开聊天
打开完整的聊天界面。传入目标 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. 独立会话
打开精简的独立聊天窗口,隐藏左侧菜单(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;
9. 创建业务群并聊天
调用后端接口创建业务群组,创建成功后自动打开该群聊天。适用于 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. 打开业务群聊天
根据业务 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. 查看群聊天记录
根据业务 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. 添加群成员
向指定业务群中添加新成员。操作成功后弹出提示,不跳转页面。
| 参数 | 类型 | 说明 |
|---|---|---|
| bussinessId必填 | String | 业务 ID |
| bussinessType必填 | String | 业务类型标识 |
| memberIds必填 | Array | 要添加的成员用户 ID 数组,如 ["user003", "user004"] |
xtelf.addGroupMember(
"approval-2024-001",
"oa-approval",
["wang_wu", "zhao_liu"]
);
13. 删除群成员
从指定业务群中移除成员。操作成功后弹出提示,不跳转页面。
| 参数 | 类型 | 说明 |
|---|---|---|
| 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 字符串,由调用方决定如何使用 | |
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>