不能在 uni-app 前端直接推送客服消息,因 access_token 需后端安全缓存刷新且含敏感参数,uni.request 受域名、SSL、加密解密能力限制无法满足微信要求,必须由后端接收回调并调用 send 接口。

不能在 uni-app 前端直接推送客服消息,所有客服消息必须由后端调用微信接口 https://api.weixin.qq.com/cgi-bin/message/custom/send 发起,前端仅能触发会话入口。
为什么 uni.request 调用客服 send 接口必然失败
微信明确要求:客服消息的发送必须携带有效的 access_token,而该 token 具有以下硬性约束:
-
access_token有效期 2 小时,需后端自行缓存与刷新,前端无法安全存储或更新 - 获取
access_token的请求(GET https://api.weixin.qq.com/cgi-bin/token)必须带上appid和secret—— 这两个敏感字段绝不能暴露在前端代码或小程序包中 - uni-app 的
uni.request受限于合法域名白名单,且微信后台会对未备案、无有效 SSL 证书的域名直接拒绝(报错fail tls handshake error或fail invalid url) - 即使绕过域名限制,前端发起的请求也会因缺少服务端签名、AES 解密能力,无法处理微信推送来的加密消息回调
正确链路:button 触发 → 后端监听 → 客服接口回复
用户点击客服按钮后,真正能“自动回复”的唯一路径是:微信服务器将用户消息推送到你配置的 URL(云函数或自有后端),你在该回调中解析内容、调用 AI 或业务逻辑,再立即 POST 回复消息。关键点:
- 前端必须用
,不能用uni.openCustomerServiceChat或自定义 view 模拟 —— 后者不会触发微信的消息回调 - 后端接收的回调是 POST 到你配置的 URL,Body 是 AES 加密 XML,需用
EncodingAESKey解密,才能拿到FromUserName、MsgType、Content等字段 - 回复时必须用
POST https://api.weixin.qq.com/cgi-bin/message/custom/send,参数touser填FromUserName,msgtype根据内容选text/image等,且必须带access_token - 注意 48 小时规则:只有用户 48 小时内主动发起过会话,你才能向其发送客服消息;超时后只能等下次点击按钮重新激活
常见错误现象与对应修复
调试时遇到这些表现,基本可锁定具体环节:
- 点击按钮后客服窗口空白 / 提示“暂无客服在线” → 微信后台「客服管理」未开通小程序客服,或未绑定客服账号
- 后端收不到回调请求 → 未在「公众号/小程序后台 → 开发管理 → 服务器配置」中填对
URL、Token、EncodingAESKey,或未启用「消息推送」开关 - 回调解密失败(XML 解析异常或内容为空)→
EncodingAESKey复制时多了空格或用了全角字符,或解密时未按微信文档做 PKCS#7 填充 - 调用
/custom/send返回errcode: 40001→access_token过期或无效,检查后端是否缓存并自动刷新 - 消息发出去但用户收不到 → 检查
touser是否和回调里的FromUserName完全一致(区分大小写),且该用户确实在 48 小时窗口期内
真正的难点不在代码行数,而在整个链路里每个环节都不可绕过:微信配置项一个填错就收不到回调,token 缓存逻辑漏掉一次就导致后续全部失败,解密步骤少一步就拿不到原始消息。别试图在前端“模拟”客服回复,那只会浪费半天时间去排查根本不存在的 bug。











