微信公众号sign签名部署代码,apijs-ticket、access-token设置

微信公众号sign签名部署代码,apijs-ticket、access-token,话不多说,上代码

var { appid, secret } = require('../config')
var axios = require('axios')
var sha1 = require('sah1')
var ticketModel = require('../db/models/ticketModel')

// https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

async function getTicket() {  //获取ticket方法函数
    let tik_data = await ticketModel.find();
    let access_token = '';
    let ticket = '';

    if (tik_data.length > 0) {    //判断数据库是否存储过token_time
        let t = new Data().getTime() - tik_data[0].token_time;
        if (t > 7000000) {  //是否过期
            //重新获取
            await loadData()
            console.log('过期后重新获取token', access_token);
            console.log('过期后重新获取 ticket', ticket);
            let { _id } = tik_data[0]
            let time = new Data().getTime()
            await ticketModel.update({ _id }, {   //更新已经过期的
                access_token,
                token_time: time,
                ticket,
                ticket_time: time
            })
        } else {
            access_token = tik_data[0].access_token;
            ticket = tik_data[0].ticket;
            console.log('从自己的数据库拿了token', access_token);
            console.log('从自己的数据库拿了ticket', ticket);
        }

    } else {
        //重新获取
        await loadData()
        let time = new Data().getTime()
        await new ticketModel({    //如果是第一次获取access_token 则对数据库进行新增操作
            access_token,
            token_time: time,
            ticket,
            ticket_time: time
        }).save()

    }
    async function loadData() {
        let tokenUrl = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`
        let token_data = await axios.get(tokenUrl)
        console.log('token', token_data)
        access_token = token_data.data.access_token    //得到access_token
        let ticketUrl = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&type=jsapi`
        let ticket_data = await axios.get(ticketUrl)    //得到jsapi_ticket
        console.log('ticket', ticket_data)
        ticket = ticket_data.data.ticket
        
    }
    return {
        access_token,
        ticket
    }

}


var createNonceStr = function () {   //生成随机字符串
    return Math.random().toString(36).substring(2, 15)
}

var createTimestamp = function () {
    return parseInt(new Date().getTime() / 1000) + '';
}

var row = function (obj) {    //处理数据格式的方法
    var keys = Object.keys(obj)
    keys = keys.sort()  //字典排序
    var newObj = {}
    keys.forEach((key => {
        newObj[key.toLowerCase()] = obj[key]
    }))
    var string = ''
    for (var k in newObj) {
        string += '&' + k + '=' + newObj[k]
    }
    string = string.substr(1)
    return string
}

var sign = async function (url) {  //生成signature签名等的方法
    let {ticket} = await getTicket()
    var obj = {
        jsapi_ticket: ticket,
        nonceStr: createNonceStr(),
        timestamp: createTimestamp(),
        url
    }
    var str = row(obj)
    var signature = sha1(str) //生成签名
    obj.signature = signature
    obj.appId = appid

    // 签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 
    // 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。
    // 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即key1=value1&key2=value2…)
    // 拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,
    // 不进行URL 转义。
    return obj
}


module.exports = {
    sign,
    getTicket
}

猜你喜欢

转载自blog.csdn.net/qq_63438888/article/details/126587878