网页版微信的登录与实现

这是一年前的文章,因为博客改版,重新发布。另外再用现在的知识重新整理下思路。文章对网页微信登录原理进行了思考。网页版微信地址:https://wx.qq.com/

网页微信登录方法:

  1. 打开网页版微信地址,会看到一个二维码。
  2. 打开手机微信客户端,再点击界面上的如下按钮:
  3. 扫面二维码,手机客户端会提示是否登录,点击确定便可登录成功。
    对于普通用户来说这中登录方式可能没太特别的地方,但是非常值得程序员去学习和研究。

以下是我的探究过程:

猜想:

  1. 微信网页上的二维码是经过腾讯公司特殊处理过的。所以别的二维码识别工具不能识别当中的一些特殊信息。

取证:我用该二维码识别工具:http://app.baidu.com/makepic\_qrcode?keyword=%E4%BA%8C%E7%BB%B4%E7%A0%81 识别出二维码信息,然后再用识别出来的信息重新生成二维码。再用户微信手机客户端识别,同样成功。所以排除微信对二维码特殊加工的可能,这样的话腾讯是如何保证登录安全的呢??

  1. 微信网页版获取微信帐号信息是在微信手机端出现登录按钮的时候。

取证:为了不受Cookies的干扰,我开启了chrome 的隐身模式!!(ctrl+shift+N) 再用抓包工具抓包(F12)。抓包方法,请看这两篇文章,Chrome浏览器抓包 IE浏览器抓包 发现第一次出现微信ID是用户在手机微信端点击确定登录之后才出现,所以这样很大程度保证了用户帐号安全。
猜想结束之后,再通过抓包我知道了网页微信登录的大概方法,下面是结论:

  1. 后台通过JQuery实现了长轮询功能。前端一直在获取后台数据库信息。

  2. 获取唯一的uuid;
    获取方式:
    https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect\_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh\_CN&\_=1365142128434
    参数:
    appid:wx782c26e4c19acffb //由js代码生成,对生成二维码有一定影响
    redirect_uri:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
    fun:new
    lang:zh_CN
    _:1365142128434 //数据包标识

返回值:
window.QRLogin.code = 200;
window.QRLogin.uuid = “CCmck8vxfGS5dN”;

返回的状态码与之后都会用到的唯一uuid。

  1. 二维码地址:https://login.weixin.qq.com/qrcode/uuid?t=webwx
    uuid就是通过前面代码获得的,我自己随意填写了几个字符,不能生成二维码。本来还想用这个接口做个二维码在线生成器的!!

  2. 网页客户端监控服务端,获取返回值;
    https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=CG2srY9sdBQNXI&tip=1&\_=1365143032258
    后面的数字是数据包标识。包会连续的发,返回201表示手机端识别成功了,返回408表示失败,接着发数据包。
    tip=1是获取手机端识别命令,tip=0是获取登录命令;

  1. 手机端验证成功之后,网页端还会将type与uuid post到服务器,服务器会做标记,完成匹配验证。如果网页不存在就不能完成post命令,服务器端会标记为失败。登录会不成功。
    等待登录:https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=CJs2pPYTParnC1&tip=0&\_=1365143806090

与第四步4类似,参考第四步的说明。

  1. 登录成功
    window.code=200;
    window.redirect_uri=”https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=c48522c6-58f8-1031-80d0-50e54929056d&lang=zh\_CN&scan=1365144020";

这个redirect_uri就是非常非常重要的信息,通过访问该url就能获取微信帐号,进而能获取好友信息了。与手机端微信实现同步也在于该帐号。这个ticket 32位的16进制字符,想破解太难了。

  1. web访问传回的地址,https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=c48522c6-58f8-1031-80d0-50e54929056d&lang=zh\_CN&scan=1365144020&fun=new
    返回0OK就是成功啦,之后就是信息同步了。

  2. 微信帐号安全匹配成功,信息同步!
    不知道这篇文章有没有参考价值,等我奉上时序图。