美文网首页
node 获取微信 wx-js-sdk所需要的acctoken和

node 获取微信 wx-js-sdk所需要的acctoken和

作者: 郭海杰 | 来源:发表于2020-01-06 09:38 被阅读0次
//引入 koa模块 //实例化
var Koa = require('koa');
var app = new Koa();
var router = require('koa-router')();  /*引入是实例化路由** 推荐*/
var axios = require("axios")
var sha1 = require('node-sha1');
var fs = require('fs');

// 设置跨域,和默认设置
app.use(async (ctx, next) => {
   ctx.set('Access-Control-Allow-Origin', '*');
   ctx.set("Content-Type", "application/json")
   await next();
});

const appId = 'wx31bea5f7647b6597'
const secret = 'cfa26d3e3681d11aaa630c14fb4cda21'
const AccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+secret
const jsapiUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token="

//随机字符串
function randomString(len) {
   len = len || 32; var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
   var maxPos = $chars.length;
   var pwd = '';
   for (i = 0; i < len; i++) {
       pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
   }
   return pwd;
}

router.get('/wx', async (ctx) => {

   // 先判断存的签名是否到期
   let data = await new Promise(function (resolve, reject) {
       fs.readFile('./hello.json', function (error, data) {
           if (error) {
               console.log('读取文件失败,当前未保存凭证')
               resolve(0)
           } else {
               let obj = JSON.parse(data.toString())
               let second = parseInt((Date.now() - obj.timestamp) / 1000);
               if (second < 7200) {
                   console.log("读取成功,凭证在有效期内")
                   resolve(obj)
               } else {
                   console.log("读取成功,凭证已经过期了")
                   resolve(0)
               }
           }
       })
   })

   if (data != 0) {
       ctx.body = data
   } else {
       let AccessToken = ''
       let jsapi_ticket = ''
       let signature = ''
       // 生成20位随机字符串
       let noncestr = randomString(17)
       // 获取当前时间戳
       let timestamp = Date.now();
       // 获取到前端当前的url
       let url = ctx.request.header.referer

       // 获取到acctoken
       await axios.get(AccessTokenUrl)
           .then(function (response) {
               AccessToken = response.data
           })
           .catch(function (error) {
               console.log(error);
           })
       //通过access_token 获取到ticket
       await axios.get(jsapiUrl + AccessToken.access_token)
           .then(function (response) {
               jsapi_ticket = response.data.ticket
           })
           .catch(function (error) {
               console.log(error);
           })
           // 拼接signature
       let string1 = 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + noncestr + '&timestamp=' + timestamp + '&url=' + url
       signature = await sha1(string1)
       data = {
           nonceStr: noncestr,
           timestamp: timestamp,
           signature: signature,
           appId: 'wx31bea5f7647b6597',
       }
       ctx.body = data
       //最后存入hello.json
       data = JSON.stringify(data)
       fs.writeFile('./hello.json', data, function (error) {
           if (error) {
               console.log('写入失败')
           } else {
               console.log('写入成功')
           }

       })
   }
})

app.use(router.routes());  /*启动路由*/
// app.use(router.allowedMethods());

/*
* router.allowedMethods()作用: 这是官方文档的推荐用法,我们可以
* 看到 router.allowedMethods()用在了路由匹配 router.routes()之后,所以在当所有
* 路由中间件最后调用.此时根据 ctx.status 设置 response 响应头 
*
*/
app.listen(3000, () => {
   console.log('start in  port -> 3000')
});

微信公众号开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

微信测试公众号申请:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

相关文章

网友评论

      本文标题:node 获取微信 wx-js-sdk所需要的acctoken和

      本文链接:https://www.haomeiwen.com/subject/hiphactx.html