123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /**
- * 微信客户端。
- *
- * 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;
|