You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.7 KiB
91 lines
2.7 KiB
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
|