传递客户上下文
通过 Open API 签发 contextToken,在 Web SDK 会话中将客户资料与会话摘要同步至客服工作台
简述
传递客户上下文 面向 技术对接人员:由您的业务后端携带租户 API Key,调用 OpenDesk Open API 签发短期 contextToken,再交给网页端 Web SDK 使用。OpenDesk 会在访客发起咨询后,将客户资料、自定义用户字段与会话纪要字段同步到客服工作台,无需坐席手工录入。
调用边界: API Key 仅用于 服务端(业务后端、BFF、定时任务等),禁止写入浏览器前端、移动 App 或公开仓库。
适用场景
| 场景 | 说明 |
|---|---|
| 官网 / App 嵌入 Web SDK | 访客点击在线客服前,后端已识别登录用户,希望坐席侧自动看到昵称、手机、会员等级等 |
| 预填会话摘要 | 业务侧已知咨询意图、订单号、产品型号等,希望写入 会话纪要 供坐席参考 |
| 会话中更新上下文 | 客户信息变更时,后端重新签发 Token,SDK 调用 updateContext 增量同步 |
典型用途: 电商订单页咨询、会员中心售后、SaaS 控制台内嵌客服。
接入前准备
| 准备项 | 说明 | 获取方式 |
|---|---|---|
| OpenDesk 访问地址 | 租户部署根地址,下文记为 {OpenDesk地址} | 由实施或运维提供,如 https://desk.example.com |
| API Key | 格式 sk-odk-...,绑定当前租户 | 超级管理员在 管理后台 → 全局设置 → API Key 创建 |
Web 渠道 Key channelKey | 与 Web SDK 初始化参数一致 | 管理后台 → 在线客服 → 渠道管理 → Web SDK 渠道详情 |
| HTTPS 客户端 | 任意语言均可 | curl、Python requests、Java OkHttp、Node.js fetch 等 |
接口前缀:
{OpenDesk地址}/api/v1/open
鉴权 Header(每次请求必填):
Authorization: Bearer sk-odk-您的密钥
Content-Type: application/json
技术特性:
- 租户由 API Key 哈希解析,无需 在请求体中传
tenantId。 - Key 被禁用、删除或轮换后,旧 Key 立即无法签发 Token。
- 成功调用会更新该 Key 的 最近使用时间,便于在管理后台排查调用方。
整体流程
您的业务后端 OpenDesk 网页 Web SDK
│ │ │
│ ① POST /open/context-token │ │
│ Authorization: Bearer Key │ │
│ ───────────────────────────────> │ │
│ ② 返回 contextToken + expiresIn │ │
│ <─────────────────────────────── │ │
│ │ │
│ ③ 将 contextToken 交给前端/SDK │ │
│ ─────────────────────────────────────────────────────────────────> │
│ │ ④ SDK 建连时携带 Token │
│ │ <─────────────────────────────── │
│ │ ⑤ 校验 Token 并同步客户/纪要 │
│ │ 至客服工作台 │
要点:
contextToken由 您的服务器 生成,经 SDK 后台通道 传给 OpenDesk,不会 出现在 URL 查询参数中。- Token 为 JWT,绑定
tenant_id、channel_key、签发所用api_key_id与key_version;渠道或 Key 不匹配时校验失败。 - 默认有效期 1800 秒(30 分钟),可自定义 300~1800 秒。
如何使用
第一步:创建 API Key
- 使用 超级管理员 账号登录管理后台。
- 进入 全局设置 → API Key。
- 点击 新建 API Key,填写名称(如「官网后端」「会员中心 BFF」)。
- 创建成功后 仅展示一次 完整 Key(
sk-odk-...),请立即复制到密钥管理系统。 - 关闭弹窗后无法再次查看完整 Key,遗失需 轮换 或新建。

第二步:获取 Web 渠道 Key
- 进入 管理后台 → 在线客服 → 渠道管理。
- 打开目标 Web SDK 渠道详情。
- 复制 渠道 Key(即请求体中的
channelKey)。 - 确认该渠道已 启用,且允许公开接入(与 Web SDK 嵌入配置一致)。

第三步:后端调用签发接口
接口: POST {OpenDesk地址}/api/v1/open/context-token
请求示例:
curl -X POST "{OpenDesk地址}/api/v1/open/context-token" \
-H "Authorization: Bearer sk-odk-您的密钥" \
-H "Content-Type: application/json" \
-d '{
"channelKey": "您的Web渠道Key",
"customer": {
"externalUserId": "user-10001",
"nickname": "张三",
"email": "zhangsan@example.com",
"phone": "13800138000",
"fields": {
"vip_level": "gold"
}
},
"sessionSummary": {
"fields": {
"customer_intent": "售后咨询",
"order_no": "ORD-2026-001"
}
},
"expiresSeconds": 600
}'
成功响应(HTTP 200):
{
"contextToken": "eyJhbGciOiJIUzI1NiIs...",
"expiresIn": 600
}
响应字段采用 camelCase(contextToken、expiresIn),与 Web SDK 参数名一致。
第四步:将 Token 交给 Web SDK
在网页初始化 SDK 时传入上一步返回的 contextToken:
OpenDesk.init({
channelKey: '您的Web渠道Key',
contextToken: '从上一步接口返回的 contextToken',
// ... 其他 SDK 配置
});
会话进行中若客户信息变化,可:
- 后端重新调用
POST /open/context-token获取新 Token; - 前端调用 SDK 的
updateContext({ contextToken: '...' })

