wechat.js 2.2 KB

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