蘑菇街网站的扫二维码登陆是怎么作到的?

蘑菇街网站的扫二维码登陆是怎么作到的?

http://mp.weixin.qq.com/qa/index.php?qa=15867&qa_1=%E8%98%91%E8%8F%87%E8%A1%97%E7%BD%91%E7%AB%99%E7%9A%84%E6%89%AB%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%99%BB%E5%BD%95%E6%98%AF%E6%80%8E%E4%B9%88%E5%81%9A%E5%88%B0%E7%9A%84%EF%BC%9Fphp

想作一个类同蘑菇街网站的扫二维码登陆的功能,可是找翻了公开有API文档没有找到相应的说明。是要申请特别的权限或接口吗? 请高人指教。看下面的地址发现是腾讯的地址,可是查不到任何的API,自已偿试也是没有权限。https://open.weixin.qq.com/connect/qrconnect?appid=wx4530e35e8a9fc5cd&redirect_uri=http://www.mogujie.com/oauth/callback/weixin/mogujie?referer_key=5E6BA887B6F2988918AD730D730D8D69&response_type=code&scope=snsapi_loginweb

我猜想应该是微信内部开放给合做网站的接口
 
貌似须要某种官方接口,可是我研究了一下,经过微信的临时二维码也能够模拟实现相似的功能。不一样之处在于要在网站上让用户扫描完二维码并成功扫描之后,网站后台记录下是哪一个用户在对应的临时二维码上进行了扫描,此时后台服务器记录下用户,而后让用户在网站上点击扫描完毕,就能够跳转到下一个页面,完成扫码登陆。

下面是民间的流程,微信Web版的流程:api

1.微信服务器返回一个会话ID数组

微信Web版本不使用用户名和密码登陆,而是采用二维码登陆,因此服务器须要首先分配一个惟一的会话ID,用来标识当前的一次登陆,经过请求地址:服务器

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&_=1377482012272(其中1377482012272这个值是当前距离林威治标准时间的毫秒)微信

服务器会返回以下的字符串:app

window.QRLogin.code = 200; window.QRLogin.uuid = “DeA6idundY9VKn”;网站

而这个DeA6idundY9VKn字符串就是微信服务器返回给咱们的ID。ui

2.经过会话ID得到二维码编码

既然微信Web版本是经过二维码进行登陆,如何得到这个随机的二维码呢?答案就是利用刚才得到的ID去请求服务器生成的二维码,经过上面的ID咱们组合获得如下的URL地址:

https://login.weixin.qq.com/qrcode/DeA6idundY9VKn?t=webwx

该请求返回的即是咱们须要的二维码,此时须要用户在微信的手机版本中扫描这个二维码(我就搞不明白微信官方是如何想的,登陆Web版本居然还须要手机微信去配合登陆,难道没有考虑我被迫选择Web微信就是由于手机不在身边这样的情形么?)

3.轮询手机端是否已经扫描二维码并确认在Web端登陆

当得到二维码以后,就须要用户去手机端去扫描二维码,并得到用户的受权,此时咱们并不知道用户什么时候完成这个操做,因此咱们只有轮询,而轮询的地址就是:

https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=DeA6idundY9VKn&tip=1&_=1377482045264(注意UUID和最后时间这两个参数)

若是服务器返回:

window.code=201;

则说明此时用户在手机端已经完成扫描,但尚未点击确认;

若是服务器返回:

window.redirect_uri=一个URL地址

则说明此时用户已经在手机端完成了受权过程,保存下这个URL地址下一步骤中使用。

4.访问登陆地址,得到uin和sid

经过访问上一步骤中得到的URL地址,能够在服务器返回的Cookies中得到到wxuin和wxsid这两个值,这两值在后续的通讯过程当中都要使用到这两个值,而且Cookies中也须要包括这两项。

5.初使化微信信息

前面的步骤算是完成了这个复杂的登陆过程,若是咱们须要使用微信就须要得到当前用户的信息、好友列表等,还有一个关键的就是同步信息(后续与服务器轮询中须要使用同步信息),经过访问如下的连接:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1377482058764(r依然是时间)

访问该连接须要使用POST,而且在Body中带上如下的JSON信息:

1
2
{ "BaseRequest" :
{ "Uin" : "2545437902" , "Sid" : "QfLp+Z+FePzvOFoG" , "Skey" : "" , "DeviceID" : "e1615250492" }}

