微信开发的第一步就是要打通本地开发环境与微信服务器之间通道,所以我们在将内网(本地)端口映射到外网后,还要有一种特定的暗号来与微信服务器对接,就是加密认证。
在接口配置信息中填入自己的外网代理地址和自定token后,点击确认提交按钮,实际上微信服务器会向我们发送一个认证请求,其中包含:signature,nonce,timestamp,echostr
{
signature: 'xxxxxxxxxxxxxxxxx',
nonce: 'xxxxxxxxxxxxxxxxxx',
timestamp: 'xxxxxxxxxxxxxxxxxxxxxx',
echostr: 'xxxxxxxxxxxxxxxxxxx'
}
而要求我们返回的响应消息是echostr,微信接收到匹配的响应消息就表示接头成功。
但是处于安全考虑,我们本地(内网)地址是暴露到外网的,谁都能进来溜溜,所以我们也需要判断这个请求是否属于微信服务器,判断逻辑如下:
1 将token、timestamp(时间戳)、nonce(随机数)三个参数进行字典排序
2 将三个参数数字字符串拼接成一个字符串进行sha1加密
3 将加密后的字符串与signature对比,如果相同,表示这个请求来源于微信
代码如下:
var str = [token,timestamp,nonce].sort().join('');
var sha = Sha1(str);
if (sha === signature) {
this.body = echostr
}else {
this.body = 'wrong'
}
微信加密认证的过程其实非常简单,但我们要注意代码不能敲错,出现配置错误第一步是查看控制台,请求有没有发过来,然后检查代码拼写
通常会把加密认证做成中间件来简化代码逻辑,这里不做阐述。