接口说明
| 项目 | 说明 |
|---|---|
| Method | POST |
| Path | /api/v1/open/context-token |
| Content-Type | application/json |
| 鉴权 | Authorization: Bearer <API_KEY> |
| 成功响应 | 200,Body 为 ContextTokenResponse |
| 在线调试 | 浏览器访问 {OpenDesk地址}/docs,在 OpenAPI 页面试调(需有效 Key) |
请求参数
| 参数 | JSON 字段 | 必填 | 说明 |
|---|---|---|---|
| 渠道 Key | channelKey | 是 | 须为当前租户下已启用的 Web SDK 渠道 |
| 客户信息 | customer | 否 | 对象,见下表 |
| 会话摘要 | sessionSummary | 否 | 对象,格式 { "fields": { "字段标识": "值" } } |
| 有效秒数 | expiresSeconds | 否 | 整数,300~1800,默认 1800 |
customer 系统字段:
| 字段 | 说明 | 约束 |
|---|---|---|
externalUserId | 您系统中的用户唯一 ID | 最长 128 字符;用于匹配 / 创建访客 |
nickname | 昵称 | 最长 64 字符,客服侧展示为客户姓名 |
email | 邮箱 | 最长 254 字符,服务端转小写 |
phone | 手机号 | 最长 32 字符,自动去除空格、括号等 |
gender | 性别 | male / female / unknown |
address | 地址 | 最长 256 字符 |
remark | 备注 | 最长 2000 字符 |
fields | 自定义用户字段 | 键值对,见下文 |
自定义用户字段(customer.fields)
使用前须在 管理后台 → 用户与组织 → 用户字段 中创建并 启用 目标字段,记下 字段标识(如 vip_level)。
"customer": {
"externalUserId": "user-10001",
"nickname": "张三",
"fields": {
"vip_level": "gold",
"member_no": "M20260001"
}
}
| 规则 | 说明 |
|---|---|
| 字段须预先存在 | 未配置或未启用的字段被忽略,同步结果返回 UNKNOWN_CUSTOMER_FIELD:字段标识 |
| 字段标识格式 | 小写字母、数字、下划线,以字母或下划线开头(正则 ^[a-z_][a-z0-9_]{1,63}$) |
| 值类型 | 须与字段类型匹配;格式错误返回 INVALID_CUSTOMER_FIELD:字段标识 |
| 空字符串 | 传 "" 表示跳过,不更新该字段 |
| 部分失败 | 单个自定义字段失败 不会 导致整次 HTTP 请求失败 |
sessionSummary.fields:
- 字段标识须与 管理后台 → 在线客服 → 会话纪要 中已配置字段一致。
- 最多 50 个字段。
customer与sessionSummary各自序列化后不超过 16KB。

错误与排查
| HTTP 状态 | 常见原因 | 处理建议 |
|---|---|---|
| 401 | 未带 Key、格式错误、Key 无效或已删除 | 检查 Authorization: Bearer sk-odk-... |
| 403 | API Key 已禁用 | 管理后台启用 Key,或创建新 Key 并更新调用方 |
| 404 | channelKey 不存在或不属于当前租户 | 核对渠道 Key 与租户 |
| 422 | 参数校验失败 | 检查 expiresSeconds 范围、sessionSummary.fields 数量、16KB 体积限制 |
Token 消费阶段(SDK / 服务端):
- Token 过期、渠道不匹配、签发 Key 已被禁用或轮换 → 校验失败,需重新签发。
- 完整错误语义以
{OpenDesk地址}/docs为准。
安全与限制
- API Key 只保存在服务器,禁止写入前端 bundle、移动端或 Git 仓库。
- 生产与测试环境使用 不同 Key;定期 轮换,轮换后旧 Key 立即失效。
- 所有调用须走 HTTPS。
- 在管理后台关注 Key 的 最近使用时间,异常立即禁用。
- 当前 API Key 无细粒度 scope,同一租户下任一启用 Key 均可调用本接口及知识库 Open API。
与其他功能的关系
- API Key(管理后台):本接口的鉴权凭证,仅超管可创建与管理。
- 渠道管理:提供
channelKey;渠道须与 SDK 嵌入配置一致。 - 用户字段:
customer.fields依赖后台字段定义。 - 会话纪要:
sessionSummary.fields依赖后台纪要字段配置。 - Web SDK 接入文档:描述
init、updateContext等前端 API。 - 知识库 API:同属 Open API,复用同一套 API Key,见《知识库 API》。
对接示例
电商订单页咨询
角色与目标: 用户在订单详情页点击「联系客服」,坐席需立即看到订单号与会员等级。
系统配置:
- 管理后台创建 API Key,配置 Web SDK 渠道。
- 在 用户字段 中启用
vip_level;在 会话纪要 中启用order_no、customer_intent。
对接步骤:
- 用户登录后,您的后端根据
userId组装customer与sessionSummary。 - 调用
POST /open/context-token获取contextToken。 - 页面加载 Web SDK 时传入
contextToken。 - 坐席接听后,在工作台 客户资料 与 会话纪要 区域查看同步结果。
场景效果: 访客无需重复报订单号;坐席打开会话即可看到业务上下文。
