客服系统ERP对接后,聊天时就能查订单
作者:周屿|更新于 2026-11-02
「上周买的沙发发货了没有?」客户在聊天里这么一问,客服就得切到 ERP 后台,按手机号搜这个客户,找到订单,再把物流单号抄回聊天窗口。旁边还有几个客户在等着。
客服系统ERP对接,在合从这边的做法是:把 ERP 里的订单页嵌进客服回消息的那个页面,放在右边一栏。页面自己知道客服正在聊的是哪个客户,查到的订单可以填进客服的输入框,也可以直接发给客户。
订单数据不用同步到客服系统里,还留在 ERP,客服点开的时候现查。下面按开发动手的顺序走一遍。
ERP 对接完,客服那边是这样
工作台,就是客服回消息的那个页面。左边是客户的消息,右边一栏放的就是你的页面。

客服切到下一个客户,右边跟着换成这个客户的订单,不用重新搜。页面上可以做两个按钮,一个把订单状态填进输入框,客服看一眼改一改再发;一个直接用客服的身份发给客户。除了文字,还能发订单卡片、物流卡片。
这个页面所有客服都能看到,不能只给某几个人开。客服的浏览器窗口太窄,小于 1024 像素的时候,右边这一栏整个不显示。
所以开发要做的是一个网页,不是数据同步。合从不提供给你的服务器调的接口,除了 APP 的离线消息通知,也不往你的服务器推事件。想同步也同步不了,嵌页面是这件事的正路。对接还能做哪几件、哪几件做不到,见客服系统对接自己的系统能做哪几件事。
先让页面知道这是 ERP 里的谁
页面要查订单,先得知道当前这个客户在 ERP 里是谁。
工作台会把当前客户的信息推给你的页面,里面有一个 externalUserId,就是你自己系统里的会员 ID。这个值不是合从生成的,是你在接入的时候传进来的。网站、对话链接、APP 三种入口都能传,客户登录以后把会员 ID 带过来就行。具体怎么传,见把登录的客户带给客服的代码。
推过来的信息里还有一个 customerNo,这是合从按入口给客户排的编号,比如 #1803,跟你的系统没有任何关系,不能拿来查订单。
有一点容易误判。页面第一次收到的信息里,externalUserId、手机号、邮箱通常是空的。这几项要等客户详情加载完,工作台再推第二次。不要拿第一次的结果判断这个客户没登录。
第二次推过来还是空的,才说明这个客户没登录,ERP 里认不出他。这时候页面上显示一句没登录就好。
客户资料在工作台上能记哪些,见客服系统自带的客户资料能记哪些。
ERP 这边要改的几处
ERP 的订单页本来是给自己人在浏览器里打开的,嵌进别人的页面里,有几处要改。
一是允许被工作台嵌入。响应头里用 frame-ancestors 放行 https://workpro.aihecong.com,再去掉 X-Frame-Options,完整那一行在上面那篇对接文章里。改完要真的嵌进工作台试一次,被拦的时候客服看到的是浏览器自己的错误页,光在浏览器里打开网址看不出来。
二是登录。ERP 一般要登录才能看订单。可页面是嵌在工作台里的,浏览器对这种情况的 Cookie 有限制。Chrome 会给它单独一份 Cookie,Safari 和 Firefox 默认直接拦掉。客服在别的标签页登录过 ERP,嵌进来的页面里不一定是登录状态。
可以让 Cookie 带上 SameSite=None; Secure,或者在页面里做一次简单的登录。登录的时候页面不能跳到别的域名,跳出去再跳回来,页面就收不到工作台的消息了。
三是接收工作台推来的信息。页面不用引入 SDK,靠浏览器的 postMessage 通信。监听要写在脚本最外层,一加载就注册。工作台在页面加载完就推第一次,注册晚了就错过,要等客服切一次客户才补推。
页面嵌进去以后不会重新加载,客服切客户,工作台只是再推一次。所以查订单要写在收到消息的地方,每收到一次就重新查、重新显示。
文档站给的写法是这样的:
function render(ctx) {
// 首次推送时 phone / email / externalUserId 通常为 null,详情加载后会补推第二条
const userId = ctx.customer.externalUserId
if (!userId) return showEmpty('该访客尚未登录,无法关联账号')
fetchOrders(userId).then(showOrders)
}
fetchOrders 换成你自己查 ERP 订单的接口。
四是本地调试。工作台只认 https 的公网地址,本地的 http://localhost:3000 填不进去。可以用内网穿透工具,把本地端口变成一个临时的 https 地址填进去。也可以先部署到测试域名,单独加一条,测完删掉。
查到的订单怎么给客户
查到订单以后,有两种给法。
insertText 把文字填进客服的输入框,不发出去,客服看一眼再发。sendMessage 用当前客服的身份直接发给客户。拿不准的时候先用填输入框,客服心里有底。
发的时候一定要带上 conversationId。查 ERP 那几百毫秒里,客服可能已经切了客户,不带的话,A 客户的订单就发进了 B 客户的对话。带了,对不上时工作台会拒绝,代码写法也在那篇对接文章里。
除了文字,还能发订单卡片和物流卡片。订单卡会显示订单状态、商品和合计金额,物流卡会显示运单号和轨迹,传字段进去就自动排好,不用自己写样式。

