今天,按流水线写文档
/* app.js 调用定时器方法*/
const schedule = require('./utils/schedule');
schedule.setSchedule();
/* /utils/schedule 定时器方法 */
const schedule = require('node-schedule');
const { updateToken } = require('./updateToken'); // 刷新token的方法
//其他规则见 https://www.npmjs.com/package/node-schedule
let rule = new schedule.RecurrenceRule();
// rule.hour = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22];
// 每小时的第30分钟调用
rule.hour = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];
rule.minute = 30;
function setSchedule() {
schedule.scheduleJob(rule, () => {
updateToken(); // 定时点到了就调用
})
};
module.exports = {
setSchedule
};
/*
* updateToken.js 定时刷新token
* 微信js-sdk文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
* 附录1,讲解token刷新规则:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62
*/
const jssdkConfig = require('../config/jssdk');
const request = require('./request').get;
const redis = require('./redis'); // redis使用看文档:https://www.yuque.com/xiebugde/mbz0hg/dou4fg
exports.updateToken = async () => {
const url = jssdkConfig.getTokenUrl;
const params = {
grant_type: jssdkConfig.grant_type,
appid: jssdkConfig.appid,
secret: jssdkConfig.secret,
};
const opts = {};
const result = await request(url, params, opts);
if (result.access_token) {
await redis.set('token', result.access_token);
updateTicket();
} else {
console.log('获取token失败', result);
}
};
const updateTicket = async () => {
let token = '';
await redis.get('token', (err, result) => {
token = result;
});
const url = jssdkConfig.getTicketUrl;
const params = {
access_token: token,
type: jssdkConfig.type,
};
const opts = {};
const result = await request(url, params, opts);
if (result.errcode === '0' || result.errcode === 0) {
redis.set('ticket', result.ticket);
} else {
console.log('获取ticket失败', result);
}
};
如果前端要做微信分享,需要写个接口返回签名等信息,接口如下
const sha1 = require("sha1");
const redis = require("../utils/redis");
const jssdkConfig = require('../config/jssdk');
const { getNonceStr } = require('../utils/sign'); // 看下文
router.post('/GetJSConfig', async (ctx, next) => {
let ticket = '';
await redis.get('ticket', (err, result) => {
ticket = result;
})
const timestamp = Date.parse(new Date()) / 1000;
const nonceStr = getNonceStr(15); // 15位字母和数字的随机数
const url = ctx.request.body.url;
const signature = sha1(`jsapi_ticket=${ticket}&noncestr=${nonceStr}×tamp=${timestamp}&url=${url}`);
const result = {
appId: jssdkConfig.appid,
timestamp,
signature,
jsApiList: [
'onMenuShareWeibo',
'updateAppMessageShareData',
'updateTimelineShareData',
]
};
ctx.body = result;
});
获取签名的方法
/* utils/sign.js 获取15位字母和数字的随机数 */
exports.getNonceStr = len => {
var rdmString = "";
for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
return rdmString.substr(0, len);
}