微信公众号鉴权流程
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

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