【Node.js+Express微信公众号开发】第二步:编写获取access_token接口

linvic

一、构建一个接口

从上一篇文章中,仔细观察一下目录结构,不难发现,routes路由这块,就是我们放node服务定义放置路由的目录,原本生成了一个users文件,暂时用处不大,我们便可以直接更改这个路由。如图,分别更改一个getAccessToken.js。

clipboard.png

然后我们到app.js中,把入口配置更改一下。
clipboard.png

完毕,把文件更新到服务器,$ nodemon npm start启动服务

然后到服务器输入:你的ip/getAccessToken,验证一下,如果是下图所示,那么恭喜你,第一步成功了!

clipboard.png

二、改写getAccessToken接口

好的,上一步我们已经完成了接口,接下来就完善这个接口吧。
首先,建议先读一下微信的文档。了解一下access_token。

1. 创建json文件,存放access_token

clipboard.png

2. 在js中引入json,并在接口输出测试

clipboard.png

clipboard.png

3. 在data目录创建config.json存放微信基本配置信息。

以上验证后,继续创建一个config.json文件,用于存放基本配置信息,内容如下:

{
    "token":"WeiChartToken",
    "appID":"wx00********396", // appid 微信公众平台查看
    "appScrect":"326466*********e18f", // appScrect 微信公众平台查看
    "apiDomain":"https://api.weixin.qq.com/",
    "apiURL":{
        "accessTokenApi":"%scgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
    }
}

4. getAccessToken.js文件内容

var express = require('express');
var https = require('https'); // 引入https模块
var util = require('util'); // 引入util工具包格式化路径
var fs = require('fs'); // 引入fs更新本地文件
var router = express.Router();
var accessTokenJson = require('../data/access_token');
var configJson = require('../data/config');

/* GET users listing. */
router.get('/', function(req, res, next) {

    new Promise(function(resolve,reject) {
        //获取当前时间 
        var currentTime = new Date().getTime();
        //格式化请求地址
        var url = util.format(configJson.apiURL.accessTokenApi,configJson.apiDomain,configJson.appID,configJson.appScrect);
        
        //判断 本地存储的 access_token 是否有效
        if (accessTokenJson.access_token === "" || accessTokenJson.expires_time < currentTime) {

            https.get(url, function(res){
                var buffer = [],result = "";
                // 监听 data 事件
                res.on("data",function(data){
                    buffer.push(data);
                });
                res.on("end",function() {
                    // result = JSON.stringify(Buffer.concat(buffer,buffer.length).toString('utf-8'));
                    
                    var body = Buffer.concat(buffer);
                    result = JSON.parse(body);

                    if (body.indexOf("errcode") < 0) {
                        accessTokenJson.access_token = result.access_token;
                        accessTokenJson.expires_time = new Date().getTime() + (parseInt(result.expires_in) - 200) * 1000;
                        //更新本地存储的
                        fs.writeFile('/home/nodeApp/wxApp/data/access_token.json', JSON.stringify(accessTokenJson));
                        //将获取后的 access_token 返回
                        resolve(accessTokenJson.access_token);

                    } else {
                        //将错误返回
                        resolve(result);
                    }
                })

            }).on('error',function(err){
                reject1(err);
            });
        } else {
            //将本地存储的 access_token 返回
            resolve(accessTokenJson.access_token);  
        }
    }).then(function(data) {
        res.send(data);
    });
    
});

module.exports = router;

看到如下信息,就完成了

clipboard.png

欢迎各位小伙伴补充。

阅读 2.9k

前端技术汇
总结前端开发经验,自己遇到的一些坑以及如何填坑的过程

console.log('hello FED');

892 声望
38 粉丝
0 条评论
你知道吗?

console.log('hello FED');

892 声望
38 粉丝
宣传栏