zoukankan      html  css  js  c++  java
  • node获取存储token和ticket / 生成签名

    1. 根目录下创建config文件夹,结构如下
    │─ config
    │   │─ config.js
    │   │─ fsObj.js
    │   │─ setSdk.js
    │   └─ json
    │     │─ access_token.json
    └─    └─ jsapi_ticket.json
     
    2. config.js 中的配置信息
     
    module.exports = {
      appId: '', // 你公众号的id
      appSecret: '', // 你公众号的appSecret
    }
    

      

    3. fsObj.js 中的代码 
    const fs = require('fs')
    const https = require('https') // 发起请求获取token和ticket
    const config = require('./config')
    
    // 根据参数写入token或者ticket,并返回写入结果
    const write = (file, ca) => {
      // 获取token并写入
      switch (file) {
        case 'token':
          httpsGet('access_token', `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.appId}&secret=${config.appSecret}`, ca)
          break;
        case 'ticket':
          read('token', res => {
            httpsGet('jsapi_ticket', `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${res.access_token.access_token}&type=jsapi`, ca)
          })
          break;
      }
    }
    
    const httpsGet = (filesName, getUrl, ca) => {
      // 请求token和ticket
      https.get(
        getUrl,
        function (data) {
    
          var str = "";
          data.on("data", function (chunk) {
            str += chunk; //监听数据响应,拼接数据片段
          })
          data.on("end", function () {
    
            let times = Date.parse(new Date())
            let result = `{"${filesName}":${str.toString()},"times":${times + 7200 * 1000}}`
    
    
            // 判断 jsapi_ticket 是否获取成功, 成功后写入,不成功侧打印 jsapi_ticket 获取失败
            if (filesName === 'jsapi_ticket') {
              let resultObj = JSON.parse(result)
              if (resultObj.jsapi_ticket.errmsg !== 'ok') {
                // 没有获取成功
                console.log(`jsapi_ticket 获取失败,写入失败, 原因:token错误,或其他错误`)
    
                return
              }
            }
    
            // console.log(result)
            const writeStream = fs.createWriteStream(`./config/json/${filesName}.json`);
            //写入数据,指定数据的编码格式
            writeStream.write(result, 'utf8');
            //标记写入完成(写入完成后会广播一个finish事件)
            writeStream.end();
    
            //接收finish事件
            writeStream.on('finish', () => {
              console.log('写入完成');
              ca(JSON.parse(result)) // 写入完成后返回结构
            });
            //写入失败
            writeStream.on('error', () => {
              console.log('写入失败');
            })
          })
        })
    }
    
    const read = (file, ca) => {
    
      let files = ['access_token', 'jsapi_ticket']
      let filesName = files[0]
      switch (file) {
        case 'token':
          filesName = files[0]
          break;
        case 'ticket':
          filesName = files[1]
          break;
      }
    
      // 查询数据
      let readStream = fs.createReadStream(`./config/json/${filesName}.json`);
    
      let str = ''
      //接收读取到的数据
      readStream.on('data', (chunk) => {
        str += chunk;
      });
    
      //读取完成后触发
      readStream.on('end', (chunk) => {
        ca(JSON.parse(str)) // 查询完成后返回查询结果
      });
      //读取失败
      readStream.on('error', (error) => {
        console.log(error);
      });
    }
    
    // 过期自动写入
    const checkToken = checkCa => {
      read('token', res => {
    
        let times = Date.parse(new Date())
    
        if (times < res.times) {
          console.log("没过期")
          checkCa()
        }
        if (times > res.times) {
          console.log("过期了")
          // 过期了
          // 写入token
          write('token', token_res => {
            console.log(`写入token成功 ---${token_res}`);
    
            // 写入token完成后写入ticket
            write('ticket', res => {
              console.log(`写入ticket成功 --- ${res}`)
              checkCa()
            })
          })
        }
      })
    }
    
    
    module.exports = {
      read, // 读取数据
      checkToken // 检查数据是否过期,如果过期侧获取新数据并写入
    }
     
    4. setSdk.js 代码如下:
    const config = require('./config')
    const {
      read,
      checkToken
    } = require('./fsObj')
    const sha1 = require('sha1')
    
    
    // 生成字符串
    const getStr = () => {
      return Math.random().toString(36).substr(2, 15)
    }
    
    // 时间戳
    const getTimestamp = () => {
      return parseInt(new Date().getTime() / 1000) + ''
    }
    
    // 排序
    const raw = args => {
      var keys = Object.keys(args)
      keys = keys.sort()
      var newArgs = {}
      keys.forEach(function (key) {
        newArgs[key.toLowerCase()] = args[key]
      })
    
      var string = ''
      for (var k in newArgs) {
        string += '&' + k + '=' + newArgs[k]
      }
      string = string.substr(1)
      return string
    }
    
    // 返回数据,只需要传入一个前端提交过来的网页url即可获得处理好的新数据
    module.exports = url => {
      return new Promise((resolve, reject) => {
        // 先检查数据是否过期,
        checkToken(() => {
          //检查完成后再去获取数据,并返回给前端
          read('ticket', res => {
            // 获取到的数据以key  value的形式放入对象中
            let ret = {
              jsapi_ticket: res.jsapi_ticket.ticket,
              nonceStr: getStr(),
              timestamp: getTimestamp(),
              url
            }
            // 排序
            let string1 = raw(ret)
            // 加密
            let sha1Str = sha1(string1)
            // 返回处理好的数据
            resolve({
              appId: config.appId,
              timestamp: ret.timestamp,
              nonceStr: ret.nonceStr,
              signature: sha1Str
            })
          })
        })
      })
    }
    5. 太长了请移步下一篇文章:node生成签名使用
     
  • 相关阅读:
    Linux下NDK编译FFMPEG包含neon参数
    编译器优化陷阱——全局指针多次使用异常
    Linux下使用NDK编译FFMPEG(libstagefright)
    查看Android支持的硬解码信息
    图片格式转换
    转 MFC 主界面函数中线程等待避免界面卡死的处理方法
    Windows Shell编程实现重叠图标IconOverlay
    转 MFC中 GB2312、UTF-8、unicode 之间转换
    windows双机调试
    位图BITMAP结构
  • 原文地址:https://www.cnblogs.com/chefweb/p/10751573.html
Copyright © 2011-2022 走看看