最近被微信各种登录方式,整的实在是有点蒙,网页登录,公众号登录,微信小程序登录,等等虽然登录的方式大体上差不多,但不同的地方差别还是很大的,只能等到我不是太晕了,然后过来整理下文章,找找错误。。。
2019年12月22日22:21:48
2020年2月18日00点01分
弄懂 oAuth2.0 协议,网页登录,公众号登录,微信小程序登录、github 登录都不是问题。
微信公众号开发,微信后台开发者工具提供了六个模块,但只有四个模块比较有用:
开发文档不用讲了,在线接口调试工具就是你写接口的时候,一直报错就用接口调试工具来看看哪里写错了。web开发工具开发的微信网页在PC上运行调试,公众号测试账号就是用来辅助开发的,公众号第三方服务平台可以把公众号委托给第三方使用,CDN收费的。。。
一、开始验证服务器的有效性
为什么要验证服务器的有效性?公众号的通信方式是这样的
用户发消息=>微信服务器接收=>我们的服务器进行处理数据完成返回=>微信服务器=>用户接收
我们要保证微信服务器和我们的服务器之间通信安全。所以他俩之间有个 token,来标识对方。不会让第三方来冒充。
真实的服务器环境配置:
再开始开发公众号之前,先完成 接入指南。
接入指南 针对的是真正的公众号和服务器,但是一般我们开发限于真正公众号提供的接口不全,都是使用测试号,所以下面 接入指南 主要是在测试号上演示。两者没啥区别。
第一步:填写服务器配置。主要涉及的是填写服务器地址(URL)、Token和EncodingAESKey(测试号没有)。
测试号填写地址接口地址必须是外网能够访问的,我们没有备案可访问的域名,就用内网穿透来开发。内网穿透方式两个,两种方式都有免费的和收费的,免费的最大的不方便之处就是每次启动服务分配的域名是不同的,你的老是去改后台网址链接,收费的就没有这个烦恼,想方便点的话,买一个月的也不是很贵,我买的时候九块,买的就是 netapp的,用起来还不错:
-
netapp
netapp穿透效果 - ngrok 点击下载网址
下载ngrok
下载完成之后,即可以使用ngrok http 3000
来启用本地的 3000 端口。启用成功截图如下:
第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上参数。
- 描述 signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
- timestamp 时间戳
- nonce 随机数
- echostr 随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
将token、timestamp、nonce三个参数进行字典序排序 。将三个参数字符串拼接成一个字符串进行sha1加密 。开发者获得加密后的字符串可与signature对比,标识该请求来源于微信服务器。
检验 signature 的 NodeJS 示例代码:
const app = require("express")();
app.use((req,res)=>{
console.log(req.query);
res.send();
});
app.listen(80,()=>console.log("80端口号成功运行"));
启用服务器看看微信提交验证的时候到底发过来的是啥子。
接下来就要验证了消息是否来自服务器:
更改 app.js 文件内容为:
const app = require("express")();
const sha1 = require("sha1");
app.use((req,res,next)=>{
// GET请求携带参数是个参数signature,timestamp,nonce,echostr
const {signature,timestamp,nonce,echostr} = req.query;
// 服务器的token
const token = "TOKEN";
// 将token、timestamp、nonce三个参数进行字典序排序
const arrSort = [token,timestamp,nonce];
arrSort.sort();
// 将三个参数字符串拼接成一个字符串进行sha1加密,npm install --save sha1
const str = arrSort.join("");
const shaStr = sha1(str);
// 获得加密后的字符串可与signature对比,验证标识该请求来源于微信服务器
if(shaStr === signature){
// 确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效
res.send(echostr);
}else{
//否则接入失败。
res.send("no");
}
});
app.listen(80,()=>console.log("80端口号成功运行"));
再次尝试连接,添加服务器配置成功:
网友评论