Files
miniapp-api/src/services/wechatSubscribeService.js
T

102 lines
2.8 KiB
JavaScript

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;