必须通过微信服务器配置+云函数(或后端)实现小程序客服自动回复,前端button仅唤起会话,无法监听或发送消息;需完成URL/Token/EncodingAESKey三项服务端配置,经签名验证、消息解密、access_token调用客服接口完成回复,且受48小时规则限制。

不能只靠前端实现小程序客服消息自动回复,必须走微信服务器配置 + 云函数(或自有后端)的组合路径。 微信明确要求:所有客服消息的接收与下发,必须经由其消息推送机制触发,前端 button open-type='contact' 只负责唤起会话,不参与消息流转逻辑。
为什么不能在 uni-app 前端直接监听并回复?
微信小程序的客服消息是服务端到服务端通信:用户发消息 → 微信服务器 → 你配置的 URL(云函数或后端)→ 你处理并调用客服消息接口回复。uni-app 前端完全收不到原始消息内容,onMessage 或 getProvider 等 API 对客服消息无效。
- 前端无法获取
FromUserName、MsgId、MsgType等关键字段 - 调用
sendCustomerServiceMessage接口必须携带access_token,而该 token 只能由后端安全获取和刷新 - 消息加密(AES)和签名验证必须在服务端完成,前端暴露
EncodingAESKey极不安全
必须配置的三个服务端环节
缺一不可,顺序不能错:
-
微信公众平台后台:进入「开发管理」→「开发设置」→「消息推送」,填写:
-
URL:你的云函数 HTTP 地址(如https://xxx.bspapp.com/http/customerservice) -
Token:自定义字符串(需与云函数校验逻辑一致) -
EncodingAESKey:32位随机字母数字(微信生成,务必保存) -
消息加密方式:推荐选「兼容模式」或「安全模式」(明文模式已逐步弃用)
-
-
uniCloud 云函数:创建 HTTP 化云函数,核心要做的事:
- 校验微信签名(用
Token+timestamp+nonce+EncodingAESKey计算signature) - 解密请求体(若启用加密)
- 解析
event.body中的 XML 或 JSON 消息(注意:微信实际发送的是 XML,即使你设为 JSON 格式,也要先转成对象) - 根据
MsgType分支处理(text、image、event等) - 调用
sendCustomerServiceMessage接口回复(需提前用getAccessToken获取有效 token)
- 校验微信签名(用
-
客服消息接口调用:必须用 POST 请求发往
https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=xxx,body 示例:{ "touser": "oAbc1234567890...", "msgtype": "text", "text": { "content": "您好!我是智能客服,请问有什么可以帮您?" } }注意:touser来自消息中的FromUserName,access_token必须每 2 小时刷新一次,不能硬编码。
常见踩坑点:签名验证失败 / 消息收不到 / 回复不显示
这三个问题占实际接入失败的 80% 以上:
-
签名验证总失败:检查云函数是否用了
queryStringParameters(GET 验证阶段)和body(POST 消息阶段)两个入口;确认时间戳timestamp是秒级而非毫秒级;EncodingAESKey复制时有没有多空格或换行 -
消息能收到但回复没送达:多数因
access_token过期或无效;微信要求touser必须是最近 48 小时内与小程序发生过交互的用户 openid,否则接口返回errcode: 43101 -
回复内容不展示或格式错乱:图文消息必须用
news类型且字段严格匹配文档;小程序卡片需填全appid、pagepath、title;文本内容不能含控制字符(如\u2028),否则整个消息被丢弃
最易被忽略的是:微信客服消息的「48 小时规则」——只有用户主动发起会话后的 48 小时内,你才能通过客服接口主动发消息。超时后,必须等用户再次发送消息才能重新获得窗口。这个限制前端无法绕过,所有自动回复逻辑都得围绕它设计兜底策略(比如引导用户点击按钮重置会话)。


















