wechat-corp.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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.corpId) {
  7. value.corpToken = await requestToken(value.corpId, value.corpAppSecret);
  8. tokenStore.set(key, value);
  9. }
  10. }
  11. console.log('Token refreshed.');
  12. }
  13. async function requestToken(corpId, corpAppSecret) {
  14. // Reference: https://work.weixin.qq.com/api/doc/90000/90135/91039
  15. let token = '';
  16. try {
  17. let res = await axios.get(
  18. `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpId}&corpsecret=${corpAppSecret}`
  19. );
  20. // console.debug(res);
  21. if (res && res.data) {
  22. if (res.data.access_token) {
  23. token = res.data.access_token;
  24. } else {
  25. console.error(res.data);
  26. }
  27. }
  28. } catch (e) {
  29. console.error(e);
  30. }
  31. return token;
  32. }
  33. async function pushWeChatCorpMessage(userPrefix, message) {
  34. // Reference: https://work.weixin.qq.com/api/doc/90000/90135/90236
  35. let user = tokenStore.get(userPrefix);
  36. if (!user) {
  37. return {
  38. success: false,
  39. message: `不存在的前缀:${userPrefix},请注意大小写`,
  40. };
  41. }
  42. let access_token = user.corpToken;
  43. let request_data = {
  44. msgtype: 'textcard',
  45. touser: user.corpUserId,
  46. agentid: user.corpAgentId,
  47. textcard: {
  48. title: message.title,
  49. description: message.description,
  50. },
  51. };
  52. if (message.content) {
  53. request_data.textcard.url = `${config.href}message/${message.id}`;
  54. } else {
  55. request_data.textcard.url = `${config.href}`;
  56. }
  57. let requestUrl = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`;
  58. try {
  59. let response = await axios.post(requestUrl, request_data);
  60. if (response && response.data && response.data.errcode !== 0) {
  61. // Failed to push message, get a new token and try again.
  62. access_token = await requestToken(user.corpId, user.corpAppSecret);
  63. updateTokenStore(userPrefix, 'corpToken', access_token);
  64. requestUrl = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`;
  65. response = await axios.post(requestUrl, request_data);
  66. }
  67. if (response.data.errcode === 0) {
  68. return {
  69. success: true,
  70. message: 'ok',
  71. };
  72. } else {
  73. return {
  74. success: false,
  75. message: response.data.errmsg,
  76. };
  77. }
  78. } catch (e) {
  79. console.error(e);
  80. let msg = e.message;
  81. if (msg.startsWith('access_token missing')) {
  82. msg = '请求微信服务器失败,请检查配置是否正确或重试!';
  83. }
  84. return {
  85. success: false,
  86. message: msg,
  87. };
  88. }
  89. }
  90. module.exports = {
  91. refreshToken,
  92. requestToken,
  93. pushWeChatCorpMessage,
  94. };