快速开始

im.io 是一款嵌入式多语言在线客服系统。只需在网站页面引入 widget.js 并设置 window.CHAT_WIDGET_CONFIG 配置,即可拥有实时聊天能力。

HTML
<!-- 第 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>
提示: window.CHAT_WIDGET_CONFIG 必须在 widget.js 引入之前设置。SDK 加载后会自动读取配置并初始化,无需手动调用构造函数。访问 管理后台 创建站点和配置客服。

环境要求

组件版本要求说明
PHP≥ 8.0推荐 8.2+
MySQL≥ 5.7推荐 8.0(支持 JSON 字段)
Redis≥ 6.0用于在线状态、未读计数、缓存
Composer≥ 2.0PHP 依赖管理
Webman≥ 2.0高性能 HTTP 框架
GatewayWorker≥ 3.0WebSocket 长连接

安装部署

Shell
# 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

Widget 是零依赖的原生 JS 组件。通过 window.CHAT_WIDGET_CONFIG 配置后,SDK 自动初始化:

HTML
<!-- 最简配置:只需 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 中可设置以下字段:

参数类型默认值说明
siteIdstring'default-site'必填,站点 ID
siteNamestring''站点名称(显示在聊天窗口标题栏)
themeColorstring'#667eea'主题色(十六进制或 CSS 渐变)
positionstring'right'悬浮按钮位置:left | right
bottomstring'30px'悬浮按钮距底部距离
offsetstring'30px'悬浮按钮距侧边距离
showMobilebooleantrue是否在移动端显示
autoOpenbooleanfalse是否自动打开聊天窗口
openTriggerstring''CSS 选择器,匹配元素点击时打开聊天(支持数组)
langstring''强制指定语言(如 'en'),优先级最高
defaultLangstring''默认语言(用户未手动切换时使用)
apiBasestring'/api/widget'API 基础路径
wsBasestring''WebSocket 地址(空 = 同域 /ws)
agentNamestring''预设客服名称(显示用)
语言优先级: lang 强制指定 > 用户手动切换 > defaultLang > 浏览器自动探测 > 后端站点默认语言。

Widget API

SDK 初始化后自动注册 window.CHAT_WIDGET 全局对象,可在任何地方调用:

方法参数说明
open(trigger)trigger?: string打开聊天窗口,可选传入触发标签
close()关闭聊天窗口
toggle()切换打开/关闭状态
JavaScript
// 普通打开
window.CHAT_WIDGET.open();

// 带触发标签打开(触发自动回复 + 通知客服意图)
window.CHAT_WIDGET.open('立即购买');

// 关闭
window.CHAT_WIDGET.close();

触发标签功能

触发标签让访客的进入意图一目了然。访客通过特定按钮(如「立即购买」「在线咨询」)打开聊天时,系统自动:

使用方式

HTML
<!-- 方式 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

接口方法说明
/api/widget/initPOST初始化访客 + 会话
/api/widget/send-messagePOST发送消息
/api/widget/trigger-openPOST触发标签打开
/api/widget/leave-messagePOST提交离线留言
/api/widget/upload-imagePOST上传图片
/api/widget/read-messagePOST标记已读

管理端 API

接口方法说明
/admin/session/listGET会话列表
/admin/session/closePOST结束会话(→ waiting)
/admin/session/transferPOST转接会话
/admin/session/messagesGET获取会话消息
/admin/agent/*GET/POST客服账号 CRUD
/admin/site/*GET/POST站点配置
/admin/trigger-reply/*GET/POST触发回复 CRUD
/admin/quick-reply/*GET/POST快捷话术 CRUD
/admin/stat/*GET统计数据

常见问题

Q: Widget 不显示?

检查:1) CHAT_WIDGET_CONFIG.siteId 是否正确;2) 站点是否已启用;3) 浏览器控制台是否有报错;4) widget.js 路径是否正确;5) 配置必须在 SDK 引入之前设置。

Q: 消息收不到?

检查:1) GatewayWorker 服务是否启动;2) WebSocket 连接是否成功(检查 ws:// 地址);3) 站点是否绑定了在线客服。

Q: 翻译不工作?

检查:1) .envBAIDU_TRANSLATE_APPIDBAIDU_TRANSLATE_SECRET 是否配置;2) 站点翻译开关是否开启;3) 访客语言是否为中文(中文不翻译)。

Q: 客服刷新页面后会话丢失?

系统已内置 3 秒延迟检查机制:客服刷新页面时旧连接断开,3 秒内重连则不触发离线逻辑,会话保持不变。

Q: 客服结束会话后访客怎么办?

会话状态变为 waitingadmin_id 清空,访客回到等待接入池。历史消息完整保留,访客可继续发消息,系统自动分配新客服。

更新日志

版本日期内容
1.22026-08触发标签自动回复、站点翻译开关、客服刷新延迟保护
1.12026-08多语言翻译、客服离线自动重分配、会话生命周期管理
1.02026-07初始版本:嵌入式 Widget、多站点管理、WebSocket 实时通信