wechat-corp.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. }
  55. let requestUrl = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`;
  56. try {
  57. let response = await axios.post(requestUrl, request_data);
  58. if (response && response.data && response.data.errcode !== 0) {
  59. // Failed to push message, get a new token and try again.
  60. access_token = await requestToken(user.corpId, user.corpAppSecret);
  61. updateTokenStore(userPrefix, 'corpToken', access_token);
  62. requestUrl = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`;
  63. response = await axios.post(requestUrl, request_data);
  64. }
  65. if (response.data.errcode === 0) {
  66. return {
  67. success: true,
  68. message: 'ok',
  69. };
  70. } else {
  71. return {
  72. success: false,
  73. message: response.data.errmsg,
  74. };
  75. }
  76. } catch (e) {
  77. console.error(e);
  78. return {
  79. success: false,
  80. message: e.message,
  81. };
  82. }
  83. }
  84. module.exports = {
  85. refreshToken,
  86. requestToken,
  87. pushWeChatCorpMessage,
  88. };