微信推送失效主因是openid绑定状态异常或系统时间不同步:扫码后需关闭弹窗、确认openid显示、检查ip白名单;时间偏差超5分钟会导致签名失败;“测试发送”不验证模板链路,须手动curl测试并查error.log日志。

微信推送失效后,重新扫码绑定为什么经常不生效
重新扫码只是触发一次 OAuth 授权流程,但宝塔面板的微信通知依赖两个关键状态:一是公众号后台配置(AppID/AppSecret/Token)与面板填写的一致性;二是当前登录账号是否已完成 OpenID 绑定并被服务端缓存。常见失效原因不是“没扫”,而是扫完后没关闭配置弹窗、没刷新告警通道开关、或公众号后台的 IP白名单 漏掉了服务器真实出口 IP。
实操建议:
- 扫码后必须点击二维码弹窗右上角
×关闭,否则面板不会提交绑定结果到后端服务 - 关闭后返回
设置 → 微信公众号页面,确认显示“已绑定”且有 OpenID 哈希值(如o6_bA0xxxxxxxxxxxxxx),没有则说明授权未落库 - 检查公众号后台
开发 → 基本配置 → IP白名单是否包含服务器实际公网 IPv4 地址(curl ifconfig.me可查),不能填127.0.0.1或内网地址 - 若用的是宝塔旧版本(
8.0.0之前),需手动重启面板:bt restart,否则新绑定信息不加载
系统时间不同步会导致微信模板消息签名失败
微信接口所有请求都带时间戳参数 timestamp,并与服务器当前时间比对,偏差超过 5 分钟即拒绝。宝塔面板调用微信模板消息时若本地系统时间慢或快太多,会直接返回 invalid signature 或 time out 错误,但面板 UI 不提示具体原因。
实操建议:
- 执行
date查看当前系统时间,与https://time1.google.com或手机时间对比 - 若偏差 >30 秒,运行
timedatectl set-ntp true启用 NTP 自动校时(CentOS 7+/Ubuntu 16.04+) - 手动校准(临时):先
systemctl stop chronyd(或ntpd),再ntpdate -s time.apple.com,最后systemctl start chronyd - 检查时区是否正确:
timedatectl status中Time zone应为Asia/Shanghai,不是UTC或空值
测试微信通道是否真通,别只信“测试发送成功”按钮
宝塔面板的“测试发送”仅验证 Webhook URL 连通性或基础鉴权,不走完整模板消息链路(比如不校验 template_id、不检查用户是否关注、不判断模板字段是否缺失)。很多用户点完“测试成功”就以为万事大吉,结果告警触发时静默失败。
实操建议:
- 在公众号后台进入
功能 → 模板消息 → 模板库,确认所用模板状态是“已通过”,且template_id与宝塔面板里填的一致(注意大小写和短横线) - 用 curl 手动触发一次真实告警请求,观察返回:
curl -X POST "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=xxx" -H "Content-Type: application/json" -d '{"touser":"OPENID","template_id":"TEMPLATE_ID","data":{}}' - 查看宝塔日志:
/www/server/panel/logs/error.log,搜索wechat或template,失败时通常有明确错误码如40003(invalid openid)、41003(invalid access_token)
OpenID 变更或用户取关后,面板不会自动解绑
微信用户取关公众号、更换微信号、或公众号迁移后,原有 OpenID 失效。但宝塔面板不会主动检测该状态,仍尝试向旧 OpenID 发送消息,结果就是“发送成功”日志照打,但微信侧无任何推送。
实操建议:
- 定期检查绑定状态:进入
设置 → 微信公众号,若显示“已绑定”但近 3 天无任何告警到达,优先怀疑 OpenID 失效 - 不要删重绑,而是直接点击“解绑”,再重新扫码——因为旧绑定残留可能干扰新流程
- 如果需多管理员接收,务必在公众号后台开通“模板消息”权限,并在宝塔中手动填入每个管理员的 OpenID(不能靠扫码批量获取)










