一、微信公共号定制化开发原理
申请公共号后,我们登录公共号的后台管理系统会看到一些默认的功能
如“自动回复、自定义菜单”等功能,这个时候,我们可以直接在此处进行配置,配置后,微信公共号会根据所配置的规则对用户的请求做出响应。
此时的流程为:用户直接请求腾讯服务器,腾讯服务器给出相应。
若我们,在开发→基本配置→服务器配置中配置好服务器校验地址并启用的话:
此时微信服务器会先校验你配置的第三方地址能否正确处理微信请求,若校验通过,微信服务器会把用户的请求转发到配置的第三方服务器地址中(图中为:http://www.xiaoxiekeke.com/weixin/xiaoke/),第三方服务器接受请求后作出相应的处理返回给微信服务器,微信服务器再返回给用户,此时的请求响应流程图为:
二、第三方服务器的接入
我们已经知道了,若微信接入了第三方服务器之后,微信会把用户的请求转发到接入的第三方服务器地址中。那么是不是随便一台第三方服务器都可以被接入呢?当然不是!微信在接入之前会对你配置的服务器地址进行校验,只有能作出正确响应并且被微信校验通过才可作为被微信转发的服务器。
当你在启动服务器配置的时候,微信会向你填写的地址发送一个GET请求,这个GET请求会带上一些参数:signature、timestamp、echostr、nonce,我们自己还会在微信后台配置一个token,我们拿到这些参数之后做如下操作:
1、将timestamp、nonce、token这几个参数构成一个数组以字典排序;
2、将排序后的数组通过转化成字符串;
3、将得到的字符串进行sha1加密,得到一个加密后的sha1串;
4、将得到的sha1串与拿到的signature进行对比,如果相同的话则校验成功;
5、微信服务器拿到返回的校验结果进行判断,若校验通过,则准许该服务器地址接入微信。
接下来show Code:
//1.将tampstap,nonce,token,echostr按字典序排序
var token='xiaoke';
var signature = req.query.signature;
var timestamp = req.query.timestamp;
var echostr = req.query.echostr;
var nonce = req.query.nonce;
// 2、将三个参数进行字典序排序
var arr=[timestamp,nonce,token];
arr.sort();
var arrstr =arr.join('');
// 3、将三个参数拼接成一个字符串进行sha1加密
var hash = crypto.createHash('sha1');
var sign = hash.update(arrstr).digest('hex');
// 4、开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (signature===sign) {
res.status(200).send(echostr);
}else{
res.send("invalid sign")
}
具体可以参考我的项目代码:https://github.com/xiaoxiekeke/wxnode/blob/master/routes/verify.js
网友评论