|  | @ -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;
 |