一、微信公众号验证服务器消息有效性
-
验证服务器的有效性,需要微信服务器知道开发者服务器是哪个,也需要开发者服务器 验证消息是否来自微信服务器。
-
对于微信服务器知道开发者服务器是哪个,可以在公众号管理页面上填写
url
开发者服务器地址,以及填写token
,token
参与微信签名加密的一个参数。 -
对于开发者服务器 验证消息是否来自微信服务器,目的是计算得出
signature
微信加密签名,和微信传递过来的signature
进行对比,如果一样,说明消息来自于微信服务器,如果不一样,说明不是微信服务器发送的消息,所以可以分析过程如下:
- 将参与微信加密签名的三个参数(
timestamp
、token
、nonce
) 按照字典序排序并组合在一起形成一个数组 - 将数组里所有参数拼接成一个字符串,进行
sha1
加密 - 加密完成就生成了一个
signature
,和微信发送过来的进行对比。如果一样,说明消息来自于微信服务器,返回echostr
给服务器。如果不一样,说明不是微信服务器发送的消息,返回error
。
- 在项目的
app.js
文件中,通过npm i express
和npm i sha1
命令分别下载express
和sha1
,并且进行引入,代码如下所示:
const express = require('express')
const sha1 = require('sha1')
- 在
app.js
中,创建app
应用对象,并且定义配置对象,配置对象包括token
、appID
和appsecret
,代码如下所示:
const app = express()
const config = {
token: 'abcd',
appID: '1234abcd',
appsecret: 'abcdefg2w3d'
}
- 验证服务器的有效性,通过
app.use
,传入(req, res, next)
,可以得到一个req.query
,里面包括四个值,分别是signature
、echostr
、timestamp
和nonce
,如下所示:
-
signature: 微信的加密签名,结合你的
token
,timestamp
和nonce
经过某种算法生成的 -
echostr: 微信的随机字符串,微信后台随机生成的
-
timestamp: 微信的发送请求时间戳,对应当前时间
-
nonce: 微信的随机数字,微信后台随机生成的
- 验证服务器的有效性,需要从
req.query
中得到signature
、echostr
、timestamp
和nonce
,得到的值也是微信服务器提交的参数,从config
中得到token
。第一步,将参与微信加密签名的三个参数 (timestamp
、token
、nonce
) 安装字典序排序并组合在一起形成一个数组。第二步,将数组里所有参数拼接成一个字符串,进行sha1
加密。第三步,加密完成后就生成了一个signature
,和微信发送过来的进行对比。如果一样,说明消息来自于微信服务器,返回echostr
给服务器。如果不一样,说明不是微信服务器发送的消息,返回error
,代码如下所示:
app.use((req, res, next) => {
console.log(req.query)
const {signature, echostr, timestamp, nonce } = req.query
const { token } = config
const arr = [timestamp, token, nonce]
const arrSort = arr.sort()
console.log(arrSort)
const str = arr.join('')
console.log(str)
const sha1Str = sha1(str)
console.log(sha1Str)
if (sha1Str === signature) {
res.send(echostr)
} else {
res.end('error')
}
})
- 监听端口号,代码如下所示:
app.listen(3000, () => console.log('服务器启动成功了'))