node express 微信开发

2017-12-03  本文已影响0人  ynwshy

wechat-node

微信开发 基于node express框架

介绍

node express 微信开发


搭建服务器环境

可以参考
node express 服务器环境搭建


准备微信测试账号


开始写代码

把我们的一些配置信息存储下来
创建config文件夹,weixin.cfg.js

module.exports = {
    appid: 'wx51234567896d',
    secret: '83112345678912345603',
    token: "yourtoken",
};

微信接入验证

接入微信公众平台开发

router 文件夹下创建文件夹weixin,再添加一个checksignature.js

签名需要加密 安装crypto

npm install crypto
// /routers/weixin/token.js

var express = require('express');
var router = express.Router();

var crypto = require('crypto');
var wechat_cfg = require('../../config/wechat.cfg');


// 开发者通过检验signature对请求进行校验。
// 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败
// 1)将token、timestamp、nonce三个参数进行字典序排序
// 2)将三个参数字符串拼接成一个字符串进行sha1加密
// 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

router.get('/', function(req, res, next) {
    console.log("checksignature");

    // 微信服务器要检测我们的微信接入接口是否正确,会请求我们要接入微信的这个接口
    // 所以会返回signature、timestamp、nonce、echostr这几个参数给我们

    // signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    var signature = req.query.signature;
    var timestamp = req.query.timestamp;
    var nonce = req.query.nonce;
    var echostr = req.query.echostr;
    console.log(`signature : ${signature}`);
    console.log(`timestamp : ${timestamp}`);
    console.log(`nonce     : ${nonce}`);
    console.log(`echostr   : ${echostr}`);

    /*  加密/校验流程如下: */
    //1. 将token、timestamp、nonce三个参数进行字典序排序
    var array = new Array(wechat_cfg.token, timestamp, nonce);
    array.sort();
    var str = array.toString().replace(/,/g, "");

    //2. 将三个参数字符串拼接成一个字符串进行sha1加密
    var sha1Code = crypto.createHash("sha1");
    var signcode = sha1Code.update(str, 'utf-8').digest("hex");

    console.log(`signcode : ${signcode}`);
    //3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    // 原样返回echostr参数内容
    if (signcode === signature) {
        res.send(echostr)
    } else {
        res.send("error");
    }
});

module.exports = router;

在app.js中配置路由

var weixin_token = require('./routes/weixin/token');

app.use('/weixin/token', weixin_token);

获取access_token

获取access_token 文档
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

接口调用请求说明

https请求方式: GET

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

router 文件夹下创建文件夹weixin,再添加一个accesstoken.js

需要安装request模块:

npm install request

// /routers/weixin/accesstoken.js

var express = require('express');
var router = express.Router();
var request = require('request');
var fs = require('fs'); //因为我们需要对文件来进行操作,所以导入fs模块

var accesstokenUtils = require('../../utils/wechat/accesstokenUtils')

var wechat_cfg = require('../../config/wechat/wechat.cfg');


console.log("accesstoken.js");

router.get('/', function(req, res, next) {
    console.log("post: wechat/accesstoken");
    console.log(new Date().getTime());
    // AppID和AppSecret可在“微信公众平台-开发-基本配置”
    // let accesstokenUrl = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${wechat_cfg.appID}&secret=${wechat_cfg.appsecret}`;

    // accesstokenUtils.getAccessToken();

    accesstokenUtils.getAccessToken()
        .then(function(fsContent) {
            console.log("getAccessToken  " + fsContent);
            console.log("getAccessToken  ");
            var fsContentData = JSON.parse(fsContent);

            if (accesstokenUtils.isValidAccessToken(fsContentData)) {
                res.send(fsContentData);
                return Promise.resolve(null);
            } else {
                console.log("accesstokenUtils.updateAccessToken()");
                return accesstokenUtils.updateAccessToken();
            }

        })
        .then(function(reqData) {
            if (reqData!==null) {
                console.log("updateAccessToken  callback :");
                accesstokenUtils.saveAccessToken(reqData).then(() => res.send(reqData));
                console.log("res.send( updateAccessToken  callback)");
            }
        });


});

module.exports = router;



上一篇下一篇

猜你喜欢

热点阅读