企业微信的回调 URL 配置主要在管理后台完成,Node.js 侧的核心任务是实现验证逻辑以通过后台校验。
先说结论:这不是单纯的代码配置,而是需要配合企业微信管理后台进行双向验证。
- 适合:需要接收企业微信事件推送或调用回调接口的场景
- 先准备:获取 Token 和 EncodingAESKey,确保服务器公网可达
- 验收:管理后台显示验证成功且能正常接收消息
命令速用版
核心是编写一个 GET 接口,验证签名并返回 echostr。以下是一个基于原生 crypto 模块的验证逻辑片段:
const crypto = require('crypto');
function verifySignature(token, timestamp, nonce, echostr) {
const str = [token, timestamp, nonce].sort().join('');
const sha1 = crypto.createHash('sha1').update(str).digest('hex');
// 对比请求中的 msg_signature 与计算出的 sha1
// 验证通过后直接返回 echostr
return echostr;
}为什么会这样
企业微信为了防止恶意冒充,在保存回调 URL 前会向该地址发送 GET 请求,携带签名参数。服务器必须按特定算法计算签名并原样返回随机字符串,才能证明域名所有权。
分步处理
- 获取凭证:在企业微信管理后台“应用管理”或“自建应用”中找到回调设置,记录 Token 和 EncodingAESKey。
- 编写接口:在 Node.js 项目中创建一个 GET 路由,解析 query 参数中的 msg_signature、timestamp、nonce、echostr。
- 实现算法:将 Token、timestamp、nonce 字典序排序后拼接,进行 SHA1 加密,与 msg_signature 比对。
- 提交配置:将公网可访问的 URL 填入管理后台,点击保存触发验证。
怎么验证是否生效
查看企业微信管理后台回调设置页面,状态显示为“正常”即表示验证通过。后续可通过发送测试消息或查看服务器日志确认是否收到 POST 推送。
常见坑
- 超时限制:企业微信要求验证请求必须在 5 秒内响应,耗时逻辑请异步处理。
- 请求方式:验证阶段是 GET 请求,正式推送是 POST 请求,不要写死方法。
- 编码问题:返回 echostr 时注意编码格式,加密模式下需要解密,明文模式直接返回。
参考来源
- 企业微信官方文档 - 回调模式 - 验证 URL
- https://work.weixin.qq.com/api/doc/90000/90135/90930