客服系统ERP对接后,聊天时就能查订单

合从在线客服系统首页 / 文章列表 / 详情2026-11-02 18:00:00

作者:周屿|更新于 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 }] })
}

卡片的完整字段、每种失败会回什么,在文档站「开发一个扩展页面」那一页。

在设置里把页面加进来

页面写好了,还要在工作台里加上它。这一步要团队创建者或管理员来做。

  1. 打开「设置」,在左边「客户」下面找到「扩展页面」。
  2. 点「添加页面」,名称填客服能看懂的,比如「订单查询」;网址填 https 开头的公网地址。
  3. 保存。

设置页左侧菜单,「客户」下面的「扩展页面」

页面还没写好的时候,列表空着,可以先选「添加示例页面」。它会显示当前客户的信息,也能试着往对话里发消息。示例页面本身就是完整的源码,在浏览器里查看源代码就能看到全部写法,开发可以照着改。

加好以后,客服打开任意一个对话,在右边的图标栏里点「扩展页面」就能看到。

对话右栏的图标栏,红框里是扩展页面的入口

加了好几个页面的话,右边顶上有个下拉框切换。客服刚加完看不到,把右边切到「客户信息」再切回来就有了。

订单数据别因为嵌进来就漏出去

嵌进来以后,订单页的网址有可能被传出去。合从不会给你的页面发任何凭证,推过来的信息也没有签名。

所以不能因为能打开这个页面就给数据,订单还是要靠 ERP 自己的登录来保护。页面收到消息时,也要先看一下来源是不是工作台的域名,别的来源一律不理。

先在设置里加示例页面,看一眼客服那边是什么样,再让开发拿示例页的源码改成查自己的订单。嵌页面是给客服看的。想让客户不用等客服、AI 自己去 ERP 查,见让 AI 客服自己查订单。

常见问题

客服系统对接ERP,要把订单同步过去吗?

不用。合从不提供给你的服务器调的接口,订单也同步不过去。订单留在 ERP,嵌进来的页面在客服点开时现查,数据一直是 ERP 里最新的。

客户没登录,ERP 页面能认出他吗?

认不出。没登录的客户没有会员 ID,页面收到的 externalUserId 是空的。页面上可以显示一句没登录,再留一个按订单号查的输入框,客服问客户要了订单号手动查。

能让 AI 机器人自己去 ERP 查订单吗?

能,这是另一件事。在左边栏的「AI Agent」里点「工具」,选「添加自定义工具」,再选「HTTP API 工具」,把 ERP 查订单的接口配进去。接口要公网能访问,13 秒内返回。

轻松上手,简单好用

多渠道统一服务,提升营销转化,降低人工回复成本,客服团队协助更高效