欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

微信扫描二维码登录网页版微信原理之我的见解

shiping1 的头像
1、微信网页版有一个二维码,这个二维码里面的信息其实就是一个url:https://login.weixin.qq.com/l/8fb2531b276849,当然后面带的那个参数是唯一的。
 
2、微信网页版打开后,就会向服务器发出一个ajax请求,请求的url却不是二维码里的url,而是这种格式:
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=c758718a7fb844&tip=1&_=1410184901947,(里面有三个参数,一个是二维码里面的url后面那个唯一的识别码uuid,一个是tip=1(为什么等于1我就不知道了),一个是当前时间戳,参数名是一个下划线"_"),如下图所示:
 
微信扫描二维码登录网页版微信原理之我的见解
 
 
3、服务器收到请求,就去数据库相应的表里面查询有没有这样一条记录:即get请求传过来的参数(uuid)跟一个微信用户id(其实就是微信号)绑定的一条记录,如下图所示:
微信扫描二维码登录网页版微信原理之我的见解

 
1)如果没有这条记录,该请求会在服务器端保持27秒左右(如果用php实现,估计就是sleep一下,再查一下数据库,sleep一下,又查一下数据库,27秒之后还没有查到上面那条记录,就返回window.code=408)
 
微信扫描二维码登录网页版微信原理之我的见解
 
返回window.code=408
微信扫描二维码登录网页版微信原理之我的见解
 

页面收到这个返回值,则又发出一条请求(还是同样的请求,在服务器端保持27秒左右没有结果,就返回window.code=408,页面收到之后,再次发出请求,如此循环下去,直接找到这条记录)
 
 
2)如果有这条记录,而且ischeck=0,就显示
 
微信扫描二维码登录网页版微信原理之我的见解
 
 
4、微信页面继续发送刚才的请求,这次就是查询ischeck字段是不是为1了:
1)如果为1,则服务器给这个uuid对应的微信号做一个登录(比如session登录的,就用写入一个session),并返回一个cookie给浏览器用于保存登录状态,说这个微信号网页版已经登录了,而且还返回了登录跳转url,微信页面根据这个返回值,用js的window.location.href类似的方法,跳转一下,并加载登录后所需要的资源,到此,微信网页版登录完成。
2)如果不为1,则在服务器端保持27秒左右后,又回到原始的登录页面(相当于没有用手机扫描过,而且手机端再点登录网页版微信的时候,会提示那个二维码已经失效)
 
 
5、至于微信查询的数据库的那条信息是执行插入的呢?那肯定是手机了,手机访问二维码上的链接,带着唯一的uuid和自己的微信号,去插入这条信息,插入成功后,服务器会返回一个状态给微信,微信上就变成了一个按钮,要你确认是否登录微信,如果你点了确认,那么服务器上的这个uuid对应的那条记录的ischeck字段,就会被标记为1,由于客户端一直在反复查询是否有这条记录以及如果有这条记录,ischeck字段是否为1,所以能实现手机点击了确认,客户端就立刻跳转登录了。
 
 
以上为我个人的想法,不知道对不对,具体带的参数,访问的请求可能不止这些(因为我发现微信扫二维码并且点击确认登录网页版微信之后,网页上post了一些参数给服务器),但是大概原理,我认为是这样的。

来自 http://blog.sina.com.cn/s/blog_6db312f10102v3mx.html
普通分类: