宝哥软件园

Node.js访问_token的获取、存储和更新的详细描述

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

一、前面写的字

在上一篇文章中,我们使用Node.js成功实现了访问微信公众平台的功能在本文中,我们将实现微信公众平台的一个非常重要的参数,access_token,它是微信官方账号的全局唯一接口调用凭证,微信官方账号在调用各个接口时需要使用access_token。

在我们开始之前,让我们抑制我们的兴奋,调整我们的呼吸,因为我们需要重新安排最后一篇文章的代码。一个好的项目结构可以帮助我们在未来方便地阐明业务逻辑和维护代码。好吗?

第二,组织项目结构

1.打开我们的项目,在项目中添加一个名为微信的文件夹,如图:所示

2.在微信文件夹中添加一个文件并命名为微信. js微信. js主要用于封装开发微信公众平台的所有方法。首先,我们构建这个模块的结构,代码如下:

使用strict//设置为strict模式//构建微信对象,即js中的函数是对象var微信=function(config){ //设置微信对象属性config this.config=config//设置微信对象属性token this . token=config . token;}//暴露外部模块可访问的界面,exports=微信;严格模式:ECMAScript 5中引入的概念。严格模式为Javascript定义了一个解析和执行模型。

模块导出:公开外部操作的接口。事实上,在我们定义模块之后,当我们使用node.js的require引用时,node.js会自动将以下代码添加到我们定义的模块的外层

