开发者中心

开放 API 与 Webhook,让客服能力融入你的业务系统

接口说明:天科云开放平台提供 RESTful API 与 Webhook 事件订阅。第三方系统对接推荐使用开放平台应用凭证(X-App-Id / X-App-Secret),在后台「系统 → 开放平台」创建应用获取;后台管理接口使用 JWT 登录态调用。接口基址为 /api,在线文档(Swagger)见 /api/docs。

1. 认证方式

方式一:开放平台应用凭证(第三方系统对接,推荐)

后台「系统 → 开放平台」创建应用,获取 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。

方式二:JWT 登录态(后台管理接口)

管理员/坐席登录后调用管理接口,Token 有效期 12 小时:

Authorization: Bearer <access_token>
POST /api/login
{"username": "admin", "password": "******"}

角色:superadmin(平台)、admin(租户管理)、agent(坐席)。所有接口 HTTPS 传输、JSON 响应、多租户数据隔离。

2. 智能问答接口

POST/api/chat/session

创建会话,返回 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,命中且归属匹配则复用并恢复历史
}
WS/api/ws/chat/{session_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": "客服小美"}

3. 知识库接口

GET/api/admin/knowledge

知识列表(支持关键词/分类/状态过滤)。

POST/api/admin/knowledge

新增知识,支持相似问法(question 换行分隔)。

{
  "question": "多久发货?\n几天能发出来?",
  "answer": "现货 24-48 小时内发货。",
  "category": "物流",
  "active": true
}
PUT/api/admin/knowledge/{id} DELETE/api/admin/knowledge/{id}

更新 / 删除知识。

POST/api/admin/knowledge/import

CSV 批量导入问答,业务系统可自动同步 FAQ 与商品资料。

GET/api/admin/knowledge/miss POST/api/admin/knowledge/miss/{id}/resolve

未命中问题列表 / 一键转知识(驱动知识库持续优化)。

4. 运营数据接口

GET/api/analytics/overview?days=7

租户看板:咨询量、AI 解决率、满意度、24h 趋势、来源分布。

GET/api/analytics/platform?days=7

平台总览(superadmin):全租户指标 + 租户排行。

GET/api/analytics/reports

每周运营报告;POST /api/analytics/reports/generate 手动生成。

GET/api/analytics/suggestions POST/api/analytics/suggestions/{id}/apply

知识库优化建议列表 / 一键应用(自动写入知识库并重建索引)。

5. 工单接口

POST/api/tickets

创建工单(自动分派、SLA 计时)。

GET/api/tickets?status=&priority=&q= PUT/api/tickets/{id}

工单列表 / 更新工单状态与处理结果(含流转历史)。

POST/api/tickets/from-session/{session_id}

从会话一键创建工单。

POST/api/tickets/public-check

客户自助查询工单进度(公开接口,预留手机号校验防枚举)。

6. 订单系统对接

客户报「订单号 / 手机号」,客服与 AI 一键查询订单状态 / 物流 / 退款进度,统一订单模型屏蔽平台差异。platform 支持:mock(演示)/ taobao / jd / pdd / douyin。

POST/api/orders/{platform}/query

订单查询(order_no / phone / name 任一即可)。

POST /api/orders/mock/query
Authorization: Bearer <token>
{"order_no": "TK202608260001"}
GET/api/orders/{platform}/orders/{order_no}

订单详情(商品明细、金额、状态、物流轨迹)。

GET/api/orders/{platform}/orders/{order_no}/logistics

物流轨迹查询。

POST/api/orders/{platform}/refunds

退款/售后进度查询(按订单号或手机号)。

POST/api/orders/{platform}/webhook

接收电商平台订单消息推送,返回格式化文本供客服/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 白名单。

7. 开放平台应用接口

以 X-App-Id / X-App-Secret 调用(无需登录态,按应用限流):

POST/api/openapi/orders/query

订单查询(同订单接口,支持 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"}'
GET/api/openapi/tickets GET/api/openapi/tickets/{id}

工单列表(status/priority 过滤)/ 工单详情(只读)。

GET/api/openapi/me

查询当前应用当日配额用量与上限。

GET/api/openapi/export

导出第三方可调用接口的 OpenAPI 文档(admin,可直接导入 Postman/Apifox)。

8. 流程运行与人工审批

POST/api/flows/{fid}/debug

流程调试运行:按当前(可未发布)定义执行,返回逐步日志与最终回复,不落库、不挂起。

GET/api/flows/{fid}/runs GET/api/flows/runs/{run_id}

流程运行记录(含审批挂起状态)/ 单次运行详情。

POST/api/flows/runs/{run_id}/approve

人工审批挂起的审批节点:同意沿「同意」边续跑、拒绝沿「拒绝」边(无则 default),最终回复自动推送客户。

{"decision": "approve", "note": "同意放行"}

9. 操作审计日志

系统对后台写操作(POST/PUT/DELETE/PATCH)自动留痕:操作者、角色、模块、动作、路径、来源 IP。日志仅追加、不可删除,不记录请求 Body(避免误存敏感信息),满足 GB/T 47746-2026 合规审计要求。

GET/api/audit/logs?module=&action=&username=&page=1&page_size=50

审计日志查询(admin 看本租户,superadmin 看全平台)。按模块、动作(create/update/delete)、操作人、时间范围过滤。

10. Webhook 事件订阅

在后台配置回调 URL 并订阅事件(POST /api/webhooks 创建,POST /api/webhooks/{id}/test 测试推送,GET /api/webhooks/logs 查看投递日志),系统实时推送(带签名验证):

事件类型说明
session.created新会话创建
message.received收到客户消息
message.ai_repliedAI 完成回复
transfer.created触发转人工(含原因)
ticket.created / updated工单创建 / 更新
rating.submitted客户提交满意度评价
knowledge.miss产生未解决问题(可驱动知识库优化)

回调签名验证:请求头 X-TianKey-Signature = HMAC-SHA256(Webhook Secret, 原始 Body),请验签后处理,防止伪造。

11. 快速开始示例

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();
// 处理事件…

12. 网页嵌入接入(widget.js / iframe)

除后端 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 参数
companyId1租户 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 / offsetY24距边缘的水平 / 垂直边距 px(0-200)
logo"🤖"悬浮图标:emoji / 文字 或 图片 URL,空 = 内置图标
bubbleText"在线客服"悬浮图标的悬停提示文案
autoOpen2500自动弹窗延迟毫秒,0 或省略 = 不自动打开

方式二:iframe 内嵌

<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)。

/chat 页面 URL 参数

以下参数拼在 chatUrl 或 iframe 的 src 之后(首个参数用 ?,后续用 &),中文与 # 需 URL 编码(# 写作 %23):

参数示例说明
companycompany=1租户 ID(多租户隔离;缺省取后端默认租户)
sourcesource=官网来源渠道标识,坐席工作台显示为来源标签;缺省用当前页面 URL
titletitle=售前咨询聊天窗口标题,缺省用系统默认标题
customer_namecustomer_name=张三预填访客姓名,便于坐席识别
customer_phonecustomer_phone=13800138000预填手机号,用于人工通知与回呼
bgbg=%23ffffff聊天页背景色;bg=transparent 为全透明
transparenttransparent=1背景透明透出宿主页面;0 = 恢复系统渐变
embedembed=1聊天卡片铺满 iframe;0 = 居中卡片
phone_verifyphone_verify=00 = 不常驻留资条,仅点「转人工」时弹出;1 = 常驻(默认)
bot_idbot_id=2指定接待机器人,缺省按渠道与关键词路由
utm_source / utm_medium / utm_campaignutm_source=baidu推广归因参数,随会话落库供统计

接入排错

  • 会话归属到别的租户(多租户必看):确认 companyId 或 chatUrl 上的 company 参数已正确填写,二者都没有时会落到默认租户。
  • 嵌入页内语音 / 拍照不可用:iframe 缺少 allow="microphone; camera"。悬浮窗方式由 widget.js 自行处理,无需配置。
  • 后台改了主题色但不生效:检查代码里是否写了 accentColor,显式配置会覆盖后台设置,删除该行即可恢复由后台控制。
  • 悬浮球被页面元素遮挡:组件默认层级较高,若仍被遮挡,请检查宿主页面是否存在更高 z-index 的元素或 overflow: hidden 容器;也可调 position 与 offsetX/offsetY 避让。
📖 完整接口文档(Swagger/OpenAPI)在线地址 /api/docs;网页嵌入接入见第 12 节。后台「系统 → 开放平台」可管理应用密钥、调整配额并导出 OpenAPI 文档。开通开发会员可获取沙箱环境、更高 QPS 配额与专属技术答疑支持。申请开发会员 →