微信扫描二维码登录网页是什么原理,前后两个事件是如何联系的?

关注者
1,652
被浏览
306,341
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

看着答案最后就变成讨论到底是长连接还是轮询的问题,然后就偏了,其实具体用什么技术在这里不是特别重要(长连接也好、Server-Sent Event也好、WebSocket也好、轮询也好,这些都只是途径),提主想知道的是这两个事件是怎么联系的。


表面上的步骤如下:

  1. [电脑] 打开wx.qq.com,得到二维码
  2. [手机] 点开扫一扫,扫描PC端二维码,并且扫描成功
  3. [电脑] 提示扫描成功,[手机] 询问是否确认登陆
  4. [手机] 确认登陆(如果不确认登陆么,[电脑]就还是那样)
  5. [电脑] 跳转

其实对应的内部机制差不多是这样的:

  1. 电脑请求网页后,微信服务器生成一个唯一的ID(这里是UUID)给客户端网页,客户端定时发起向微信服务器的连接(这里类似于轮询),微信服务器保持这个连接(这里类似于长连接),保持一段时间(大概27秒)返回一个“还没人扫码”的标识,于是客户端再开连接
  2. 手机微信扫码并解码,解码出来是一个URL也好,是一段文本也好,总之这段东西匹配了手机微信登陆网页版的要求,于是手机微信带着解码出来的信息去请求微信服务器。这里就已经达到了特定微信账号和某个特定网页相关联的目的
  3. 电脑这里微信服务器马上在长连接中返回“有人扫码了”的表示并结束连接,网页提示扫描成功,然后打开长连接等待确认登陆的标识;手机这里么则根据二维码的信息打开对应网页确认登陆
  4. 后面其实和前面一样了,手机微信确认登陆的其实就是请求服务器说这个可以登录了,然后服务器给网页的长连接中返回可以登录的标识并结束长连接,然后跳转到消息网页


就算是单一的长连接也是可以的,流程差不多;就算是轮询又怎么样呢(当然服务器开销会大总所周知),大不了就是等到某一条请求下来发现是“有人扫码”然后接下去某一个请求下来是”确认登陆“而已。

这个流程其实是主要的,至于用什么技术是次要的,用什么技术只是手段而已,假设微信这个网页登陆是出现在5年后,那微信肯定会去用标准化的WebSocket。真要讨论的话,微信最后那个还可以不跳转,做成单网页的,这就没有什么讨论的意义了。