wechat.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. const axios = require('axios');
  2. const { tokenStore, updateTokenStore } = require('./token');
  3. const config = require('../config');
  4. async function refreshToken() {
  5. for (let [key, value] of tokenStore) {
  6. if (value.wechatAppId) {
  7. value.wechatToken = await requestToken(
  8. value.wechatAppId,
  9. value.wechatAppSecret
  10. );
  11. tokenStore.set(key, value);
  12. }
  13. }
  14. console.log('Token refreshed.');
  15. }
  16. async function requestToken(appId, appSecret) {
  17. let token = '';
  18. try {
  19. let res = await axios.get(
  20. `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`
  21. );
  22. // console.debug(res);
  23. if (res && res.data) {
  24. if (res.data.access_token) {
  25. token = res.data.access_token;
  26. } else {
  27. console.error(res.data);
  28. }
  29. }
  30. } catch (e) {
  31. console.error(e);
  32. }
  33. return token;
  34. }
  35. async function pushWeChatMessage(userPrefix, message) {
  36. // Reference: https://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=tmplmsg/faq_tmpl
  37. let user = tokenStore.get(userPrefix);
  38. if (!user) {
  39. return {
  40. success: false,
  41. message: `不存在的前缀:${userPrefix},请注意大小写`,
  42. };
  43. }
  44. let access_token = user.wechatToken;
  45. let request_data = {
  46. touser: user.wechatOpenId,
  47. template_id: user.wechatTemplateId,
  48. };
  49. if (message.content) {
  50. request_data.url = `${config.href}message/${message.id}`;
  51. }
  52. request_data.data = { text: { value: message.description } };
  53. let requestUrl = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${access_token}`;
  54. try {
  55. let response = await axios.post(requestUrl, request_data);
  56. if (response && response.data && response.data.errcode !== 0) {
  57. // Failed to push message, get a new token and try again.
  58. let token = await requestToken(user.wechatAppId, user.wechatAppSecret);
  59. updateTokenStore(userPrefix, 'wechatToken', token);
  60. requestUrl = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${access_token}`;
  61. response = await axios.post(requestUrl, request_data);
  62. }
  63. if (response.data.errcode === 0) {
  64. return {
  65. success: true,
  66. message: 'ok',
  67. };
  68. } else {
  69. return {
  70. success: false,
  71. message: response.data.errmsg,
  72. };
  73. }
  74. } catch (e) {
  75. console.error(e);
  76. return {
  77. success: false,
  78. message: e.message,
  79. };
  80. }
  81. }
  82. module.exports = {
  83. refreshToken,
  84. requestToken,
  85. pushWeChatMessage,
  86. };