今天,按流水线写文档

    1. /* app.js 调用定时器方法*/
    2. const schedule = require('./utils/schedule');
    3. schedule.setSchedule();
    1. /* /utils/schedule 定时器方法 */
    2. const schedule = require('node-schedule');
    3. const { updateToken } = require('./updateToken'); // 刷新token的方法
    4. //其他规则见 https://www.npmjs.com/package/node-schedule
    5. let rule = new schedule.RecurrenceRule();
    6. // rule.hour = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22];
    7. // 每小时的第30分钟调用
    8. 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];
    9. rule.minute = 30;
    10. function setSchedule() {
    11. schedule.scheduleJob(rule, () => {
    12. updateToken(); // 定时点到了就调用
    13. })
    14. };
    15. module.exports = {
    16. setSchedule
    17. };
    1. /*
    2. * updateToken.js 定时刷新token
    3. * 微信js-sdk文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
    4. * 附录1,讲解token刷新规则:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62
    5. */
    6. const jssdkConfig = require('../config/jssdk');
    7. const request = require('./request').get;
    8. const redis = require('./redis'); // redis使用看文档:https://www.yuque.com/xiebugde/mbz0hg/dou4fg
    9. exports.updateToken = async () => {
    10. const url = jssdkConfig.getTokenUrl;
    11. const params = {
    12. grant_type: jssdkConfig.grant_type,
    13. appid: jssdkConfig.appid,
    14. secret: jssdkConfig.secret,
    15. };
    16. const opts = {};
    17. const result = await request(url, params, opts);
    18. if (result.access_token) {
    19. await redis.set('token', result.access_token);
    20. updateTicket();
    21. } else {
    22. console.log('获取token失败', result);
    23. }
    24. };
    25. const updateTicket = async () => {
    26. let token = '';
    27. await redis.get('token', (err, result) => {
    28. token = result;
    29. });
    30. const url = jssdkConfig.getTicketUrl;
    31. const params = {
    32. access_token: token,
    33. type: jssdkConfig.type,
    34. };
    35. const opts = {};
    36. const result = await request(url, params, opts);
    37. if (result.errcode === '0' || result.errcode === 0) {
    38. redis.set('ticket', result.ticket);
    39. } else {
    40. console.log('获取ticket失败', result);
    41. }
    42. };

    如果前端要做微信分享,需要写个接口返回签名等信息,接口如下

    1. const sha1 = require("sha1");
    2. const redis = require("../utils/redis");
    3. const jssdkConfig = require('../config/jssdk');
    4. const { getNonceStr } = require('../utils/sign'); // 看下文
    5. router.post('/GetJSConfig', async (ctx, next) => {
    6. let ticket = '';
    7. await redis.get('ticket', (err, result) => {
    8. ticket = result;
    9. })
    10. const timestamp = Date.parse(new Date()) / 1000;
    11. const nonceStr = getNonceStr(15); // 15位字母和数字的随机数
    12. const url = ctx.request.body.url;
    13. const signature = sha1(`jsapi_ticket=${ticket}&noncestr=${nonceStr}&timestamp=${timestamp}&url=${url}`);
    14. const result = {
    15. appId: jssdkConfig.appid,
    16. timestamp,
    17. signature,
    18. jsApiList: [
    19. 'onMenuShareWeibo',
    20. 'updateAppMessageShareData',
    21. 'updateTimelineShareData',
    22. ]
    23. };
    24. ctx.body = result;
    25. });

    获取签名的方法

    1. /* utils/sign.js 获取15位字母和数字的随机数 */
    2. exports.getNonceStr = len => {
    3. var rdmString = "";
    4. for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
    5. return rdmString.substr(0, len);
    6. }