这个JSON串中Uin和Sid分别是上面步骤中得到的那两个Cookie值,DeviceID是一个本地生成的随机字符串(分析了官方的老是e+一串数字,因此咱们也保持这样的格式)。

服务器就会返回一个很长的JSON串,这其中包括:BaseResponse中的值用来表示请求状态码,ContactList主要用来表示联系人(此列表不全,只包括了相似通信录助手、文件助手、微信团队和一些公众账号等,后面会经过另外一接口去得到更全面的信息),SyncKey是用户与服务器同步的信息,User就是当前登陆用户本身的信息。

6.得到全部的好友列表

在上一步骤中已经得到了部分好友和公众账号,若是须要得到完整的好友信息,就须要访问如下的连接:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r=1377482079876(r依然是时间)

访问该连接一样须要POST方式,但Body为空JSON:{},服务器对身份的断定是经过Cookies,因此须要保持以前访问的Cookies不被修改(在Objective-C中会自动保存相关的Cookies,无需程序特殊处理),在返回的JSON串中,MemberList中就包含了全部的好友信息。

7.保持与服务器的信息同步

与服务器保持同步须要在客户端作轮询,该轮询的URL以下:

https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?callback=jQuery18309326978388708085_1377482079946&r=1377482079876&

sid=QfLp+Z+FePzvOFoG&uin=2545437902&deviceid=e1615250492&synckey=(见如下说明)&_=1377482079876

其中的参数r和_都是time,sid,uin,deviceid与上面步骤的值相对应,此处的synkey是上步步骤得到的同步键值,但须要按必定的规则组合成如下的字符串:

1_124125|2_452346345|3_65476547|1000_5643635

就是将键和值用_隔开,不一样的键值对用|隔开,但记得|须要URL编码成%7C,经过访问上面的地址,会返回以下的字符串:

window.synccheck={retcode:”0″,selector:”0″}

若是retcode中的值不为0,则说明与服务器的通讯有问题了,但具体问题我就没法预测了,selector中的值表示客户端须要做出的处理,目前已经知道当为6的时候表示有消息来了,就须要去访问另外一个接口得到新的消息。

8.得到别人发来的消息

当一个步骤中知道有新消息时,就须要去获取消息内容,经过访问如下的连接:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=QfLp+Z+FePzvOFoG&r=1377482079876

上面连接中的参数sid对应上面步骤中的值,r为时间,访问连接须要使用POST方式,Body中包括JSON串,该JSON串格式以下:

1
2
3
{ "BaseRequest" : { "Uin" :2545437902, "Sid" : "QfLp+Z+FePzvOFoG" },
"SyncKey" : { "Count" :4, "List" :[{ "Key" :1, "Val" :620310295},{ "Key" :2, "Val" :620310303},{ "Key" :3, "Val" :620310285},{ "Key" :1000, "Val" :1377479086}]},
"rr" :1377482079876};

如下的信息中BaseRequest中包括的Uin与Sid与上面步骤中的值对应,SyncKey也是上面步骤中得到的同步键值对,rr为时间,访问成功以后服务器会返回一个JSON串,其中AddMsgList中是一个数组,包含了全部新消息。

9.向用户发送消息

用户主动发送消息,经过如下的URL地址:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?sid=QfLp+Z+FePzvOFoG&r=1377482079876

上面的sid和r参数再也不解释了,访问该URL采用POST方式,在Body中的JSON串形如如下的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
     "BaseRequest" :{
         "DeviceID" : "e441551176" ,
         "Sid" : "S8wNi91Zry3024eg" ,
         "Skey" : "F820928BBA5D8ECA23448F076D2E8A915E1349E9FB4F4332" ,
         "Uin" : "2545437902"
     },
     "Msg" : {
         "ClientMsgId" : 1377504862158,
         "Content" : "hello" ,
         "FromUserName" : "wxid_2rrz8g8ezuox22" ,
         "LocalID" : 1377504862158,
         "ToUserName" : "wxid_j4nu420ojhsr21" ,
         "Type" : 1
     },
     "rr" = 1377504864463
}

其中BaseRequest都是受权相关的值,与上面的步骤中的值对应,Msg是对消息的描述,包括了发送人与接收人,消息内容,消息的类型(1为文本),ClientMsgId和LocalID由本地生成。rr可用当前的时间。在返回JSON结果中BaseResponse描述了发送状况,Ret为0表示发送成功。

相关文章
相关标签/搜索