...
|
...
|
@@ -27,80 +27,80 @@ const ticketCacheKey = 'wechatShare:ticket'; |
|
|
|
|
|
// 微信 JS 接口签名校验工具 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
|
|
|
|
|
|
const wechat = {
|
|
|
getAccessToken: Promise.coroutine(function* () {
|
|
|
let accessToken = yield cache.get(accessTokenCacheKey);
|
|
|
|
|
|
if (accessToken) {
|
|
|
return accessToken;
|
|
|
}
|
|
|
|
|
|
logger.info('调用微信 API 获取 accessToken');
|
|
|
return request({
|
|
|
url: 'https://api.weixin.qq.com/cgi-bin/token',
|
|
|
qs: {
|
|
|
grant_type: 'client_credential',
|
|
|
appid: appId,
|
|
|
secret: secret
|
|
|
},
|
|
|
json: true
|
|
|
}).then((res) => {
|
|
|
|
|
|
// accessToken 有效期 7200s,缓存 7100s
|
|
|
cache.set(accessTokenCacheKey, res.access_token, 7100).catch((err) => {
|
|
|
logger.error('微信分享 Token, 缓存 accessToken 时出错', JSON.stringify(err));
|
|
|
});
|
|
|
return res.access_token;
|
|
|
}).catch((err) => {
|
|
|
logger.error('微信分享 Token, 获取 accessToken 时出错', JSON.stringify(err));
|
|
|
let _getAccessToken = Promise.coroutine(function* () {
|
|
|
let accessToken = yield cache.get(accessTokenCacheKey);
|
|
|
|
|
|
if (accessToken) {
|
|
|
return accessToken;
|
|
|
}
|
|
|
|
|
|
logger.info('get accessToken from wechat API');
|
|
|
return request({
|
|
|
url: 'https://api.weixin.qq.com/cgi-bin/token',
|
|
|
qs: {
|
|
|
grant_type: 'client_credential',
|
|
|
appid: appId,
|
|
|
secret: secret
|
|
|
},
|
|
|
json: true
|
|
|
}).then((res) => {
|
|
|
|
|
|
// accessToken 有效期 7200s,缓存 7100s
|
|
|
cache.set(accessTokenCacheKey, res.access_token, 7100).catch((err) => {
|
|
|
logger.error('set wechat accessToken cache error', JSON.stringify(err));
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
getTicket: Promise.coroutine(function* () {
|
|
|
let ticket = yield cache.get(ticketCacheKey);
|
|
|
|
|
|
if (ticket) {
|
|
|
return ticket;
|
|
|
}
|
|
|
|
|
|
logger.info('调用微信 API 获取 ticket');
|
|
|
return request({
|
|
|
url: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
|
|
|
qs: {
|
|
|
access_token: yield this.getAccessToken(),
|
|
|
type: 'jsapi'
|
|
|
},
|
|
|
json: true
|
|
|
}).then(res => {
|
|
|
return res.access_token;
|
|
|
}).catch((err) => {
|
|
|
logger.error('get accessToken from wechat API error', JSON.stringify(err));
|
|
|
});
|
|
|
});
|
|
|
|
|
|
let _getTicket = Promise.coroutine(function* () {
|
|
|
let ticket = yield cache.get(ticketCacheKey);
|
|
|
|
|
|
if (ticket) {
|
|
|
return ticket;
|
|
|
}
|
|
|
|
|
|
logger.info('get ticket from wechat API');
|
|
|
return request({
|
|
|
url: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
|
|
|
qs: {
|
|
|
access_token: yield _getAccessToken(),
|
|
|
type: 'jsapi'
|
|
|
},
|
|
|
json: true
|
|
|
}).then(res => {
|
|
|
|
|
|
// ticket 有效期 7200s,缓存 7100s
|
|
|
cache.set(ticketCacheKey, res.ticket, 7100).catch((err) => {
|
|
|
logger.error('微信分享 Token, 缓存 ticket 时出错', JSON.stringify(err));
|
|
|
});
|
|
|
return res.ticket;
|
|
|
}).catch((err) => {
|
|
|
logger.error('微信分享 Token, 获取 ticket 时出错', JSON.stringify(err));
|
|
|
cache.set(ticketCacheKey, res.ticket, 7100).catch((err) => {
|
|
|
logger.error('set wechat Token cache error', JSON.stringify(err));
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
calcSignature: Promise.coroutine(function* (data) {
|
|
|
data = Object.assign({
|
|
|
nonceStr: Math.random().toString(36).substr(2, 15),
|
|
|
timestamp: Math.floor(Date.now() / 1000) + '',
|
|
|
ticket: yield this.getTicket(),
|
|
|
appId: appId
|
|
|
}, data);
|
|
|
|
|
|
const str = `jsapi_ticket=${data.ticket}&noncestr=${data.nonceStr}×tamp=${data.timestamp}&url=${data.url}`;
|
|
|
|
|
|
data.signature = sha1(str);
|
|
|
return data;
|
|
|
})
|
|
|
};
|
|
|
return res.ticket;
|
|
|
}).catch((err) => {
|
|
|
logger.error('get ticket from wechat API error', JSON.stringify(err));
|
|
|
});
|
|
|
});
|
|
|
|
|
|
let calcSignature = Promise.coroutine(function* (data) {
|
|
|
data = Object.assign({
|
|
|
nonceStr: Math.random().toString(36).substr(2, 15),
|
|
|
timestamp: Math.floor(Date.now() / 1000) + '',
|
|
|
ticket: yield _getTicket(),
|
|
|
appId: appId
|
|
|
}, data);
|
|
|
|
|
|
const str = `jsapi_ticket=${data.ticket}&noncestr=${data.nonceStr}×tamp=${data.timestamp}&url=${data.url}`;
|
|
|
|
|
|
data.signature = sha1(str);
|
|
|
return data;
|
|
|
});
|
|
|
|
|
|
// 测试
|
|
|
// wechat.calcSignature({
|
|
|
// calcSignature({
|
|
|
// url: 'http://www.yohobuy.com/'
|
|
|
// }).then(console.log);
|
|
|
|
|
|
module.exports = wechat; |
|
|
module.exports = {
|
|
|
calcSignature
|
|
|
}; |
...
|
...
|
|