wechat.sdk.js 4.6 KB

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