From d36680aea1414393074d18a8a2dc7acd7be08c49 Mon Sep 17 00:00:00 2001 From: Song Date: Sun, 17 Jan 2021 16:45:52 +0800 Subject: [PATCH] :tada: now you can push message to wechat --- common/token.js | 11 ++++--- common/wechat.js | 15 ++++++---- middlewares/web_auth.js | 26 +++++++---------- routers/index.js | 59 +++++++++++++++++++++++++++++-------- routers/user.js | 14 ++++++--- views/configure.ejs | 65 ++++++++++++++++++++++++++++++++++++----- views/partials/nav.ejs | 3 +- 7 files changed, 142 insertions(+), 51 deletions(-) diff --git a/common/token.js b/common/token.js index 8d60a4e..988976a 100644 --- a/common/token.js +++ b/common/token.js @@ -7,16 +7,15 @@ async function initializeTokenStore() { users.forEach((user) => { if (user.wechatAppId) { tokenStore.set(user.prefix, { - appId: user.wechatAppId, - appSecret: user.wechatAppSecret, - templateId: user.wechatTemplateId, - openId: user.wechatOpenId, - serverVerifyToken: user.wechatVerifyToken, + wechatAppId: user.wechatAppId, + wechatAppSecret: user.wechatAppSecret, + wechatTemplateId: user.wechatTemplateId, + wechatOpenId: user.wechatOpenId, + wechatVerifyToken: user.wechatVerifyToken, token: '', }); } }); - console.debug(tokenStore); console.log('Token store initialized.'); } diff --git a/common/wechat.js b/common/wechat.js index 471339b..25575a7 100644 --- a/common/wechat.js +++ b/common/wechat.js @@ -3,8 +3,9 @@ const { tokenStore } = require('./token'); const config = require('../config'); async function refreshToken() { - for (const item of tokenStore) { - item.token = await this.requestToken(); + for (let [key, value] of tokenStore) { + value.token = await requestToken(value.wechatAppId, value.wechatAppSecret); + tokenStore.set(key, value); } console.log('Token refreshed.'); } @@ -15,9 +16,13 @@ async function requestToken(appId, appSecret) { let res = await axios.get( `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}` ); - console.log(res); - if (res && res.data && res.data.access_token) { - token = res.data.access_token; + // console.debug(res); + if (res && res.data) { + if (res.data.access_token) { + token = res.data.access_token; + } else { + console.error(res.data); + } } } catch (e) { console.error(e); diff --git a/middlewares/web_auth.js b/middlewares/web_auth.js index 077a75e..099c39b 100644 --- a/middlewares/web_auth.js +++ b/middlewares/web_auth.js @@ -3,36 +3,30 @@ const config = require('../config'); exports.userRequired = (req, res, next) => { if (req.session.user) { if (req.session.user.isBlocked) { - return res.render('message', { - isError: true, - message: '用户账户被禁用,请联系管理员', - link: '/feedback', - }); + req.flash('message', '用户账户被禁用,请联系管理员'); + return res.redirect('/'); } } else { - return res.render('message', { - isError: false, - message: '用户尚未登录,请登录', - link: '/login', - }); + req.flash('message', '用户尚未登录,请登录'); + return res.redirect('/login'); } next(); }; exports.adminRequired = (req, res, next) => { if (!req.session.user || !req.session.user.isAdmin) { - return res.render('message', { - isError: true, - message: '需要超级管理员权限', - }); + req.flash('message', '需要管理员权限'); + return res.redirect('/login'); } next(); }; exports.allowRegister = (req, res, next) => { if (!config.allowRegister) { - req.flash('message', '管理员未开放注册!'); - return res.redirect('/'); + if (!req.session.user || !req.session.user.isAdmin) { + req.flash('message', '管理员未开放注册!'); + return res.redirect('/'); + } } next(); }; diff --git a/routers/index.js b/routers/index.js index 62af439..09e2fe2 100644 --- a/routers/index.js +++ b/routers/index.js @@ -2,7 +2,12 @@ const express = require('express'); const router = express.Router(); const { User } = require('../models'); const { tokenStore } = require('../common/token'); -const { allowRegister } = require('../middlewares/web_auth'); +const { requestToken } = require('../common/wechat'); +const { + userRequired, + adminRequired, + allowRegister, +} = require('../middlewares/web_auth'); const config = require('../config'); router.get('/', (req, res, next) => { @@ -12,7 +17,9 @@ router.get('/', (req, res, next) => { }); router.get('/login', (req, res, next) => { - res.render('login'); + res.render('login', { + message: req.flash('message'), + }); }); router.post('/login', async (req, res, next) => { @@ -45,7 +52,7 @@ router.post('/login', async (req, res, next) => { }); }); -router.get('/logout', (req, res, next) => { +router.get('/logout', userRequired, (req, res, next) => { req.session.user = undefined; req.flash('message', '已退出登录'); res.redirect('/'); @@ -67,7 +74,13 @@ router.post('/register', allowRegister, async (req, res, next) => { } }); -router.post('/configure', async (req, res, next) => { +router.get('/configure', userRequired, (req, res, next) => { + res.locals.message = req.flash('message'); + res.render('configure', req.session.user); +}); + +router.post('/configure', userRequired, async (req, res, next) => { + let id = req.session.user.id; let user = { username: req.body.username, password: req.body.password, @@ -80,19 +93,41 @@ router.post('/configure', async (req, res, next) => { wechatOpenId: req.body.wechatOpenId, wechatVerifyToken: req.body.wechatVerifyToken, }; + for (let field in user) { + let value = user[field]; + value = value.trim(); + if (value) { + user[field] = value; + } else { + delete user[field]; + } + } + let message = ''; try { - user = await User.create(user); - tokenStore.set(user.prefix, { - appId: user.wechatAppId, - appSecret: user.wechatAppSecret, - templateId: user.wechatTemplateId, - openId: user.wechatOpenId, - wechatVerifyToken: user.wechatVerifyToken, - token: '', + let userObj = await User.findOne({ + where: { + id: id, + }, }); + if (userObj) { + await userObj.update(user); + } + req.session.user = userObj; + tokenStore.set(userObj.prefix, { + appId: userObj.wechatAppId, + appSecret: userObj.wechatAppSecret, + templateId: userObj.wechatTemplateId, + openId: userObj.wechatOpenId, + wechatVerifyToken: userObj.wechatVerifyToken, + token: requestToken(userObj.wechatAppId, userObj.wechatAppSecret), + }); + message = '配置更新成功'; } catch (e) { console.error(e); + message = e.message; } + req.flash('message', message); + res.redirect('/configure'); }); module.exports = router; diff --git a/routers/user.js b/routers/user.js index d8088b5..fb7c1e7 100644 --- a/routers/user.js +++ b/routers/user.js @@ -6,10 +6,6 @@ const { tokenStore } = require('../common/token'); const router = express.Router(); -router.get('/:userPrefix/configure', (req, res, next) => { - res.render('configure'); -}); - router.all('/:userPrefix/verify', (req, res, next) => { // 验证消息来自微信服务器:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html const userPrefix = req.params.userPrefix; @@ -25,6 +21,16 @@ router.all('/:userPrefix/verify', (req, res, next) => { } }); +router.all('/:userPrefix/:description', async (req, res, next) => { + const userPrefix = req.params.userPrefix; + let message = { + type: '0', + title: '无标题', + description: req.params.description, + }; + res.json(await processMessage(userPrefix, message)); +}); + router.all('/:userPrefix', async (req, res, next) => { const userPrefix = req.params.userPrefix; let message = { diff --git a/views/configure.ejs b/views/configure.ejs index c8f5285..d1520e1 100644 --- a/views/configure.ejs +++ b/views/configure.ejs @@ -3,48 +3,99 @@

配置页面

+ <%- include('./partials/message') %>
- +
- +
- +
- +
- + +
+
+ +
+ +
+
+ 前缀默认和用户名相同,如非必要,无需修改 +
+
+
+ +
+
+ +
+ +
+
+ Access Token 可防止未授权者利用本系统向你发送消息,留空则不做该检查 +
+
+
+ +
+
+ +
+ +
+
+ 后续版本将支持选择将消息发送到邮箱 +
+
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
- +
- +
diff --git a/views/partials/nav.ejs b/views/partials/nav.ejs index 8337da2..d4edf1d 100644 --- a/views/partials/nav.ejs +++ b/views/partials/nav.ejs @@ -15,13 +15,14 @@