微信小程序消息推送配置必须通过GET验签,仅输出$_GET["echostr"]纯字符串;POST需区分处理,安全模式须用EncodingAESKey解密,且URL必须HTTPS、校验timestamp与nonce防重放。

验证 URL 有效性:GET 请求验签必须一次通过
微信小程序后台提交消息推送配置时,第一道关卡就是 GET 验证——它不是可选步骤,而是强制准入门槛。只要 signature 校验失败,后续所有 POST 推送(如用户发消息、事件回调)都不会到达你的服务器。
常见错误现象:
– 返回空响应或 404/500 错误
– 返回 {"echostr":"xxx"}(JSON 对象)而非纯字符串
– 忘记 exit 或 die,导致后续代码执行并污染响应体
- 校验逻辑必须严格按三步走:取
$_GET["token"](即你填的 Token)、$_GET["timestamp"]、$_GET["nonce"]→ 字典序排序(sort($arr, SORT_STRING))→ 拼接后sha1() - 验签通过后,**只输出
$_GET["echostr"]字符串,不加引号、不 JSON 编码、不 echo 其他任何字符** - Token 建议用 16 位以上随机字符串(如
openssl_random_pseudo_bytes(16)转 hex),避免弱值如123456或abc
选择加密模式前先看清楚代码支持能力
明文 / 兼容 / 安全三种模式不是“越安全越好”,而是和你实际处理 POST 请求的代码强绑定。一旦后台选了「安全模式」,所有后续用户消息、事件(如 subscribe、SCAN)都会以 AES-256-CBC 密文 + XML/JSON 封装发送,**没解密逻辑=收不到任何真实数据**。
- 明文模式:仅用于本地调试,微信官方已明确不推荐上线使用
- 兼容模式:同时接收明文和密文,适合过渡期,但需判断
Encrypt字段是否存在 - 安全模式:必须实现完整解密流程(用
EncodingAESKey+AppID+msg_signature三参数校验并解密),推荐但不可跳过实现
注意:EncodingAESKey 是 43 位随机字符串(含大小写字母+数字),生成后务必存档,丢失无法还原历史密文。
立即学习“PHP免费学习笔记(深入)”;
bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置
POST 处理入口必须区分 GET 验证与消息接收
同一个 URL(如 https://your.com/wx/callback.php)既要响应微信的 GET 验证,也要处理后续的 POST 消息。很多开发者把两者混写,结果验签成功后,一收到 POST 就报错或静默失败。
- 必须用
$_SERVER['REQUEST_METHOD'] === 'GET'显式分流,GET 走验签逻辑,POST 走消息解析逻辑 - POST 请求体是原始 XML 或 JSON(取决于后台设置),不能直接用
$_POST—— 要用file_get_contents('php://input')读取原始流 - 若启用安全模式,POST 中还会多带两个 header:
X-WX-MSG-SIGNATURE和X-WX-TIMESTAMP,缺一不可
HTTPS + Token + Timestamp 三者缺一不可
微信强制要求 URL 必须是 HTTPS(443 端口),且证书有效。哪怕你本地能跑通 HTTP,上线提交时也会被后台直接拦截,提示“URL 不可用”。此外,很多开发者忽略 timestamp 的时效性检查,导致重放攻击风险。
- 确保 Nginx/Apache 已配置 TLS 1.2+,禁用 SSLv3 和 TLS 1.0;Let’s Encrypt 证书建议用
certbot自动续期 - 在 POST 处理逻辑中,应校验
timestamp是否在当前时间 ± 300 秒内,超时直接返回空或 403 - Nonce 值建议用 Redis 缓存 5 分钟,发现重复即拒绝,防止重放
真正卡住人的往往不是加解密算法,而是 HTTPS 配置错误、timestamp 未校验、或 echostr 多打了换行——这些细节不写日志根本看不出问题。










