var { appid , secret } = require('../config/index'); var axios = require('axios'); var sha1 = require('sha1'); /// 请求获取 微信 access-token 接口地址 /// https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET /** * 获取 ticket */ var getTicket = async function () { // console.log('>>>appid', appid) // console.log('>>>secret', secret) let token_url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}` let token_data = await axios.get(token_url) // console.log('>>>token_data', token_data.data) let access_token = token_data.data.access_token || '' // 得到 access_token let ticket_url = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&type=jsapi` // console.log('>>>ticket_url', ticket_url) let ticket_data = await axios.get(ticket_url) //得到 jsapi_ticket // console.log('>>>ticket_data', ticket_data.data) return ticket_data.data.errcode === 0 ? ticket_data.data.ticket : '' } /** * 生成随机字符串 */ var createNonceStr = function () { return Math.random().toString(36).substring(2, 15) } /** * 生成时间戳 */ var createTimestamp = function () { return parseInt(new Date().getTime() / 1000) + '' } /** * 生成 sign 签名方法 * @param {*} url */ var sign = async function (url) { let jsapi_ticket = await getTicket() /// 均为小写字符 var defOption = { jsapi_ticket: jsapi_ticket, noncestr: createNonceStr(), timestamp: createTimestamp(), url } var keys = Object.keys(defOption) keys.sort() // 字段排序 var options = {} /// 生成签名时键名小写 var string = [] for (let key in keys) { options[keys[key]] = defOption[keys[key]] string.push([keys[key].toLowerCase(), defOption[keys[key]]].join('=')) } string = string.join('&') var signature = sha1(string) // 生成签名 options.signature = signature options.appid = appid return options // 签名生成规则如下: // 1. 参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。 // 2. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后 // 3. 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。 // 4. 对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。 } module.exports = sign