/** * 微信客户端。 * * author: lyr * author: sand * since: 2016/11/25 */ "use strict" let https = require('https'); let configFile = require('../../include/commons').CONFIG_FILE; let config = require('../../resources/config/' + configFile); let log = require('../../util/log'); let WechatTokenRepo = require('../../repository/mysql/wechat.token.repo.js'); class WeChatClient { constructor() { } /** * 发送微信模板消息 * * @param message {touser:"", template_id:"", url:"", data:{firts: {value:"", color:""}}} */ static sendWxTemplateMessage(message, handler) { WehcatClient.getAccessToken(function (err, token) { if (err) { log.error("get access_token failed:" + err); return; } var opt = { host: 'api.weixin.qq.com', path: '/cgi-bin/message/template/send?access_token=' + token, method: 'POST' }; var msg = JSON.stringify(message); log.info("sending wechat template message:" + msg); // 发送模板消息 var req = https.request(opt, 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:" + msg); if (handler) { handler(null, result); } } else { log.error("send wechat template message failed:" + msg); 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); } }); req.end(msg); }); }; /** * 获取微信access_token * * @param handler 回调函数 */ static getAccessToken(handler) { WechatTokenRepo.findOne(function (err, result) { if (err) { log.error("get wechat accessToken failed", err); return; } var data = result && result.length > 0 ? result[0] : null; var accessToken = ""; if (data) { // 判断access_token是否有效 if ((new Date().getTime() - data.add_timestamp) < (data.expires_in * 1000)) { accessToken = data.access_token; } } // access_token为空时从微信新获取并执行回调,否则直接执行回调 if (!accessToken) { var token_url = "https://api.weixin.qq.com/cgi-bin/token?"; var params = "grant_type=client_credential&appid=" + config.wechatConfig.appId + "&secret=" + config.wechatConfig.appSecret; // 从微信获取access_token https.get(token_url + 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; var expiresIn = data.expires_in; WechatTokenRepo.save(accessToken, expiresIn, new Date(), function (err, result) { if (err) { log.error("insert wechat access_token failed:" + err.message); } }); if (handler) handler(null, accessToken); } else { log.error("get wechat access_token failed:" + data); if (handler) handler(data, null); } }); }).on('error', (e) => { log.error("get wechat access_token from wechat failed:" + e.message); if (handler) handler(data, null); }); } else { if (handler) handler(data, null); } }); }; } module.exports = WeChatClient;