目录
article
微信开发之接入微信公众平台(node.js)
微信开发之接入微信公众平台(node.js)
最近开始研究微信接口 api 方面的知识,今天研究了一下微信接口验证,在此分享。
关于微信公众平台开发,整体概念上的东西不再赘述,给出传送门:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432&token=&lang=zh_CN
接入微信公众平台开发有以下三个步骤:
- 填写服务器配置
- 验证服务器地址的有效性
- 依据接口文档实现业务逻辑
step1:填写服务器配置
在申请完微信订阅号以后,登录微信公众平台官网后,在公众平台官网的开发 - 基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token 和 EncodingAESKey,其中 URL 是开发者用来接收微信消息和事件的接口 URL。Token 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。EncodingAESKey 由开发者手动填写或随机生成,将用作消息体加解密密钥。

这里服务器配置成功有两个重要条件:
- url 地址必须能够通过外网访问。
- 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; }; }
代码的验证流程如下(也就是上面代码的逻辑):
- 将
token、timestamp、nonce三个参数进行字典序排序 - 将三个参数字符串拼接成一个字符串进行
sha1加密 - 开发者获得加密后的字符串可与
signature对比,标识该请求来源于微信
上面的步骤都完成之后,点击微信公众平台页面上的[提交]按钮,来成为微信开发者,如果成功,则会获得微信的AppID(应用 ID) 和AppSecret(应用密钥)。这些在以后调用微信 api 的时候会非常有用。