wechatUtil.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**
  2. * 微信工具类
  3. *
  4. * Created by lyr-pc on 2016/11/25.
  5. */
  6. "use strict"
  7. var log = require('./log');
  8. var configFile = require('../include/commons').CONFIG_FILE;
  9. var config = require('../resources/config/' + configFile);
  10. var wxTokenRepo = require('../repository/mysql/wechat.token.repo.js');
  11. var https = require('https');
  12. /**
  13. * 发送微信模板消息
  14. *
  15. * @param message {"touser":"","template_id":"","url":"","data":{"firts":{"value":"","color":""}}}
  16. */
  17. function sendWxTemplateMessage(message, handler) {
  18. getWxAccessToken(function (err, token) {
  19. if (err) {
  20. log.error("get access_token failed:" + err);
  21. return;
  22. }
  23. var opt = {
  24. host: 'api.weixin.qq.com',
  25. path: '/cgi-bin/message/template/send?access_token=' + token,
  26. method: 'POST'
  27. };
  28. var msg = JSON.stringify(message);
  29. log.info("sending wechat template message:" + msg);
  30. // 发送模板消息
  31. var req = https.request(opt, function (res) {
  32. res.setEncoding('utf8');
  33. var data = "";
  34. res.on('data', (d) => {
  35. data += d;
  36. });
  37. res.on('end', () => {
  38. var result = JSON.parse(data);
  39. if (result && result.errcode === 0) {
  40. log.info("send wechat template message success:" + msg);
  41. if (handler) {
  42. handler(null, result);
  43. }
  44. } else {
  45. log.error("send wechat template message failed:" + msg);
  46. if (handler) {
  47. handler(result, null);
  48. }
  49. }
  50. });
  51. res.on('error', function (err) {
  52. log.error('send wechat template message failed: ' + err.message);
  53. if (handler) {
  54. handler(err, null);
  55. }
  56. });
  57. }).on('error', (e) => {
  58. log.error("send wechat template message failed:" + e.message);
  59. if (handler) {
  60. handler(e, null);
  61. }
  62. });
  63. req.end(msg);
  64. });
  65. };
  66. /**
  67. * 获取微信access_token
  68. *
  69. * @param handler 回调函数
  70. */
  71. function getWxAccessToken(handler) {
  72. wxTokenRepo.getAccessToken(function (err, result) {
  73. if (err) {
  74. log.error("get wechat accessToken failed", err);
  75. return;
  76. }
  77. var data = result && result.length > 0 ? result[0] : null;
  78. var accessToken = "";
  79. if (data) {
  80. // 判断access_token是否有效
  81. if ((new Date().getTime() - data.add_timestamp) < (data.expires_in * 1000)) {
  82. accessToken = data.access_token;
  83. }
  84. }
  85. // access_token为空时从微信重新获取并执行回调,否则直接执行回调
  86. if (!accessToken) {
  87. var token_url = "https://api.weixin.qq.com/cgi-bin/token?";
  88. var params = "grant_type=client_credential&appid=" + config.wechatConfig.appId
  89. + "&secret=" + config.wechatConfig.appSecret;
  90. // 从微信获取access_token
  91. https.get(token_url + params, function (res) {
  92. var data = '';
  93. res.on('data', (d) => {
  94. data += d;
  95. });
  96. res.on('end', () => {
  97. data = data ? JSON.parse(data) : {};
  98. if (data.access_token) {
  99. accessToken = data.access_token;
  100. var expiresIn = data.expires_in;
  101. if (handler) {
  102. // 执行回调
  103. handler(null, accessToken);
  104. }
  105. var tokenData = [accessToken, new Date().getTime(), expiresIn, new Date()];
  106. // 保存access_token
  107. wxTokenRepo.saveAccessToken(tokenData, function (err, result) {
  108. if (err) {
  109. log.error("insert wechat access_token failed:" + err.message);
  110. }
  111. })
  112. } else {
  113. log.error("get wechat access_token failed:" + data);
  114. if (handler) {
  115. // 执行回调
  116. handler(data, null);
  117. }
  118. }
  119. });
  120. }).on('error', (e) => {
  121. log.error("get wechat access_token from wechat failed:" + e.message);
  122. if (handler) {
  123. // 执行回调
  124. handler(e, null);
  125. }
  126. });
  127. } else {
  128. if (handler) {
  129. // 执行回调
  130. handler(null, accessToken);
  131. }
  132. }
  133. });
  134. };
  135. exports.sendWxTemplateMessage = sendWxTemplateMessage;
  136. exports.getWxAccessToken = getWxAccessToken;