美文网首页
node express 微信开发

node express 微信开发

作者: ynwshy | 来源:发表于2017-12-03 14:47 被阅读0次

    wechat-node

    微信开发 基于node express框架

    介绍

    node express 微信开发

    • 获取accesstoken
    • jssdk配置

    搭建服务器环境

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


    准备微信测试账号


    开始写代码

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

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

    微信接入验证

    接入微信公众平台开发

    • 先写出一个接口 /weixin/checksignature

    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
    
    • 先写出一个接口 /weixin/accesstoken

    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;
    
    
    


    相关文章

      网友评论

          本文标题:node express 微信开发

          本文链接:https://www.haomeiwen.com/subject/gmbabxtx.html