看到知乎上有关于微信扫码登陆原理的讨论。现将自己的分析结果写出来,供大家参考,不正确的地方望指正。
用户打开网页版微信: https://wx.qq.com/,微信为用户生成了一张包含uuid的二维码,然后前台向后台发送轮询请求,查询此uuid是否已被绑定上登录签名。但如果uuid尚未绑定登录签名,后台不回立即返回结果,而是会阻塞30秒左右,在30秒内仍未扫描成功,后台会返回一个结果码。结果码的值为408,代表微信客户端尚未扫描。
- 发送轮询请求,判断uuid是否绑定了用户的登陆签名
- 如果30秒内用户未扫码,uuid未绑定用户的登陆签名,则后台返回结果码 window.code=408
如果用户30秒内,未完成扫码,则前台会不停的发送请求。一旦微信扫码完成,后台会直接返回结果,减少等待时间。扫码成功后,后台会返回结果码window.code=201.
微信客户端扫码二维码后,客户端会向服务器发送uuid以及用户信息,以便绑定uuid和用户信息。
- 微信客户端请求信息
- 扫码成功界面
扫码成功后,微信客户端会等待用户确认登陆。用户确认登陆后,微信服务端会为用户生成登陆签名,并将此签名与uuid进行绑定。绑定完成后,微信服务端会将此签名信息返回到前台,之后网页版微信便可通过此签名获取用户信息和微信信息。
- 确认登陆后的网页响应信息
返回的结果码为:window.code=200,代表用户确认登陆成功。接着跳转到网页版微信的登陆页,并携带登陆签名和uuid。微信登陆服务收到这两个参数后,进行校验完成登录,登陆成功后,跳转到网页版微信主页,用户便可以通过网页使用微信了。
--------------------------------------------------------------------------文毕----------------------------------------------------------------------------
微信自身的扫码登陆功能,也可以通过开放接口,供第三方网站或应用使用。集成微信扫码登陆功能,详见我的上一篇文章二维码登陆。如果不想开发代码,可以到我的个人网站:http://it.maerdym.cn/mm_mishu.查看已完成的微信扫码登陆功能。近期我会开发微信扫码登陆插件,供大家使用。