在开始码代码之前,我们依然是先理清实现的思路,在开始编写实现代码。打开 微信帮助文档 ,点击左侧菜单中的开始开发,点击其子菜单获取access_token,如图:
通过上面的 API 的描述,我们总结出以下步骤:
1.实现 https Get 请求
2.获取 access_token 并存储 如果 当前 access_token 过期则更新
2.access_token的获取、存储及更新 代码实现
整理好思路后我们就按照上一节的步骤去实现。通过帮助文档我们将用于请求微信API 的请求地址与参数,存放到 config.json 文件。
其中 appid 与 secret 两个参数 位于 微信公众平台 左侧菜单的基本配置中,如图:
开发者密码 点击重置,用手机微信扫面二维码后便可得到。config.json 代码如下
{ "token":"wechat", "appID":"wx154f********764da", "appScrect":"59de4266*******8dbe9de4b798cd372", "apiDomain":"https://api.weixin.qq.com/", "apiURL":{ "accessTokenApi":"%scgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" } }
由于微信 API 请求连接的域名是公用的,我们将它提出来,在请求地址中使用 %s(字符串) 占位符占位。
微信所有请求连接都是 https 协议,很幸运的是 Node.js 系统包中为我们提供了 https 的包,由于后面的请求会多次用到 https ,因此我们将它封装为一个公用的方法,以便以后的使用,再次打开 wechat.js 在构造方法中,引入 https 模块,并在构造函数内部添加 requestGet 方法
//用于处理 https Get请求方法 this.requestGet = function(url){ return new Promise(function(resolve,reject){ https.get(url,function(res){ var buffer = [],result = ""; //监听 data 事件 res.on('data',function(data){ buffer.push(data); }); //监听 数据传输完成事件 res.on('end',function(){ result = Buffer.concat(buffer,buffer.length).toString('utf-8'); //将最后结果返回 resolve(result); }); }).on('error',function(err){ reject(err); }); }); }
提示:
npm 提供了很多用于请求的工具包,比如 request ( 安装命令 npm install request ) 等。这里我只是用系统包去做请求处理。
由于 https 是异步请求的,我在这里面使用了 ES6 的 Promise 对象 。
完成了 requestGet方法后,我们的第1步骤也就完成了。下面开始第2步,获取 access_token 并存储 如果 当前 access_token 过期则更新。
在这之前我是想将 access_token 的存储位置依然放在 config.json 文件中,由于 access_token 在更新后 需要将文件重写,可能容易造成 config.json 文件的格式的紊乱,因此在 wechat 中重新创建一个 accessToken.json 文件用于存储 access_token
{ "access_token":"", "expires_time":0 }
其中 access_token 用于存储 我们 GET 请求后access_token 的值,expires_time 用于存储 access_token 的过期时间,保存为时间戳。
在 wechat.js 引入 fs 模块用于操作文件、util 工具模块用于处理占位符、 accessToken.json 文件
'use strict' //设置为严格模式 const crypto = require('crypto'), //引入加密模块 https = require('https'), //引入 htts 模块 util = require('util'), //引入 util 工具包 accessTokenJson = require('./access_token'); //引入本地存储的 access_token //构建 WeChat 对象 即 js中 函数就是对象 var WeChat = function(config){ //设置 WeChat 对象属性 config this.config = config; //设置 WeChat 对象属性 token this.token = config.token; //设置 WeChat 对象属性 appID this.appID = config.appID; //设置 WeChat 对象属性 appScrect this.appScrect = config.appScrect; //设置 WeChat 对象属性 apiDomain this.apiDomain = config.apiDomain; //设置 WeChat 对象属性 apiURL this.apiDomain = config.apiURL; //用于处理 https Get请求方法 this.requestGet = function(url){ return new Promise(function(resolve,reject){ https.get(url,function(res){ var buffer = [],result = ""; //监听 data 事件 res.on('data',function(data){ buffer.push(data); }); //监听 数据传输完成事件 res.on('end',function(){ result = Buffer.concat(buffer,buffer.length).toString('utf-8'); //将最后结果返回 resolve(result); }); }).on('error',function(err){ reject(err); }); }); } }
在 wechat.js 添加获取 access_token 的方法 getAccessToken