102 lines
2.8 KiB
JavaScript
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;
|