本文原文由做者Amazing10原创发布于公众号业余码农,收录时有改动,感谢原做者的技术分享。html
某天中午,吃完午餐,摊在本身的躺椅上,想趁吃饱喝足的午后时间静静享受独自的静谧。前端
干点什么好呢?因而单手操做鼠标打开了一个陌生而隐秘的网站。正开着某个视频起劲。。。后端
忽然浏览器弹出了一个提示:浏览器
请使用微信扫码登陆帐号,继续观看安全
这...服务器
可是因为强烈的好奇驱使,迫于无奈,只好选择登陆再继续观看。因而熟练的掏出手机,打开微信扫一扫对准上面的二维码,只听见 “叮” 的一声,网页上的二维码放佛活过来了,直接刷新出了本尊的微信头像,同时手机上也弹出登陆的提醒。微信
心中略微惊叹,但没来得及多想。忙点击手机界面中登陆按钮。此时网页刷新,恢复了正常,表示能够继续观看。网络
上网冲浪的时间老是过得很快,很快就有些疲倦。因而闭上眼睛,脑海中却浮现出了刚刚微信扫描二维码,而后登陆网页的场景,心中再次惊叹,并开始思考起其中的原理来。。。微信开发
言归正传,本文将以轻松活泼的语言形式,为你分析和讲解微信手机扫码登陆的技术原理,但愿在你的IM中开发此功能时有所启发。微信公众平台
微信扫码登陆如今在平常生活中已是常见不能再常见的场景之一了,可是要知道微信首次公开这项功能时,倒是惊艳众人。移动端与PC端以这样一种巧妙的方式连接在了一块儿,的确是让人惊叹。
如下是一个典型的微信扫码登陆全过程:
原本想在Web版微信上截图,但扫码登录后出现了下面的提示(貌似不少人都碰到过):
好吧,这很微信,反正就是不想让你好好用,用户爱咋咋滴。。。
如上图所示,操做过程以下:
1)第一步:电脑上打开PC端(出现2维码);
2)第二步:拿出手机,扫码2维码;
3)第三步:PC端显示扫码成功;
4)第四步:手机端“确认”登陆;
5)第五步:成功登录PC端。
上述实际操做过程,用户体验至关顺滑,也难怪刚出来那会,能惊艳到不少人。
那么,对于上述操做过程的技术实现原理是什么样的呢?
想起来以前听过的先后端的概念,知道帐户的数据信息通常都是放在服务器上,前端负责向后端 “讨要数据” 并显示,后端则是对前端的 “讨要” 作出反应。
这样一来,猜想微信登陆的过程可能就是:
1)网页前端向微信后台请求帐号数据;
2)微信后台接受网页前端的请求,而后将他的帐号数据返回;
3)网页前端接收到了数据后,在浏览器里进行显示。
因而,手脚麻利的画了个示意图:
当我正准备沾沾自喜的时候,忽然看到桌面上的手机。咦,若是就只是这么个过程,那手机的做用是啥。因而才开始意识到,问题没这么简单。
好吧,咱们城要再深刻一点探秘微信扫码登陆的过程。
为了更深刻的分析整个过程,咱们能够去看看微信网页版,地址是:https://wx.qq.com/。
笔者看着网页中硕大的二维码陷入了沉思——这个二维码跟手机帐号有没有什么对应关系呢?若是没有,那它又是怎么生成的呢?
思考间,因而打开了浏览器的开发者工具。
在网络监控一览找到了这幅二维码,与之对应的连接是:
https://login.weixin.qq.com/qrcode/gaO8cOQweA==
以下图所示:
而后习惯性地,尝试屡次刷新页面,发现二维码不断发生变化,连接也不断更改:
https://login.weixin.qq.com/qrcode/AencxgKNFQ==
https://login.weixin.qq.com/qrcode/YcD7f_DxvA==
https://login.weixin.qq.com/qrcode/QblN8lCn2g==
彷佛发现了些东西:二维码不断变化,其对应的连接尾的代码也相应变化,而且是随机性的变化。
这也就是说,每一次页面刷新都会随机且惟一地生成一个二维码。这或许能够与手机登陆的过程联系起来。
彷佛开始明白了,因而再次拿起手机,熟练的使用微信扫描了此时的二维码。
“叮” 的一声,网页上的二维码顿时变成了我帅气的微信头像。这个时候,我才忽然意识到,是扫码以后网页才与他的微信帐号创建起了联系。
以下图所示:
也就是说:
1)没有扫码以前,页面上的二维码只是随机生成的且与用户无关的码;
2)而当用户扫码以后,二维码便与用户账号绑定在了一块儿。
原来手机扫码的用处是这样!
此时注意到,手机微信上弹出了『微信登陆确认』的提醒。这个时候谨慎地点击了下方的登陆按钮。
以下图所示:
随着平滑的动画一闪而过,网页上已经显示出了个人微信帐号信息,显示微信帐号已经登陆。再一次体验这个过程,心中开始思索手机微信在登陆过程当中所起到的具体做用。
首先须要明白几个过程:
1)进入网页登录界面,随机生成一个二维码;
2)经过手机扫描二维码,将微信帐号与二维码绑定;
3)在手机微信点击登陆按钮,受权网页登陆微信帐号;
4)网页得到的帐号信息,将数据显示。
回顾上述过程,结合最开始的原理猜想,开始思索整个环节,是哪里理解的不对。。。
1)网页的二维码到底从何而来?
2)是谁向微信后台请求了帐号数据?
实际上:不一样的网站可能都须要经过微信后台进行数据的获取,那么每个网站必然也存在它的后台来给微信后台发送请求。
这样一来,整个过程就能解释得通了:
1)网站页面刷新,网页后台向微信后台请求受权登陆;
2)微信后台返回登陆所需二维码;
3)用户经过手机扫描二维码,并在手机上受权登陆后,微信后台告知网页后台已受权;
4)网页后台向微信后台请求微信帐号数据;
5)微信后台返回帐号数据;
6)网页后台接收数据并经过浏览器显示;
正如上节所述,想清楚了整个过程后,咱们应该对整个过程的技术实现进行进一步的探究。
在微信开发官方文档中,我找到了第三方网站应用微信登陆开发指南:
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
我将整个过程梳理了一遍,画出了这个图:
如上图所示,整个技术实现以下。
(1)二维码的得到:
(2)微信客户端受权登陆:
(3)网站后台请求数据:
在上述过程当中,有几个参数值得解释一下(来源官方文档):
整个过程从网站后台向微信开发平台请求受权登陆开始,最终目的是为了得到access_token:
access_token:用户受权第三方应用发起接口调用的凭证
在得到了access_token后就能够解析用户的一些基本信息,包括头像、用户名、性别、城市等。这样一来,整个微信扫描登陆的过程就完成了。
研究到这,终于大致上对微信扫码登陆的整个过程有了清晰的认知。看起来彷佛也不难,开发者只须要在网页后端作好对微信公众平台的接口调用便可实现扫码登陆。
伸了伸懒腰,突然又想到在整个过程当中还须要考虑超时的问题。好比二维码超时未扫描、二维码扫描后超时受权、得到access_token后超时等等问题。
我发现一个简单的功能实现起来仍是须要考虑许多细节,真的是纸上得来终觉浅呀。因而我下定决心,下次得少上网冲浪了,花点时间搭个服务器先把微信扫码登陆过程实现看看。
不过,还得先去在微信开放平台注册开发者账号,并拥有一个已审核经过的网站应用,并得到相应的AppID和AppSecret才行。
想了想,仍是让我先趟一下子吧。。。(本文同步发布于:http://www.52im.net/thread-2941-1-1.html)