微信开发之接入微信公众平台(node.js)

最近开始研究微信接口 api 方面的知识,今天研究了一下微信接口验证,在此分享。
关于微信公众平台开发,整体概念上的东西不再赘述,给出传送门:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432&token=&lang=zh_CN

接入微信公众平台开发有以下三个步骤:

  1. 填写服务器配置
  2. 验证服务器地址的有效性
  3. 依据接口文档实现业务逻辑

step1:填写服务器配置

在申请完微信订阅号以后,登录微信公众平台官网后,在公众平台官网的开发 - 基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token 和 EncodingAESKey,其中 URL 是开发者用来接收微信消息和事件的接口 URL。Token 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。EncodingAESKey 由开发者手动填写或随机生成,将用作消息体加解密密钥。

wechat_serve.jpeg

这里服务器配置成功有两个重要条件:

  1. url 地址必须能够通过外网访问。
  2. url 地址所对应的接口能够比对微信服务器发出的加密 token,同时将结果返回回来。

遇到的问题:

  • 针对 1),由于我是在本地调试,外网怎么访问到我内网的某个端口呢?
    我使用了 natapp,这个软件可以帮助我让外网也能够访问我内网下某个端口的内容。具体使用方法比较简单,请看官方文档:https://natapp.cn/
    PS:nginx 反向代理也可以实现,下次有机会单独写

  • 针对 2),我的本地开发环境:node.js

    话不多说,代码贴出:

    wechatAuth: function(req,res){
        var crypto = require("crypto");
    
        // var test_signature = req.query.signature;
        var signature = req.param('signature');
        var timestamp = req.param('timestamp');
        var nonce = req.param('nonce');
        var echostr = req.param('echostr');
        var token = 'mytoken';
    
        if(check(timestamp,nonce,signature,token)){
            return res.send(echostr);
        }else{
            return res.end();
        }
    
        console.log("signature : " + signature);
    
        function check(timestamp, nonce, signature ,token) {
            var currSign, tmp;
            tmp = [token, timestamp, nonce].sort().join("");
            currSign = crypto.createHash("sha1").update(tmp).digest("hex");
            return currSign === signature;
        };
    
    }
      

代码的验证流程如下(也就是上面代码的逻辑):

  1. tokentimestampnonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密
  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

上面的步骤都完成之后,点击微信公众平台页面上的[提交]按钮,来成为微信开发者,如果成功,则会获得微信的AppID(应用 ID) 和AppSecret(应用密钥)。这些在以后调用微信 api 的时候会非常有用。