const request = require('request') const sha1 = require('sha1') // 创建唯一的不重复的随机字符串 function grentNonceStr() { return Math.random().toString(36).substr(2, 15) } // 获取单签时间戳,精确到秒 function grentTimeStamp() { return parseInt(Date.now() / 1000) + '' } // 创建缓存器 function createCache() { let cache = {} let cacheTime = 7000 * 1000 return { get(key) { return cache[key] }, set(key, val) { cache[key] = val setTimeout(() => delete cache[key], cacheTime) } } } // 获取access_token 需要参数 appid secret const getAccessToken = (() => { let store = createCache() function getToken(appid, secret) { let uri = 'https://api.weixin.qq.com/cgi-bin/token?' + 'grant_type=client_credential&appid=' + appid + '&secret=' + secret; return new Promise((resolve, reject) => { request(uri, function (error, response, body) { if (error) { reject(error) } else if (response.statusCode === 200) { body = JSON.parse(body); resolve(body.access_token) } else { reject(error) } }) }) } return async (appid, secret) => { if (!store.get(appid)) { let token = await getToken(appid, secret) store.set(appid, token) } return store.get(appid) } })(); // 获取ticket 需要参数access_token const getTicket = (() => { let store = createCache() function getTicket(accessToken) { let uri = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?' + 'access_token=' + accessToken + '&type=jsapi'; return new Promise((resolve, reject) => { request(uri, function (error, response, body) { if (error) { reject(error) } else if (response.statusCode === 200) { let content = JSON.parse(body); resolve(content.ticket) } else { reject(error) } }) }) } return async (accessToken) => { if (!store.get(accessToken)) { let ticket = await getTicket(accessToken) store.set(accessToken, ticket) } return store.get(accessToken) } })(); // 获取计算签名 function getSignature(ticket, noncestr, timestamp, url) { console.log(`jsapi_ticket=${ticket}&noncestr=${noncestr}×tamp=${timestamp}&url=${url}`) return sha1(`jsapi_ticket=${ticket}&noncestr=${noncestr}×tamp=${timestamp}&url=${url}`) } module.exports = { getAccessToken, getTicket, getSignature, grentNonceStr, grentTimeStamp }