wechat.js 1.9 KB

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