/* * *导出模块的简短参考。exports * require用于介绍module *当前module的引用* __filename当前module的文件名* __dirname当前module的目录名*/(函数(exports,require,module,__filename,_ _ dirname){//自定义module的代码块})()相信以上代码对于经历过javascript开发的同学来说并不陌生。我们可以把它理解为闭包,这是匿名方法的调用,以避免污染全局变量。

一知半解:

在上面的代码中,除了我们使用的module.exports对象之外,还有另一个变量exports用来公开接口(官方文档调用module.exports一个对象,导出一个属性,这就是我这里所说的),那么module.exports和exports有什么区别呢?

module.exports对象是由模块系统创建的,exports变量在模块的文件级范围内有效,该范围在模块执行前被赋予module.exports的值。——来自Node.js的官方文档

也就是说,exports是module.exports的引用,module.exports是用于公开接口的真实对象。导出分配的所有属性和方法都分配给模块。

如果module.exportss和export为同一个属性赋值,则按照赋值的顺序进行最后一次赋值;如果我们给module.exports分配一个对象,它将覆盖导出的所有方法和属性。

因此,我们建议使用出口。如果只有一个属性或方法,则为attribute/method,如果导出多个属性或方法或使用对象构造方法,则为module.exports。

3.给微信对象添加一个方法授权,在app.js中粘贴验证方法

Use strict' //设置为严格模式const crypto=require(' crypto ');//引入加密模块//构建微信对象,即js中的函数是对象var微信=function(config){ //设置微信对象属性config this.config=config//设置微信对象属性token this . token=config . token;}/* * *微信访问认证*/微信. prototype.auth=function (req,RES) {//1。获取参数签名,时间戳,nonce,echostrvar签名=req.query .微信服务器的签名获取请求。//微信加密签名时间戳=req.query.timestamp,//时间戳nonce=req.query.nonce,//随机数echostr=req . query . echostr;//随机字符串//2。按照字典顺序对令牌、时间戳和随机数进行排序。vararray=[这个。令牌、时间戳、随机数];array . sort();//3.将三个参数字符串拼接成一个字符串进行sha1加密。var tempStr=array . join(');const HashCode=crypto . create hash(' sha1 ');//创建加密类型var结果代码=hashcode.update (tempstr,' utf8 ')。摘要(' hex ');//加密传入字符串//4。开发者得到的加密字符串可以和签名进行比对,表示请求来自微信if(结果码===签名){ RES . send(echostar);}else{ res.send('不匹配');} }//暴露接口模块. exports=微信;4.将app.js文件中的代码组织如下:

Const express=require ('express '),//express框架微信=require('。/微信/微信'),config=require '。/config ');//导入配置文件var app=express();//instance express框架var微信App=new微信(config);//实例微信模块//用于处理所有连接请求app.get ('/'),function (req,RES){微信app.auth (req,RES);});//在端口3000上侦听app . listen(3000);嗯!这段代码看起来舒服多了吗?机智,像我一样。

剩下的就是去微信公众平台进行访问验证了。上一篇文章中有详细的教程,所以我就不在这里演示了

只是太懒了

三.access _令牌获取、存储和更新

1.微信文档步骤

在开始代码之前,我们还是先整理一下实现的思路,开始编写实现代码。打开微信帮助文档,点击左侧菜单中的【开始开发】,点击其子菜单,获取access_token,如图:

通过上面对API的描述,我们总结了以下步骤:

1.实现https Get请求

2.获取access_token并将其存储,以便在当前access_token过期时进行更新

2.access_token获取、存储和更新代码实现

理清思路后,我们就按照上一节的步骤来。通过帮助文档,我们将请求微信API的请求地址和参数存储在config.json文件中。

appid和secret两个参数位于微信公众平台左侧菜单的基本配置中,如图所示:

开发者密码点击重置,扫描手机微信上的二维码即可获取。config.json的代码如下

{ 'token': '微信',' appID ' : ' wx154f * * * * * * * * 764da ',' appScrect ' : ' 59de 4266 * * * * * * * 8 DBE 9 de 4b 798 CD 372 ',' API domain ' : ' 3359 API . weixin . QQ.com/',' API URL ' : { ' accessTokenApi ' : ' % scgi-bin/token?grant _ type=client _ credential appid=%s secret=% s ' } }由于微信API请求的域名是公开的,我们建议使用它,并在请求的地址中使用% s(字符串)占位符。

微信所有请求的连接都是https协议。幸运的是,在Node.js的系统包中为我们提供了https包,由于下面的请求将多次使用https,我们将其封装为一个公共方法,以备将来使用。再次打开微信. js,在构造函数中引入https模块,在构造函数内部添加requestGet方法。

//用于处理获取https请求方法this.requestGet=函数(URL){ 0返回新的Promise(函数(解析,拒绝){ https.get(url,函数(res){ var buffer=[],result=//监听数据事件res.on('data ',function(data){ buffer。推送(数据);});//监听数据传输完成事件res.on('end ',function(){ result=buffer。concat(buffer,buffer.length).toString(' utf-8 ');//将最后结果返回决心(结果);});}).on('error ',function(err){ reject(err);});});}提示:

国家预防机制提供了很多用于请求的工具包,比如请求(安装命令国家预防机制安装请求)等。这里我只是用系统包去做请求处理。

由于https是异步请求的,我在这里面使用了ES6的承诺对象。

完成了requestGet方法后,我们的第一步骤也就完成了。下面开始第2步,获取访问令牌并存储如果当前访问令牌过期则更新。

在这之前我是想将访问令牌的存储位置依然放在config.json文件中,由于访问令牌在更新后需要将文件重写,可能容易造成config.json文件的格式的紊乱,因此在微信中重新创建一个accessToken.json文件用于存储访问令牌

{ 'access_token': ' ',' expires_time':0}其中访问令牌用于存储我们得到请求后访问令牌的值,过期时间用于存储访问令牌的过期时间,保存为时间戳。

在微信。射流研究…引入满量程模块用于操作文件、util工具模块用于处理占位符、accessToken.json文件

使用严格的"/"设置为严格模式const crypto=require('crypto '),//引入加密模块https=require('https '),//引入https模块util=require('util '),//引入跑龙套工具包accessTokenJson=require(' ./access _ token’);//引入本地存储的access_token//构建微信对象即射流研究…中函数就是对象定义变量微信=功能(配置){ //设置微信对象属性config this.config=config//设置微信对象属性记下这个。令牌=配置。令牌;//设置微信对象属性appID这个。appID=config。appID//设置微信对象属性应用屏蔽这个。appscreenct=config。appscreenct//设置微信对象属性API这个域。API域=配置。API域;//设置微信对象属性API URL这个。API域=配置。API URL//用于处理获取https请求方法this.requestGet=函数(URL){ 0返回新的Promise(函数(解析,拒绝){ https.get(url,函数(res){ var buffer=[],result=//监听数据事件res.on('data ',function(data){ buffer。推送(数据);});//监听数据传输完成事件res.on('end ',function(){ result=buffer。concat(buffer,buffer.length).toString(' utf-8 ');//将最后结果返回决心(结果);});}).on('error ',function(err){ reject(err);});});}}在微信。射流研究…添加获取访问令牌的方法getAccessToken

/** * 获取微信access _ token */微信。原型。getaccesstoken=function(){ var=this;返回新的承诺(函数(解析,拒绝){ //获取当前时间var currentTime=新日期()。getTime();//格式化请求地址var URL=util。格式(即。阿皮尔。accesstokenapi。apid域,那个. appID,那个。appscrect);//判断本地存储的访问令牌是否有效if(accesstokenjson。access _ token==' ' | | access token JSON。expires _ time当前时间){即。请求获取(网址).然后(函数(数据){ var result=JSON.parse(数据);if(数据。indexof(' errcode ')0){访问令牌JSON。access _ token=结果。access _ tokenaccessTokenJson.expires_time=新日期()。getTime()(parsent(结果。expires _ in)-200)* 1000;//更新本地存储的fs.writeFile(' ./微信/access_token.json ',json。stringify(AccessTokenjson));//将获取后的访问令牌返回解析(访问令牌JSON。access _ token);}else{ //将错误返回决心(结果);} });}else{ //将本地存储的访问令牌返回解析(访问令牌JSON。access _ token);} });}在app.js中添加新的监听链接用于测试我们获取的代币

//用于请求获取access _ token应用程序。get('/getAccessToken ',函数(请求,资源)微信公众号。GetAccessToken().然后(函数(数据){ res.send(数据);});});

这样我们就大功告成了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+