开放 API 与 Webhook,让客服能力融入你的业务系统
X-App-Id / X-App-Secret),在后台「系统 → 开放平台」创建应用获取;后台管理接口使用 JWT 登录态调用。接口基址为 /api,在线文档(Swagger)见 /api/docs。
后台「系统 → 开放平台」创建应用,获取 X-App-Id 与 X-App-Secret(密钥仅创建/重置时显示一次),调用 /api/openapi/* 开放接口,无需用户登录态:
X-App-Id: ap_xxxxxxxxxxxxxxxx
X-App-Secret: tks_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
按应用独立限流:QPS(默认 10/秒)+ 日配额(默认 10000/日),后台可调。凭证错误返回 401、应用/企业停用 403、超限 429。
管理员/坐席登录后调用管理接口,Token 有效期 12 小时:
Authorization: Bearer <access_token>
POST /api/login
{"username": "admin", "password": "******"}
角色:superadmin(平台)、admin(租户管理)、agent(坐席)。所有接口 HTTPS 传输、JSON 响应、多租户数据隔离。
创建会话,返回 session_id、欢迎语与快捷问题。可指定机器人(bot_id)、渠道与用户标签。同一访客刷新页面时传入 client_id(浏览器持久化标识)与 session_id(上次会话)可复用未结束会话并恢复历史(响应 reused=true,连接 WS 自动补发最近 50 条消息)。
{
"source": "app", // 渠道标识:web/wechat/wecom/douyin/app...
"user_id": "u_10001", // 可选,业务侧用户ID
"bot_id": 3, // 可选,指定机器人
"client_id": "c_m7x2k9ab", // 可选,访客端持久化标识(localStorage),刷新后恢复同一会话
"session_id": "a1b2c3d4e5f60708" // 可选,上次会话 ID,命中且归属匹配则复用并恢复历史
}
实时对话 WebSocket:收发消息、AI 意图、typing、转人工、满意度评价。
// 发送
{"type": "message", "content": "你们发货用什么快递?"}
{"type": "transfer"} // 转人工
{"type": "rate", "star": 5, "note": "满意"}
// 接收
{"type": "message", "sender": "ai", "content": "我们默认使用顺丰发货"}
{"type": "transfer_result", "status": "waiting"}
{"type": "agent_joined", "agent": "客服小美"}
知识列表(支持关键词/分类/状态过滤)。
新增知识,支持相似问法(question 换行分隔)。
{
"question": "多久发货?\n几天能发出来?",
"answer": "现货 24-48 小时内发货。",
"category": "物流",
"active": true
}
更新 / 删除知识。
CSV 批量导入问答,业务系统可自动同步 FAQ 与商品资料。
未命中问题列表 / 一键转知识(驱动知识库持续优化)。
租户看板:咨询量、AI 解决率、满意度、24h 趋势、来源分布。
平台总览(superadmin):全租户指标 + 租户排行。
每周运营报告;POST /api/analytics/reports/generate 手动生成。
知识库优化建议列表 / 一键应用(自动写入知识库并重建索引)。
创建工单(自动分派、SLA 计时)。
工单列表 / 更新工单状态与处理结果(含流转历史)。
从会话一键创建工单。
客户自助查询工单进度(公开接口,预留手机号校验防枚举)。
客户报「订单号 / 手机号」,客服与 AI 一键查询订单状态 / 物流 / 退款进度,统一订单模型屏蔽平台差异。platform 支持:mock(演示)/ taobao / jd / pdd / douyin。
订单查询(order_no / phone / name 任一即可)。
POST /api/orders/mock/query
Authorization: Bearer <token>
{"order_no": "TK202608260001"}
订单详情(商品明细、金额、状态、物流轨迹)。
物流轨迹查询。
退款/售后进度查询(按订单号或手机号)。
接收电商平台订单消息推送,返回格式化文本供客服/AI 直接呈现。
{"event": "order_status", "order_no": "TK202608260001", "payload": {}}
真实平台接入:在平台开放门户(open.taobao.com / open.jd.com / open.pinduoduo.com / openapi-fxg.jinritemai.com)创建应用并完成商家授权,将凭证配置到系统环境变量(TAOBAO_* / JD_* / PDD_* / DOUYIN_*)后自动切换真实数据;未配置密钥时使用 mock 演示数据。生产环境务必服务端保存密钥、启用 HTTPS、接口加 IP 白名单。
以 X-App-Id / X-App-Secret 调用(无需登录态,按应用限流):
订单查询(同订单接口,支持 platform 参数,默认 mock)。
curl -X POST /api/openapi/orders/query \
-H "X-App-Id: ap_xxxxxxxx" \
-H "X-App-Secret: tks_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"order_no": "O202608260001", "platform": "taobao"}'
工单列表(status/priority 过滤)/ 工单详情(只读)。
查询当前应用当日配额用量与上限。
导出第三方可调用接口的 OpenAPI 文档(admin,可直接导入 Postman/Apifox)。
流程调试运行:按当前(可未发布)定义执行,返回逐步日志与最终回复,不落库、不挂起。
流程运行记录(含审批挂起状态)/ 单次运行详情。
人工审批挂起的审批节点:同意沿「同意」边续跑、拒绝沿「拒绝」边(无则 default),最终回复自动推送客户。
{"decision": "approve", "note": "同意放行"}
系统对后台写操作(POST/PUT/DELETE/PATCH)自动留痕:操作者、角色、模块、动作、路径、来源 IP。日志仅追加、不可删除,不记录请求 Body(避免误存敏感信息),满足 GB/T 47746-2026 合规审计要求。
审计日志查询(admin 看本租户,superadmin 看全平台)。按模块、动作(create/update/delete)、操作人、时间范围过滤。
在后台配置回调 URL 并订阅事件(POST /api/webhooks 创建,POST /api/webhooks/{id}/test 测试推送,GET /api/webhooks/logs 查看投递日志),系统实时推送(带签名验证):
| 事件类型 | 说明 |
|---|---|
session.created | 新会话创建 |
message.received | 收到客户消息 |
message.ai_replied | AI 完成回复 |
transfer.created | 触发转人工(含原因) |
ticket.created / updated | 工单创建 / 更新 |
rating.submitted | 客户提交满意度评价 |
knowledge.miss | 产生未解决问题(可驱动知识库优化) |
回调签名验证:请求头 X-TianKey-Signature = HMAC-SHA256(Webhook Secret, 原始 Body),请验签后处理,防止伪造。
Python 示例:开放平台凭证查询订单
import requests
API = "https://<你的域名>/api"
resp = requests.post(f"{API}/openapi/orders/query",
headers={"X-App-Id": "ap_xxx", "X-App-Secret": "tks_xxx"},
json={"order_no": "TK202608260001", "platform": "mock"})
print(resp.json()["count"]) # 命中订单数
print(resp.json()["items"]) # 订单列表
JavaScript 示例:Webhook 验签
const crypto = require("crypto");
// 收到回调后验签
const sig = crypto
.createHmac("sha256", process.env.WEBHOOK_SECRET)
.update(rawBody)
.digest("hex");
if (req.headers["x-tiankey-signature"] !== sig) return res.status(401).end();
// 处理事件…
除后端 API 外,网页端提供两种接入形态:悬浮窗组件(右下角悬浮球 + 弹窗,移动端自动全屏)与 iframe 内嵌(把整页聊天窗口嵌入页面任意区域)。代码可在后台一键生成:「渠道管理 → Web 渠道 → 嵌入代码」(可带来源渠道标识)或「系统设置 → 客服窗口设置 → 复制嵌入代码」。
粘贴到网站 <body> 末尾(域名与租户 ID 由后台自动生成):
<script src="https://<你的域名>/widget.js"></script>
<script>
window.TKC_CONFIG = {
chatUrl: "https://<你的域名>/chat?company=1",
companyId: 1, // 租户 ID,缺省按 chatUrl 上的 company 参数
// 可选覆盖项(不填则跟随后台「系统设置 - 客服窗口设置」);下方各项已带逗号,取消注释即生效:
// accentColor: "#2563eb", // 悬浮按钮主题色
// bgColor: "#ffffff", // 窗口背景色,"transparent" 透出页面底色
// position: "bottom-right", // bottom-right | bottom-left | top-right | top-left
// offsetX: 24, offsetY: 24, // 距边缘的水平 / 垂直边距 px(0-200)
// logo: "🤖", // 悬浮图标:emoji/文字 或 图片 URL
// bubbleText: "在线客服", // 悬浮图标悬停提示文案
// autoOpen: 0 // 自动弹窗延迟毫秒,0 = 不自动打开
};
</script>
配置优先级:代码中的显式配置 > 后台「客服窗口设置」下发的配置。因此若希望主题色、图标、位置完全由后台控制,请保持这些项处于注释状态;一旦写上具体值,后台改动将不再生效。
| 配置项 | 示例 | 说明 |
|---|---|---|
chatUrl | "https://域名/chat" | 聊天页地址(必填),建议带 company 与 source 参数 |
companyId | 1 | 租户 ID,用于拉取后台「客服窗口设置」与会话归属 |
configUrl | "/api/chat/widget-config" | 配置接口地址,缺省由 chatUrl 推导同源地址 |
accentColor | "#2563eb" | 悬浮按钮主题色(优先级高于后台配置) |
bgColor | "#ffffff" | 窗口背景色;"transparent" 透出页面底色 |
position | "bottom-right" | bottom-right / bottom-left / top-right / top-left(兼容 right、left) |
offsetX / offsetY | 24 | 距边缘的水平 / 垂直边距 px(0-200) |
logo | "🤖" | 悬浮图标:emoji / 文字 或 图片 URL,空 = 内置图标 |
bubbleText | "在线客服" | 悬浮图标的悬停提示文案 |
autoOpen | 2500 | 自动弹窗延迟毫秒,0 或省略 = 不自动打开 |
<iframe
src="https://<你的域名>/chat?source=官网&company=1&embed=1&transparent=1"
title="在线客服"
allow="microphone; camera; autoplay; fullscreen"
allowtransparency="true"
style="width:100%;height:600px;min-height:320px;border:0;"></iframe>
allow 中的 microphone; camera 不可省略:跨源 iframe 默认没有媒体权限,缺失会导致窗口内语音发送与拍照上传失败。embed=1 让聊天卡片铺满 iframe(去掉留白与圆角),transparent=1 使卡片四周透出宿主页面底色;高度可按布局调整(建议不低于 320px,容器宽度不小于 360px)。
以下参数拼在 chatUrl 或 iframe 的 src 之后(首个参数用 ?,后续用 &),中文与 # 需 URL 编码(# 写作 %23):
| 参数 | 示例 | 说明 |
|---|---|---|
company | company=1 | 租户 ID(多租户隔离;缺省取后端默认租户) |
source | source=官网 | 来源渠道标识,坐席工作台显示为来源标签;缺省用当前页面 URL |
title | title=售前咨询 | 聊天窗口标题,缺省用系统默认标题 |
customer_name | customer_name=张三 | 预填访客姓名,便于坐席识别 |
customer_phone | customer_phone=13800138000 | 预填手机号,用于人工通知与回呼 |
bg | bg=%23ffffff | 聊天页背景色;bg=transparent 为全透明 |
transparent | transparent=1 | 背景透明透出宿主页面;0 = 恢复系统渐变 |
embed | embed=1 | 聊天卡片铺满 iframe;0 = 居中卡片 |
phone_verify | phone_verify=0 | 0 = 不常驻留资条,仅点「转人工」时弹出;1 = 常驻(默认) |
bot_id | bot_id=2 | 指定接待机器人,缺省按渠道与关键词路由 |
utm_source / utm_medium / utm_campaign | utm_source=baidu | 推广归因参数,随会话落库供统计 |
companyId 或 chatUrl 上的 company 参数已正确填写,二者都没有时会落到默认租户。allow="microphone; camera"。悬浮窗方式由 widget.js 自行处理,无需配置。accentColor,显式配置会覆盖后台设置,删除该行即可恢复由后台控制。z-index 的元素或 overflow: hidden 容器;也可调 position 与 offsetX/offsetY 避让。