Nodejs 微信接入验证token是只做第一次验证,还是每次都验证啊?

Nodejs 微信接入验证token是只做第一次验证,还是每次都验证啊?

微信接入验证token是只做第一次验证,还是每次都验证啊?

3 回复

当然可以。在讨论这个问题之前,我们需要理解微信接入验证的背景。微信平台为了确保接入的安全性,会在开发者服务器进行接入验证时发送一个特定的请求,其中包含了一个 timestampnoncesignature 参数,这些参数共同构成了一个验证签名(signature),用于验证请求的真实性。

验证流程

微信服务器会定期向你的服务器发送一个GET请求,例如:

https://yourdomain.com/wechat?signature=SIGNATURE&echostr=ECHO_STR&timestamp=TIMESTAMP&nonce=NONCE
  • signature: 是通过微信提供的算法计算出的一个字符串。
  • echostr: 是一个随机字符串,用于确认接收到的消息。
  • timestamp: 请求的时间戳。
  • nonce: 请求的随机数。

Node.js 实现

为了实现这个验证,你需要编写一个处理该请求的路由,并且每次收到请求时都执行验证逻辑。验证通过后,返回 echostr 给微信服务器,这样微信服务器就知道你的服务器已经验证成功了。

示例代码

const express = require('express');
const crypto = require('crypto');

const app = express();

app.get('/wechat', (req, res) => {
    const token = 'YOUR_TOKEN'; // 这里替换为你的token
    const { signature, timestamp, nonce, echostr } = req.query;

    // 创建排序后的字符串
    const sha1 = crypto.createHash('sha1');
    const str = [token, timestamp, nonce].sort().join('');
    sha1.update(str);
    const hash = sha1.digest('hex');

    if (hash === signature) {
        res.send(echostr); // 返回echostr以验证服务器
    } else {
        res.status(403).send('Forbidden'); // 如果签名不匹配,返回403
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

结论

从上述代码中可以看出,每次接收到微信服务器的请求时,都会重新计算签名并进行比较。因此,验证过程并不是只做第一次验证,而是每次都进行验证。这是因为每次请求可能都有不同的 timestampnonce,因此需要每次都进行验证以确保安全性。


每天有次数限制的.我是7000000毫秒获取一次.

微信接入验证Token是为了确保服务器的安全性和有效性。通常情况下,在微信服务器首次向你的服务器发起请求时会进行一次验证。一旦验证成功,微信服务器会在后续的请求中带上相同的Token信息,以确保这次连接是安全可信的。

因此,理论上来说,只需要在第一次接收微信服务器的验证请求时进行Token验证。但为了防止Token泄露或被篡改,建议在每次接收到微信服务器的请求时都进行验证。这可以通过检查请求中的Token是否与预设的Token一致来实现。

以下是一个简单的Node.js示例代码,用于处理微信接入验证请求并进行Token验证:

const express = require('express');
const app = express();

// 预设的Token
const TOKEN = 'your-token';

app.get('/wechat', (req, res) => {
    const signature = req.query.signature; // 微信加密签名
    const timestamp = req.query.timestamp; // 时间戳
    const nonce = req.query.nonce; // 随机数
    const echostr = req.query.echostr; // 随机字符串

    // 构造一个数组,包含TOKEN、timestamp、nonce,并对其进行字典序排序
    const array = [TOKEN, timestamp, nonce];
    array.sort();

    // 将排序后的数组拼接成字符串,并通过sha1算法生成加密签名
    const tempStr = array.join('');
    const tempSignature = sha1(tempStr);

    // 比较微信服务器传来的signature与自己计算得到的signature是否相同
    if (tempSignature === signature) {
        // 如果相同,则返回echostr,用于微信服务器确认此次请求
        res.send(echostr);
    } else {
        // 如果不相同,则表示请求无效
        res.status(403).send('Forbidden');
    }
});

// 启动服务器
app.listen(3000, () => console.log('Server is running on port 3000'));

在这个例子中,我们使用了sha1库来生成签名。如果想要运行上述代码,请先安装expresscrypto库。安装方法为:

npm install express
npm install crypto

以上代码展示了如何验证微信服务器的请求。每次请求都会验证Token,以确保安全性。

回到顶部