const axios = require('axios'); let accessTokenCache = { token: null, expiresAt: null }; class WechatSubscribeService { static async getAccessToken() { const now = Date.now(); if (accessTokenCache.token && accessTokenCache.expiresAt && now < accessTokenCache.expiresAt) { return accessTokenCache.token; } const appId = process.env.WECHAT_APPID; const appSecret = process.env.WECHAT_APPSECRET; const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`; try { const response = await axios.get(url); const { access_token, expires_in } = response.data; accessTokenCache = { token: access_token, expiresAt: now + (expires_in - 300) * 1000 }; return access_token; } catch (error) { console.error('获取微信 access_token 失败:', error.response?.data || error.message); throw new Error('获取微信 access_token 失败'); } } static async sendSubscribeMessage({ touser, templateId, page, data }) { const accessToken = await this.getAccessToken(); const url = `https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${accessToken}`; const requestData = { touser, template_id: templateId, page: page || 'pages/index/index', data }; try { const response = await axios.post(url, requestData); if (response.data.errcode === 0) { return { success: true, messageId: response.data.msgid }; } else { console.error('发送订阅消息失败:', response.data); return { success: false, errcode: response.data.errcode, errmsg: response.data.errmsg }; } } catch (error) { console.error('发送订阅消息异常:', error.response?.data || error.message); return { success: false, errmsg: error.message }; } } static async sendVersionUpdateMessage({ openid, templateId, character_string1, thing3, thing6 }) { const data = { character_string1: { value: character_string1 }, thing3: { value: thing3 } }; if (thing6) { data.thing6 = { value: thing6 }; } return this.sendSubscribeMessage({ touser: openid, templateId, page: 'pages/index/index', data }); } static async sendExpiryReminderMessage({ openid, templateId, thing1, thing2, phrase3 }) { const data = { thing1: { value: thing1 }, thing2: { value: thing2 }, phrase3: { value: phrase3 } }; return this.sendSubscribeMessage({ touser: openid, templateId, page: 'pages/profile/profile', data }); } } module.exports = WechatSubscribeService;