im.io 是一款嵌入式多语言在线客服系统。只需在网站页面引入 widget.js 并设置 window.CHAT_WIDGET_CONFIG 配置,即可拥有实时聊天能力。
<!-- 第 1 步:设置站点配置(必须在引入 SDK 之前) --> <script> window.CHAT_WIDGET_CONFIG = { siteId: 'your-site-id', // 站点 ID(管理后台创建站点后获取) autoOpen: false, // 是否自动打开聊天窗口 position: 'right', // 悬浮按钮位置 left | right themeColor: '#6366f1', // 主题色(可选,默认 #667eea) openTrigger: '.btn-chat', // CSS 选择器触发打开(可选) defaultLang: 'zh-CN', // 默认语言(可选) }; </script> <!-- 第 2 步:引入 SDK(自动读取上方配置并初始化) --> <script src="/widget/widget.js"></script> <!-- 第 3 步:在按钮上添加触发标签(可选) --> <button data-chat-open="立即购买">立即购买</button>
| 组件 | 版本要求 | 说明 |
|---|---|---|
| PHP | ≥ 8.0 | 推荐 8.2+ |
| MySQL | ≥ 5.7 | 推荐 8.0(支持 JSON 字段) |
| Redis | ≥ 6.0 | 用于在线状态、未读计数、缓存 |
| Composer | ≥ 2.0 | PHP 依赖管理 |
| Webman | ≥ 2.0 | 高性能 HTTP 框架 |
| GatewayWorker | ≥ 3.0 | WebSocket 长连接 |
# 1. 克隆项目 git clone <repo-url> im.io cd im.io # 2. 安装 PHP 依赖 composer install # 3. 导入数据库(按顺序执行) mysql -uroot -p im.io < sql/01_init.sql mysql -uroot -p im.io < sql/11_site_translate_enabled.sql mysql -uroot -p im.io < sql/12_trigger_reply.sql # 4. 配置 .env(数据库、Redis、翻译 API) cp .env.example .env # 编辑 .env 设置 DB_*, REDIS_*, BAIDU_TRANSLATE_* # 5. 启动服务 php start.php start # HTTP 服务 php start.php start gateway # WebSocket 服务(新终端)
Widget 是零依赖的原生 JS 组件。通过 window.CHAT_WIDGET_CONFIG 配置后,SDK 自动初始化:
<!-- 最简配置:只需 siteId --> <script> window.CHAT_WIDGET_CONFIG = { siteId: 'your-site-id' }; </script> <script src="https://your-domain.com/widget/widget.js"></script>
SDK 在 DOMContentLoaded 时自动读取 window.CHAT_WIDGET_CONFIG 并创建聊天组件,悬浮按钮和聊天窗口自动渲染,无需额外 HTML。
在 window.CHAT_WIDGET_CONFIG 中可设置以下字段:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| siteId | string | 'default-site' | 必填,站点 ID |
| siteName | string | '' | 站点名称(显示在聊天窗口标题栏) |
| themeColor | string | '#667eea' | 主题色(十六进制或 CSS 渐变) |
| position | string | 'right' | 悬浮按钮位置:left | right |
| bottom | string | '30px' | 悬浮按钮距底部距离 |
| offset | string | '30px' | 悬浮按钮距侧边距离 |
| showMobile | boolean | true | 是否在移动端显示 |
| autoOpen | boolean | false | 是否自动打开聊天窗口 |
| openTrigger | string | '' | CSS 选择器,匹配元素点击时打开聊天(支持数组) |
| lang | string | '' | 强制指定语言(如 'en'),优先级最高 |
| defaultLang | string | '' | 默认语言(用户未手动切换时使用) |
| apiBase | string | '/api/widget' | API 基础路径 |
| wsBase | string | '' | WebSocket 地址(空 = 同域 /ws) |
| agentName | string | '' | 预设客服名称(显示用) |
lang 强制指定 > 用户手动切换 > defaultLang > 浏览器自动探测 > 后端站点默认语言。SDK 初始化后自动注册 window.CHAT_WIDGET 全局对象,可在任何地方调用:
| 方法 | 参数 | 说明 |
|---|---|---|
| open(trigger) | trigger?: string | 打开聊天窗口,可选传入触发标签 |
| close() | — | 关闭聊天窗口 |
| toggle() | — | 切换打开/关闭状态 |
// 普通打开 window.CHAT_WIDGET.open(); // 带触发标签打开(触发自动回复 + 通知客服意图) window.CHAT_WIDGET.open('立即购买'); // 关闭 window.CHAT_WIDGET.close();
触发标签让访客的进入意图一目了然。访客通过特定按钮(如「立即购买」「在线咨询」)打开聊天时,系统自动:
🔔 访客通过「立即购买」按钮进入咨询<!-- 方式 1:data-chat-open 属性(推荐) --> <button data-chat-open="立即购买">立即购买</button> <button data-chat-open="在线咨询">在线客服</button> <!-- 方式 2:无值,取元素文本作为标签 --> <button data-chat-open>联系客服</button> <!-- 方式 3:JS 编程调用 --> <button onclick="window.CHAT_WIDGET.open('立即购买')">购买</button>
im.io 支持访客与客服跨语言沟通时自动翻译,基于百度翻译 API。
| 层级 | 控制点 | 说明 |
|---|---|---|
| 全局 | .env BAIDU_TRANSLATE_ENABLE | 全局翻译总开关 |
| 站点 | 站点设置 → 翻译开关 | 每个站点独立控制翻译开关 |
| 访客 | 访客语言检测 | 访客语言为中文时自动跳过翻译 |
访问 /admin/auth/login.html 进入管理后台登录页。
在「站点设置」页面可配置:
在「客服与绑定」页面管理客服账号:
在「站点设置 → 触发标签自动回复」区块管理触发标签与回复内容:
data-chat-open="立即购买" → 后端查找该标签的预设回复 → 自动推送给访客 + 系统消息通知客服意图。在客服工作台「⚡ 快捷话术」面板中,可预设常用回复话术(支持多语言),客服一键发送,提升响应效率。
| 接口 | 方法 | 说明 |
|---|---|---|
| /api/widget/init | POST | 初始化访客 + 会话 |
| /api/widget/send-message | POST | 发送消息 |
| /api/widget/trigger-open | POST | 触发标签打开 |
| /api/widget/leave-message | POST | 提交离线留言 |
| /api/widget/upload-image | POST | 上传图片 |
| /api/widget/read-message | POST | 标记已读 |
| 接口 | 方法 | 说明 |
|---|---|---|
| /admin/session/list | GET | 会话列表 |
| /admin/session/close | POST | 结束会话(→ waiting) |
| /admin/session/transfer | POST | 转接会话 |
| /admin/session/messages | GET | 获取会话消息 |
| /admin/agent/* | GET/POST | 客服账号 CRUD |
| /admin/site/* | GET/POST | 站点配置 |
| /admin/trigger-reply/* | GET/POST | 触发回复 CRUD |
| /admin/quick-reply/* | GET/POST | 快捷话术 CRUD |
| /admin/stat/* | GET | 统计数据 |
检查:1) CHAT_WIDGET_CONFIG.siteId 是否正确;2) 站点是否已启用;3) 浏览器控制台是否有报错;4) widget.js 路径是否正确;5) 配置必须在 SDK 引入之前设置。
检查:1) GatewayWorker 服务是否启动;2) WebSocket 连接是否成功(检查 ws:// 地址);3) 站点是否绑定了在线客服。
检查:1) .env 中 BAIDU_TRANSLATE_APPID 和 BAIDU_TRANSLATE_SECRET 是否配置;2) 站点翻译开关是否开启;3) 访客语言是否为中文(中文不翻译)。
系统已内置 3 秒延迟检查机制:客服刷新页面时旧连接断开,3 秒内重连则不触发离线逻辑,会话保持不变。
会话状态变为 waiting,admin_id 清空,访客回到等待接入池。历史消息完整保留,访客可继续发消息,系统自动分配新客服。
| 版本 | 日期 | 内容 |
|---|---|---|
| 1.2 | 2026-08 | 触发标签自动回复、站点翻译开关、客服刷新延迟保护 |
| 1.1 | 2026-08 | 多语言翻译、客服离线自动重分配、会话生命周期管理 |
| 1.0 | 2026-07 | 初始版本:嵌入式 Widget、多站点管理、WebSocket 实时通信 |