/** * 简易微信SDK。 * * author: Sand * since: 1/6/2017 */ "use strict"; let WechatTokenRepo = require('../repository/mysql/wechat.token.repo.js'); let configFile = require('../include/commons').CONFIG_FILE; let config = require('../resources/config/' + configFile); let log = require('./log'); let https = require('https'); class WechatSDK { constructor() { } /** * 获取微信access_token */ static getAccessToken(handler) { WechatTokenRepo.findOne(function (err, result) { if (err) { handler(err, null); return; } var data = result && result.length > 0 ? result[0] : null; var accessToken = ""; // 判断access_token是否有效 if (data) { if ((new Date().getTime() - data.add_timestamp) < (data.expires_in * 1000)) { accessToken = data.access_token; } } // access_token为空时从微信新获取并执行回调,否则直接执行回调 if (!accessToken) { var basePath = "https://api.weixin.qq.com/cgi-bin/token?"; var params = "grant_type=client_credential&appid=" + config.wechatConfig.appId + "&secret=" + config.wechatConfig.appSecret; https.get(basePath + params, function (res) { var data = ''; res.on('data', (d) => { data += d; }); res.on('end', () => { data = data ? JSON.parse(data) : {}; if (data.access_token) { accessToken = data.access_token; WechatTokenRepo.save(accessToken, data.expires_in, new Date(), function (err, result) { if (err) { if (handler) handler(err, null); } else { if (handler) handler(null, accessToken); } }); } else { if (handler) handler(Error("Get access_token from wechat failed"), null); } }); }).on('error', (e) => { if (handler) handler(Error("Get access_token from wechat failed: " + e.message), null); }); } else { if (handler) handler(data, null); } }); }; /** * 发送微信模板消息 */ static sendTemplateMessage(message, handler) { WechatSDK.getAccessToken(function (err, token) { if (err) { log.error(err); handler(err, null); return; } // 发送模板消息 var messageJSON = JSON.stringify(message); var request = https.request({ host: 'api.weixin.qq.com', path: '/cgi-bin/message/template/send?access_token=' + token, method: 'POST' }, function (res) { res.setEncoding('utf8'); var data = ""; res.on('data', (d) => { data += d; }); res.on('end', () => { var result = JSON.parse(data); if (result && result.errcode === 0) { log.info("send wechat template message success:" + messageJSON); if (handler) { handler(null, result); } } else { log.error("send wechat template message failed:" + messageJSON); if (handler) { handler(result, null); } } }); res.on('error', function (err) { log.error('send wechat template message failed: ' + err.message); if (handler) { handler(err, null); } }); }) .on('error', (e) => { log.error("send wechat template message failed:" + e.message); if (handler) { handler(e, null); } }); request.end(messageJSON); }); }; } module.exports = WechatSDK;