wechat.client.js 4.9 KB

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