Nodejs开发微信公众号--获取access_token
为了梳理代码,我单独给微信的接口进行了一些封装。这是前面认证接口的内容。
封装接口用到了request
npm install --save request
封装的 js 结构大致是这样的
var request = require('request');
var crypto = require('crypto');function WeChat(config) {this.config = configthis.accessToken = nullthis.getAccessTokenTimer = null
}WeChat.prototype.Authenticate = function(req, res) {//1.获取微信服务器Get请求的参数 signature、timestamp、nonce、echostrvar signature = req.query.signature,//微信加密签名timestamp = req.query.timestamp,//时间戳nonce = req.query.nonce,//随机数echostr = req.query.echostr;//随机字符串//2.将token、timestamp、nonce三个参数进行字典序排序var array = [this.config.token,timestamp,nonce];array.sort();//3.将三个参数字符串拼接成一个字符串进行sha1加密var tempStr = array.join('');const hashCode = crypto.createHash('sha1'); //创建加密类型 var resultCode = hashCode.update(tempStr,'utf8').digest('hex'); //对传入的字符串进行加密//4.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if(resultCode === signature){res.send(echostr);}else{res.send('mismatch');}
}module.exports.WeChat = WeChat;
扯多了,回到正题access_token
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
因此,我继续封装了GetAccessToken方法。
WeChat.prototype.GetAccessToken = function() {var self = thislet option = {url: 'https://api.weixin.qq.com/cgi-bin/token',qs: {grant_type: 'client_credential',appid: this.config.App_Id,secret: this.config.App_Secret},method: 'GET',headers: {"content-type": "application/json"}}return new Promise((resolve, reject) => {request(option, function(error, response, body) {console.log(error, body)var data = JSON.parse(body)if (error) {reject(error)} else {switch(data.errcode) {case 45009:console.log('token调用上限')reject(data)breakcase 0:self.accessToken = {access_token: data.access_token,expires_in: data.expires_in}console.log('当前access_token', JSON.stringify(self.accessToken))// 定时重新获取access_tokenclearTimeout(this.getAccessTokenTimer)this.getAccessTokenTimer = setTimeout(() => {self.GetAccessToken()}, (data.expires_in - 60) * 1000 || 60000)resolve(data)break}}})})
}
并在express服务启动的时候调用GetAccessToken,调用成功后会依据 expires_in 起定时器重新获取。
var wechat = new WeChat(config)
wechat.GetAccessToken().then(success => {console.log('初始化获取accessToken成功')
}, failure => {console.log('初始化获取accessToken失败')
})
2018.10.17
考虑到每次重启服务器都会调用GetAccessToken,会导致频繁调用。因此想到一个修改方法,将accessToken作为属性存在wechat对象中的同时,还将其写入到本地文件token.json中。这样服务器重启时,就可以先读取token.json文件中的access_token及expires_in,先判断是否过期,如果过期了,则直接进行access_token更新操作,否则计算出过期时间,用定时器控制在过期时间时进行access_token更新操作。
Nodejs开发微信公众号--获取access_token相关推荐
- NodeJs开发微信公众号(一)
古话说: 万事开头难, 回头细想想还真是这样,在没有开始做微信公众号开发之前我以为它很复杂,但是学过之后只想说原来just so so~ 这里是我的项目的github地址: https://githu ...
- Nodejs开发微信公众号中控服务
本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 本项目旨在为多个微信公众号 ...
- nodeJS 开发微信公众号
准备测试公众号 mp.weixin.qq.com/debug/cgi-b- 关注,获取测试公众号 内网渗透工具 natapp.cn/login 按照教程下载客户端进行配置 后台服务接入公众号 有net ...
- 关于开发微信公众号获取手机用户运动数据的功能实现思路
一.前沿研究 微信公众号开发文档,浏览后没有任何关于获取微信运动数据的接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp144 ...
- 微信公众号获取access_token,报错invalid ip xxx.xxx.xxx.xxx
一.原因: 在IP白名单内的IP来源,获取access_token接口才可调用成功.未设置,就会报错. 二.解决方案: 登录公众平台,开发->基本配置->IP白名单->查看-> ...
- Thinkphp5下微信公众号获取用户信息
前言 一直在用整理下tp5 开发微信公众号获取用户信息的简单笔记 废话不多说 直接贴代码如下: 正文 准备工作 在微信公众平台的开发者工具中申请公众平台测试账号如下图 在网页账号中 修改网页授权获取基 ...
- java根据手机号获取微信信息_Java实现的微信公众号获取微信用户信息示例
本文实例讲述了Java实现的微信公众号获取微信用户信息.分享给大家供大家参考,具体如下: 注: 这里获取用户信息方式和网页授权获取用户信息方式不同.两个access_token不同,返回的结果也不同. ...
- 教程: nodejs 做微信公众号开发,回复 xml 消息
教程: nodejs 做微信公众号开发,回复 xml 消息 首先需要你的后台跟服务器已经可以建立连接,这个不再冗述看官方教程就好 接入指南 .此篇介绍的是如何获取用户发来的信息,并回复它. 一.接收 ...
- nodejs关联微信公众号开发
微信公众号开发 需求:在web端用户实时操作的内容,在微信公众号获取到 实现:项目与微信公众号的连接,在微信公众号上回复,发送对应的文本,图片,视频内容 一.微信公众号的接入(三个部分) 1.node ...
最新文章
- UIBezierPath和CAShapeLayer创建不规则View(Swift 3.0)
- R语言dplyr包使用group_by函数、arrange函数和filter函数获取每个分组的第一个、第N个、最后一个记录实战
- 没有终结点在侦听可以接受消息的_IoT Hub入门(3)使用消息路由将原始设备数据记录存档...
- ASP.NET服务器控件数据绑定总结
- ssm 转发请求_SSM框架碰到的问题
- Linux表空间扩容,linux下oracle表空间导致磁盘空间不足
- idea启动tomcat没有加载项目_震惊!我三步就搞定了 Tomcat 源码环境搭建!
- Shell脚本实现SSH免密登录及批量配置管理
- [原]gimp的python控制台以及python的PIL图像处理库
- c语言双精度型输出小数位数_C语言的double与float类型最多只能默认输出小数位数都取6位?...
- nginx简单的rewrite配置
- 支付设计白皮书:支付系统的概念与中国互联网支付清算体系
- 什么时候需要用到RCC_APB2Periph_AFIO–复用IO时钟的使用
- 今天我们来聊一个很高级的话题:如何设计一个大规模远程命令执行系统
- python中平方_python里平方
- eCharts好看的 响应式 圆环饼图 及文字 附vue源码代码
- (一)大数据学习引言——大数据概述
- 孙正兴:普适计算与计算机视觉
- 【古琴】初学者选择练习琴的六条准则
- xmind 8 安装后启动失败