/** * 微信工具类 * * Created by lyr-pc on 2016/11/25. */ "use strict" var log = require('./log'); var configFile = require('../include/commons').CONFIG_FILE; var config = require('../resources/config/' + configFile); var wxTokenRepo = require('../repository/mysql/wechat.token.repo.js'); var https = require('https'); /** * 发送微信模板消息 * * @param message {"touser":"","template_id":"","url":"","data":{"firts":{"value":"","color":""}}} */ function sendWxTemplateMessage(message, handler) { getWxAccessToken(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 回调函数 */ function getWxAccessToken(handler) { wxTokenRepo.getAccessToken(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; if (handler) { // 执行回调 handler(null, accessToken); } var tokenData = [accessToken, new Date().getTime(), expiresIn, new Date()]; // 保存access_token wxTokenRepo.saveAccessToken(tokenData, function (err, result) { if (err) { log.error("insert wechat access_token failed:" + err.message); } }) } 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(e, null); } }); } else { if (handler) { // 执行回调 handler(null, accessToken); } } }); }; exports.sendWxTemplateMessage = sendWxTemplateMessage; exports.getWxAccessToken = getWxAccessToken;