Skip to content

商品与订单选择器 ​

客户问「我上周买的那个怎么还没到」,客服要先问是哪一单。这一来一回可以省掉。

做出来是什么样 ​

在聊天输入区放一个你自己的按钮,客户点开是一个半屏列表,选中某件商品或某笔订单,就直接作为卡片发给了客服。客服看到的是带图、带价格、带订单状态的卡片,不用再问单号。

APP 聊天页下方弹出的订单选择面板,列出两笔订单的名称、状态徽章与金额

图里的示例数据只填了标题、状态和价格。实际接入时传了 imageUrl 会显示商品图,传了 description 会在标题下显示规格说明,字段表见下方。

列表数据全部由你的 APP 提供,所以这件事在工作台里配不出来,需要写代码。

两步接上 ​

第一步,在输入区注册一个按钮。 可以在打开聊天页之前就注册,SDK 会记住,页面起来后按钮就在:

kotlin
// Android — 参数顺序:id、文字、位置、图标
HecongChat.registerAction("pick_order", "选订单", "quick")
swift
// iOS — 参数顺序:id、文字、图标、位置
HecongChat.shared.registerAction(id: "pick_order", label: "选订单", icon: nil, slot: "quick")

两端的参数顺序不一样

Android 是 slot 在前、icon 在后且可以省略;iOS 是 icon 在前、slot 在后且两个都要传。照着一端抄另一端会传反。

第二步,在按钮的点击回调里取数据、开面板:

kotlin
// Android
override fun onActionClick(id: String) {
    if (id == "pick_order") {
        val items = loadMyOrders()          // 现去你自己的接口取
        HecongChat.setPickerData("order", items)
        HecongChat.openPicker("order")
    }
}
swift
// iOS
func hecongChat(didClickAction id: String) {
    guard id == "pick_order" else { return }
    let items = loadMyOrders()
    HecongChat.shared.setPickerData("order", items: items)
    HecongChat.shared.openPicker("order")
}

setPickerData 和 openPicker 的第一个参数是类型,取 product、order 或 article,字段定义见下方。

数据要在点击那一刻现取

SDK 不保留你给过的列表,聊天页没打开时调 setPickerData 也不会生效。这是刻意的:商品库存、订单状态、客户的登录态随时在变,启动时灌一次、客户半小时后才点开,发出去的就是过期的卡片;而缓存下来还会把上一次会话的旧列表带进下一次。

把取数据的动作放在 onActionClick 里,是唯一正确的时机。

入口放在哪 ​

slot 决定按钮出现的位置,两个取值:

取值位置
quick输入框正上方的快捷区,客户一眼就能看到
attach附件面板里(输入区的 ➕ 展开后),平时收着

同一个聊天页里两个位置的对比,输入框正上方是「订单」胶囊按钮,展开的附件面板里是「商品」入口

图里两个位置同时出现:上方那个「订单」胶囊是 quick,展开的附件面板里那个「商品」是 attach,和 SDK 自带的图片、视频、拍摄、文件排在一起。

高频动作用 quick,低频的放 attach 免得占地方。按钮文字之外还可以给一个图标,传一段以 <svg 开头的内联 SVG 字符串;不传就用通用图标。

同一个 id 重复注册是覆盖,不用先撤。要撤掉某个按钮:

kotlin
HecongChat.unregisterAction("pick_order")
swift
HecongChat.shared.unregisterAction("pick_order")

按钮点击回调里做什么完全由你决定 —— 跳转到 APP 内的订单页、触发一次人工转接、打开你自己的表单都可以,不一定要开选择器面板。

字段定义 ​

product(商品)、order(订单)、article(文章),每类最多 50 条,超出部分不会呈现。

三类的字段各不相同,字段名必须完全一致:写错名字的字段会被静默丢弃,不报错、不提示,只表现为卡片上少了图或少了描述。

product 商品卡 ​

字段类型必填含义
titlestring是商品名,≤200 字符
descriptionstring否规格、卖点等,≤2000 字符
imageUrlstring否商品图外链,必须是合法 URL
priceMoney否现价
originalPriceMoney否划线原价
detailUrlstring否商品详情页,客服点击可跳转
productIdstring否你自己的 SKU 编号,≤128 字符
layout'compact' | 'large'否卡片形态,缺省由聊天窗决定

order 订单卡 ​

字段类型必填含义
orderIdstring是订单号,≤128 字符
titlestring是订单标题,≤200 字符
totalMoney是订单总额
status见下是订单状态
createdAtnumber是下单时间,毫秒时间戳
itemsarray是商品行,≤30 条
items[].namestring是商品名
items[].quantitynumber是数量,正整数
items[].priceMoney是单价
items[].imageUrlstring否商品图外链
detailUrlstring否订单详情页

status 取值:pending(待付款)、paid(已付款)、shipped(已发货)、delivered(已送达)、refunded(已退款)、cancelled(已取消)。传其他值会被拒绝。

商品行超过 30 条,这张卡整个发不出去,不是只显示前 30 条。卡片是摘要不是清单,行数多的订单挑主要商品放进去,其余让客服点 detailUrl 看详情。

article 文章卡 ​

字段类型必填含义
titlestring是文章标题,≤200 字符
descriptionstring是摘要,≤2000 字符
urlstring是文章链接
imageUrlstring否封面图外链
sourcestring否来源站点名,≤100 字符

Money 金额 ​

js
{ amount: 39900, currency: 'CNY' }   // ¥399.00
{ amount: 99, currency: 'USD' }      // $0.99

amount 是最小货币单位的整数(人民币为分),不接受浮点数。currency 用 ISO 4217 代码。展示时由聊天窗按客户语言格式化,你不用自己拼货币符号。

图片一律用外链 ​

卡片图只能传 imageUrl,值是你自己的图片地址。

不要传 imageAttachmentId。那是客服在工作台上传素材时才用的字段,服务端会校验附件归属,用它发出去的卡片客户这边发不成功,而且不会有明确的报错提示。

客户选完之后 ​

点中某一项,卡片直接作为一条消息发给客服,你不需要再做任何事。客服在工作台里看到的是完整卡片,能点进 detailUrl。

下一步 ​