| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | const express = require('express');const crypto = require('crypto');const Message = require('../models/message').Message;const { processMessage } = require('../common/message');const { tokenStore } = require('../common/token');const router = express.Router();router.all('/:userPrefix/verify', (req, res, next) => {  // 验证消息来自微信服务器:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html  const userPrefix = req.params.userPrefix;  const { signature, timestamp, nonce, echostr } = req.query;  const token = tokenStore.get(userPrefix).wechatVerifyToken;  let tmp_array = [token, timestamp, nonce].sort();  let tmp_string = tmp_array.join('');  tmp_string = crypto.createHash('sha1').update(tmp_string).digest('hex');  if (tmp_string === signature) {    res.send(echostr);  } else {    res.send('verification failed');  }});router.all('/:userPrefix/:description', async (req, res, next) => {  const userPrefix = req.params.userPrefix;  let message = {    title: '消息推送',    description: req.params.description,    token: req.query.token,  };  res.json(await processMessage(userPrefix, message));});router.all('/:userPrefix', async (req, res, next) => {  const userPrefix = req.params.userPrefix;  let message = {    type: req.query.type || req.body.type,    title: req.query.title || req.body.title || '无标题',    description: req.query.description || req.body.description || '无描述',    content: req.query.content || req.body.content,    email: req.query.email || req.body.email,    token: req.query.token || req.body.token,  };  let result = await processMessage(userPrefix, message);  res.json(result);});module.exports = router;
 |