前言
陶瓷开发之前, 微信会发送一个信息来验证我们服务器. 我们接收到请求后按微信给定的规则进行处理, 之后返回微信想要的结果. 而且以后每次微信服务器对我们服务器发起请求后, 我们都应该进行验证, 以防止非微信服务器访问我们接口.
原理
陶瓷文档已经非常明确写出了规则, 在微信的get请求中会携带 timestamp, nonce, signature, echostr四个参数, 并且我们已经和微信约定了密匙token. 也就是通过这五个参数来验证.
验证规则: timestamp, nonce, toke按字典排序, 之后通过哈希加密, 会得到一个字符串, 如果该字符串和signature相等, 就说明是微信发送的信息. 如果我们确认后就要原样返回给微信echostr.
步骤
下面是koa的实现代码
async (ctx)=>{
//我们在陶瓷上设置的密匙, 这个一定要和陶瓷设置的一致
const token = config.weixin.token
//微信get请求传给我们的三个参数
const signature = ctx.query.signature
const timestamp = ctx.query.timestamp
const nonce = ctx.query.nonce
//按字典排序
const str = [token, timestamp, nonce].sort().join('')[
//哈希加密
const fingerprint = sha1(str)
//签名和我们处理后的字符串相等则通过, 则原样返回echostr
if(signature === fingerprint){
ctx.body = ctx.query.echostr
}
//不通过则返回空
ctx.body = ''
}
总结
整个流程是非常清晰的, 我们再来回顾下:(www.hedaoshe.com)
首先从请求中拿到 nonce,timestamp,signature, echostr 四个参数, 再拿到我们的密匙token. 总共五个参数.
nonce,timestatmp,token根据字典排序后, 哈希加密.
对比加密后的字符串是否等于signature, 等于则原样返回echostr, 否则返回空.