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