|
@ -0,0 +1,149 @@
|
|
|
|
/**
|
|
|
|
* 微信工具类
|
|
|
|
*
|
|
|
|
* 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/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;
|