微信公众号开发如何验证服务器消息的有效性

一、微信公众号验证服务器消息有效性
  1. 验证服务器的有效性,需要微信服务器知道开发者服务器是哪个,也需要开发者服务器 验证消息是否来自微信服务器。

  2. 对于微信服务器知道开发者服务器是哪个,可以在公众号管理页面上填写 url 开发者服务器地址,以及填写tokentoken 参与微信签名加密的一个参数。

  3. 对于开发者服务器 验证消息是否来自微信服务器,目的是计算得出 signature 微信加密签名,和微信传递过来的 signature 进行对比,如果一样,说明消息来自于微信服务器,如果不一样,说明不是微信服务器发送的消息,所以可以分析过程如下:

  • 将参与微信加密签名的三个参数(timestamptokennonce) 按照字典序排序并组合在一起形成一个数组
  • 将数组里所有参数拼接成一个字符串,进行 sha1 加密
  • 加密完成就生成了一个 signature,和微信发送过来的进行对比。如果一样,说明消息来自于微信服务器,返回 echostr 给服务器。如果不一样,说明不是微信服务器发送的消息,返回 error
  1. 在项目的 app.js 文件中,通过 npm i expressnpm i sha1 命令分别下载 expresssha1,并且进行引入,代码如下所示:
const express = require('express')
const sha1 = require('sha1')
  1. app.js 中,创建 app 应用对象,并且定义配置对象,配置对象包括 tokenappIDappsecret,代码如下所示:
const app = express()

const config = {
    token: 'abcd',
    appID: '1234abcd',
    appsecret: 'abcdefg2w3d'
}
  1. 验证服务器的有效性,通过 app.use,传入 (req, res, next),可以得到一个req.query,里面包括四个值,分别是signatureechostrtimestampnonce,如下所示:
  • signature: 微信的加密签名,结合你的tokentimestampnonce经过某种算法生成的

  • echostr: 微信的随机字符串,微信后台随机生成的

  • timestamp: 微信的发送请求时间戳,对应当前时间

  • nonce: 微信的随机数字,微信后台随机生成的

  1. 验证服务器的有效性,需要从 req.query 中得到signatureechostrtimestampnonce,得到的值也是微信服务器提交的参数,从 config 中得到 token。第一步,将参与微信加密签名的三个参数 (timestamptokennonce) 安装字典序排序并组合在一起形成一个数组。第二步,将数组里所有参数拼接成一个字符串,进行 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')
    }
})
  1. 监听端口号,代码如下所示:
app.listen(3000, () => console.log('服务器启动成功了'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值