wechat.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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: `tokenStore 中不存在该前缀(${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}${userPrefix}/${message.id}`;
  46. }
  47. request_data.data = { text: { value: message.description } };
  48. let requestUrl = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${access_token}`;
  49. try {
  50. let response = await axios.post(requestUrl, request_data);
  51. if (response && response.data && response.data.errcode === '40001') {
  52. await requestToken(user.wechatAppId, user.wechatAppSecret);
  53. await axios.post(requestUrl, request_data);
  54. }
  55. console.log(response.data);
  56. return {
  57. success: true,
  58. message: '',
  59. };
  60. } catch (e) {
  61. console.error(e);
  62. return {
  63. success: false,
  64. message: e.message,
  65. };
  66. }
  67. }
  68. module.exports = {
  69. refreshToken,
  70. requestToken,
  71. pushWeChatMessage,
  72. };