HelloWorld 的快捷回复可以携带变量:平台允许在按钮标签、模板正文和卡片字段内使用占位符(如 {{first_name}}、%email% 或 session.id),在发送前由系统根据会话上下文、用户属性或外部接口进行替换,并支持默认值与简单条件处理,以便实现个性化和上下文相关的快速交互。

先把事情讲清楚:什么叫“快捷回复带变量”
简单说,快捷回复就是聊天界面里的预设按钮或模板文本,用户点一下就能发送预设内容。带变量的意思是,这些预设里不是死板的一段话,而是可以放占位符,系统在发送前把占位符换成具体内容——比如把 {{name}} 替换成“李华”。这让回复既快捷又有温度。
为什么要用变量?
- 提高个性化:用户看到自己的名字或账号信息,交互更亲近。
- 减少模板数量:同一条模板能适配不同场景和用户。
- 增强上下文感知:可以把会话状态或外部数据整合进按钮标签或提示文本。
HelloWorld 常见的变量类型(一览表)
| 变量类型 | 来源 | 示例占位符 | 备注 |
| 用户属性 | 注册信息 / 资料 | {{first_name}}、%email% | 通常在用户档案中持久化 |
| 会话上下文 | 短期会话变量 | {{last_intent}}、session.cart_count | 随会话生命周期改变 |
| 系统变量 | 平台运行时信息 | {{timestamp}}、{{locale}} | 只读,供显示或日志 |
| 外部动态数据 | API 或第三方服务 | {{order.status}}、%weather.city% | 需要运行时请求,可能有延迟/失败 |
| 常量/配置 | 模板或工作流定义 | {{support_number}}、{{promo_code}} | 适合放固定文本或过渡 |
怎么把变量放到快捷回复里:实操步骤
这部分按步骤讲清楚,不啰嗦:
- 设计好模板:先把常见的对话写成模板,并在需要个性化的位置放占位符,比如 “您好,{{first_name}},请问需要查看订单 #{{order_id}} 吗?”
- 定义变量来源:在后台/工作流里定义每个占位符从哪里来(用户资料、session、API)。
- 设置默认与回退:为每个变量设默认值(例如 {{first_name|朋友}}),防止空值显示。
- 渲染引擎替换:发送前由模板引擎将占位符替换成真实值,支持基本格式化(如日期格式化)。
- 测试并上线:在沙箱测试所有分支(变量存在、变量缺失、外部API超时)。
常见的模板语法示例
不同系统语法不同,HelloWorld 常见的写法有几种形式,示例说明:
- 双大括号:
{{first_name}}—— 最常见,直观。 - 百分号包裹:
%email%—— 有些集成时见到的老式语法。 - 路径式:
{{order.items[0].name}}—— 访问嵌套对象。 - 带默认值:
{{first_name|朋友}}或{{first_name ?? '朋友'}}—— 变量缺失时使用回退。
运行时替换的顺序与优先级
理解优先级很关键,不然会出现意外文本。常见优先级(从高到低):
- 临时会话变量(session)
- 实时查询到的外部数据(API 返回)
- 用户持久属性(profile)
- 系统变量或默认值
举个例子:若模板同时引用 session.username 和 profile.username,优先使用 session 的值,这可以让短期更改覆盖长期信息。
可能碰到的问题和注意事项
- 变量不存在或为空:一定要为可空变量设置回退值,避免出现“您好,{{ } }”这种尴尬情况。
- 延迟与超时:外部 API 的数据要考虑超时策略,超时应使用缓存或默认值。
- 注入风险:不要把未经清洗的用户输入直接作为模板内容,避免标记注入或不合规内容泄露。
- 字符长度与按钮限制:部分消息通道(SMS、微信小程序、通知)对按钮文本长度有限制,变量替换后可能超长,要提前裁剪或格式化。
- 多语言/占位符顺序:当支持多语言时,注意变量在不同语言中的位置变化,不要硬编码顺序。
- 隐私合规:变量可能包含敏感信息(邮箱、订单号、身份证部分),展示时遵守数据最小化原则和地区合规要求。
调试与测试清单(别忘了这一页)
- 变量存在/缺失两套测试用例都跑一遍。
- 模拟外部 API 慢速或失败的情况,观察回退效果。
- 测试多语言模板中的变量顺序和占位符替换。
- 测试按钮文本替换后在目标通道(App、微信、邮件)是否超限或断行。
- 用真实用户数据做 A/B 测试,检查个性化带来的行为变化。
实战示例:一个订单确认的快捷回复模板
设想一个场景:用户下单后聊天窗口出现确认卡片,底下有两个快捷按钮“查看订单”和“联系客服”。按钮标签和消息里都带变量。
模板正文(示例):
- 标题:“您好,{{first_name|朋友}},您的订单 #{{order_id}} 已创建”
- 正文:“预计送达:{{order.delivery_date|明日}},共 {{order.items_count}} 件,总额 {{order.total | currency}}”
- 按钮1(查看订单):“查看订单 #{{order_id}}” —— 点击带上参数 order_id 到后端。
- 按钮2(联系客服):“联系人工(订单 {{order_id}})” —— 快捷打开工单并自动带入上下文。
替换流程:平台先把 session/order 数据挂到渲染上下文,再调用模板引擎生成最终文本,最后通过消息通道发出。若外部接口未返回 delivery_date,则使用回退值“明日”。
实现中会用到的技术点(工程视角)
- 模板引擎:Mustache、Handlebars、Liquid 等,选型影响表达能力(条件、循环、默认值写法)。
- 渲染上下文构造:在发送前把 session、profile、api 返回数据统一封装为一个对象传入模板。
- 缓存与异步:为避免外部查询拖慢,常做缓存 + 异步回填(先发基础消息,后续更新卡片)。
- 安全过滤:对变量内容做转义/白名单过滤,避免插入恶意脚本或违规内容。
一些实践建议,给产品和运营的小伙伴
- 把最常用的变量模板做成可视化编辑器,让非技术人员也能配置回退、格式化。
- 提供预览功能:替换真实数据后预览按钮和消息,看到终稿再上线。
- 监控占位符替换失败的日志,及时修补模板或补全数据源。
- 合理使用个性化:不是所有场景都需要名字或详细信息,过度个性化反而显得奇怪。
最后再顺带说两句:变量功能很实用,但要把工程性和用户体验放在同等重要的位置。实现上既要考虑语法与渲染的灵活性,也要把异常场景(数据缺失、外部失败、字符超限)当作第一类问题来处理。好了,我先写到这儿——有点像在边想边敲,可能还漏了小细节,碰到具体实现环境(比如微信小程序、企业微信、邮件或推送)时,细节会有差别,按渠道校对一遍就稳了。