金额要写成最小货币单位的整数。299 元写 { amount: 29900, currency: 'CNY' },不要传小数。
不是每个入口都能发卡片。推过来的信息里有一个 capabilities,写着当前这个对话能不能发卡片、能发哪几种。微信客服的对话,一条文字还有长度上限。所以发之前先看它,发不了卡片就改发文字:
function sendOrderCard(card, summary) {
if (!caps.cardTypes.includes('order')) {
return send('sendMessage', { text: summary }) // 降级发纯文本
}
send('sendMessage', { text: summary, blocks: [{ kind: 'card', card }] })
}
卡片的完整字段、每种失败会回什么,在文档站「开发一个扩展页面」那一页。
在设置里把页面加进来
页面写好了,还要在工作台里加上它。这一步要团队创建者或管理员来做。
- 打开「设置」,在左边「客户」下面找到「扩展页面」。
- 点「添加页面」,名称填客服能看懂的,比如「订单查询」;网址填 https 开头的公网地址。
- 保存。

页面还没写好的时候,列表空着,可以先选「添加示例页面」。它会显示当前客户的信息,也能试着往对话里发消息。示例页面本身就是完整的源码,在浏览器里查看源代码就能看到全部写法,开发可以照着改。
加好以后,客服打开任意一个对话,在右边的图标栏里点「扩展页面」就能看到。
![]()
加了好几个页面的话,右边顶上有个下拉框切换。客服刚加完看不到,把右边切到「客户信息」再切回来就有了。
订单数据别因为嵌进来就漏出去
嵌进来以后,订单页的网址有可能被传出去。合从不会给你的页面发任何凭证,推过来的信息也没有签名。
所以不能因为能打开这个页面就给数据,订单还是要靠 ERP 自己的登录来保护。页面收到消息时,也要先看一下来源是不是工作台的域名,别的来源一律不理。
先在设置里加示例页面,看一眼客服那边是什么样,再让开发拿示例页的源码改成查自己的订单。嵌页面是给客服看的。想让客户不用等客服、AI 自己去 ERP 查,见让 AI 客服自己查订单。
常见问题
客服系统对接ERP,要把订单同步过去吗?
不用。合从不提供给你的服务器调的接口,订单也同步不过去。订单留在 ERP,嵌进来的页面在客服点开时现查,数据一直是 ERP 里最新的。
客户没登录,ERP 页面能认出他吗?
认不出。没登录的客户没有会员 ID,页面收到的 externalUserId 是空的。页面上可以显示一句没登录,再留一个按订单号查的输入框,客服问客户要了订单号手动查。
能让 AI 机器人自己去 ERP 查订单吗?
能,这是另一件事。在左边栏的「AI Agent」里点「工具」,选「添加自定义工具」,再选「HTTP API 工具」,把 ERP 查订单的接口配进去。接口要公网能访问,13 秒内返回。
上一篇:客服系统怎么置忙,暂时不接新客户
下一篇:客服权限怎么设置,谁能看谁能改