美文网首页基础前端
NodeJs 开发微信公众号——验证服务器

NodeJs 开发微信公众号——验证服务器

作者: CondorHero | 来源:发表于2019-12-29 16:44 被阅读0次

    常见的几种微信授权登录方式

    常见的几种微信授权登录方式

    最近被微信各种登录方式,整的实在是有点蒙,网页登录,公众号登录,微信小程序登录,等等虽然登录的方式大体上差不多,但不同的地方差别还是很大的,只能等到我不是太晕了,然后过来整理下文章,找找错误。。。
    2019年12月22日22:21:48

    2020年2月18日00点01分
    弄懂 oAuth2.0 协议,网页登录,公众号登录,微信小程序登录、github 登录都不是问题。


    微信公众号开发,微信后台开发者工具提供了六个模块,但只有四个模块比较有用:



    开发文档不用讲了,在线接口调试工具就是你写接口的时候,一直报错就用接口调试工具来看看哪里写错了。web开发工具开发的微信网页在PC上运行调试,公众号测试账号就是用来辅助开发的,公众号第三方服务平台可以把公众号委托给第三方使用,CDN收费的。。。

    一、开始验证服务器的有效性

    为什么要验证服务器的有效性?公众号的通信方式是这样的

    用户发消息=>微信服务器接收=>我们的服务器进行处理数据完成返回=>微信服务器=>用户接收
    

    我们要保证微信服务器和我们的服务器之间通信安全。所以他俩之间有个 token,来标识对方。不会让第三方来冒充。

    真实的服务器环境配置:


    再开始开发公众号之前,先完成 接入指南

    接入指南 针对的是真正的公众号和服务器,但是一般我们开发限于真正公众号提供的接口不全,都是使用测试号,所以下面 接入指南 主要是在测试号上演示。两者没啥区别。

    第一步:填写服务器配置。主要涉及的是填写服务器地址(URL)、Token和EncodingAESKey(测试号没有)。
    测试号填写地址

    接口地址必须是外网能够访问的,我们没有备案可访问的域名,就用内网穿透来开发。内网穿透方式两个,两种方式都有免费的和收费的,免费的最大的不方便之处就是每次启动服务分配的域名是不同的,你的老是去改后台网址链接,收费的就没有这个烦恼,想方便点的话,买一个月的也不是很贵,我买的时候九块,买的就是 netapp的,用起来还不错:

    • netapp


      netapp穿透效果
    • ngrok 点击下载网址
      下载ngrok
      下载完成之后,即可以使用 ngrok http 3000 来启用本地的 3000 端口。启用成功截图如下:
    第二步:验证消息的确来自微信服务器

    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上参数。

    1. 描述 signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    2. timestamp 时间戳
    3. nonce 随机数
    4. echostr 随机字符串

    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

    将token、timestamp、nonce三个参数进行字典序排序 。将三个参数字符串拼接成一个字符串进行sha1加密 。开发者获得加密后的字符串可与signature对比,标识该请求来源于微信服务器。

    检验 signature 的 NodeJS 示例代码:

    const app = require("express")();
    
    app.use((req,res)=>{
        console.log(req.query);
        res.send();
    });
    
    app.listen(80,()=>console.log("80端口号成功运行"));
    

    启用服务器看看微信提交验证的时候到底发过来的是啥子。



    接下来就要验证了消息是否来自服务器:



    更改 app.js 文件内容为:
    const app = require("express")();
    const sha1 = require("sha1");
    
    app.use((req,res,next)=>{
        // GET请求携带参数是个参数signature,timestamp,nonce,echostr
        const {signature,timestamp,nonce,echostr} = req.query;
        
        // 服务器的token
        const token = "TOKEN";
    
        // 将token、timestamp、nonce三个参数进行字典序排序 
        const arrSort = [token,timestamp,nonce];
        arrSort.sort();
    
        // 将三个参数字符串拼接成一个字符串进行sha1加密,npm install --save sha1
        const str = arrSort.join("");
        const shaStr = sha1(str);
    
        // 获得加密后的字符串可与signature对比,验证标识该请求来源于微信服务器
        if(shaStr === signature){
            // 确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效
            res.send(echostr);
        }else{
            //否则接入失败。
            res.send("no");
        }
    });
    
    app.listen(80,()=>console.log("80端口号成功运行"));
    

    再次尝试连接,添加服务器配置成功:


    相关文章

      网友评论

        本文标题:NodeJs 开发微信公众号——验证服务器

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