微信網(wǎng)頁版登陸原理

微信網(wǎng)頁版登陸原理

  1. 請求微信服務(wù)器返回一個會話ID

    微信Web版本不使用用戶名和密碼登錄,而是采用二維碼登錄,所以服務(wù)器需要首先分配一個唯一的會話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這個值是當前距離林威治標準時間的毫秒)

服務(wù)器會返回如下的字符串:

window.QRLogin.code = 200; window.QRLogin.uuid = "AdrEiQJo7Q==";

而這個AdrEiQJo7Q==字符串就是微信服務(wù)器返回給我們的ID。
  1. 通過會話ID獲得二維碼

    利用剛才獲得的ID去請求服務(wù)器生成的二維碼,通過上面的ID我們組合得到以下的URL地址:
    https://login.weixin.qq.com/qrcode/AdrEiQJo7Q==
    該請求返回的便是我們需要的二維碼,此時需要用戶在微信的手機版本中掃描這個二維碼即可登陸(長按識別二維碼都不行神僵,必須是掃描)

  2. 輪詢手機端是否已經(jīng)掃描二維碼并確認在Web端登錄
    當獲得二維碼之后腿宰,就需要用戶去手機端去掃描二維碼呕诉,并獲得用戶的授權(quán),此時我們并不知道用戶何時完成這個操作吃度,所以我們只有輪詢甩挫,而輪詢的地址就是:
    https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=DeA6idundY9VKn&tip=1&_=1377482045264(注意UUID和最后時間這兩個參數(shù))

  • 如果服務(wù)器返回:
    window.code=201; window.userAvatar = ''
    則說明此時用戶在手機端已經(jīng)完成掃描,但還沒有點擊確認椿每;
  • 如果服務(wù)器返回:
    window.code=408;
    則說明此時用戶在手機端?還未掃描伊者;
  • 如果服務(wù)器返回:
    window.code=201;window.redirect_uri=一個URL地址
    則說明此時用戶已經(jīng)在手機端完成了授權(quán)過程,保存下這個URL地址下一步 驟中使用.
  1. 訪問登錄地址间护,獲得uin和sid
    通過訪問上一步驟中獲得的URL地址亦渗,
    https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AVGnnO4cQDp0D-oRRdFpPdKk@qrticket_0&uuid=Qa5hIYJlPg==&lang=zh_CN&scan=1487128220
    可以在服務(wù)器返回的Cookies中獲得到wxuin和wxsid這兩個值,
<?xml version="1.0" encoding="utf-8"?>
<error>
<ret>0</ret>
<message/>
<skey>@crypt_6c791e4d_d2cc04dcc3df812824b41abd98616a44</skey>
<wxsid>BqaMHRqFxeQvdOWD</wxsid>
<wxuin>31213e21</wxuin>
<pass_ticket>fVJ6%2FwoyREZ%2BDIeadCjR%2Fz%2BvAh4keU3A3AvI29NzSaXOdBcxxekwJ51O9S05Q6MG</pass_ticket>
<isgrayscale>1</isgrayscale>
</error>

這兩值在后續(xù)的通信過程中都要使用到這兩個值汁尺,并且Cookies中也需要包括這兩項法精。

  1. 初使化微信信息

前面的步驟算是完成了這個復(fù)雜的登錄過程,如果我們需要使用微信就需要獲得當前用戶的信息痴突、好友列表等亿虽,還有一個關(guān)鍵的就是同步信息(后續(xù)與服務(wù)器輪詢中需要使用同步信息),通過訪問以下的鏈接:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1377482058764(r依然是時間)
訪問該鏈接需要使用POST苞也,并且在Body中帶上以下的JSON信息:

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

這個JSON串中Uin和Sid分別是上面步驟中獲得的那兩個Cookie值,DeviceID是一個本地生成的隨機字符串(分析了官方的總是e+一串數(shù)字粘秆,所以我們也保持這樣的格式)如迟。
服務(wù)器就會返回一個很長的JSON串,這其中包括:BaseResponse中的值用來表示請求狀態(tài)碼攻走,ContactList主要用來表示聯(lián)系人(此列表不全殷勘,只包括了類似通訊錄助手、文件助手昔搂、微信團隊和一些公眾帳號等玲销,后面會通過另一接口去獲得更全面的信息),SyncKey是用戶與服務(wù)器同步的信息摘符,User就是當前登錄用戶自己的信息贤斜。

6.獲得所有的好友列表

在上一步驟中已經(jīng)獲得了部分好友和公眾帳號,如果需要獲得完整的好友信息逛裤,就需要訪問以下的鏈接:

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

訪問該鏈接同樣需要POST方式瘩绒,但Body為空JSON:{},服務(wù)器對身份的判定是通過Cookies带族,所以需要保持之前訪問的Cookies不被修改(在Objective-C中會自動保存相關(guān)的Cookies锁荔,無需程序特殊處理),在返回的JSON串中蝙砌,MemberList中就包含了所有的好友信息阳堕。

7.保持與服務(wù)器的信息同步

與服務(wù)器保持同步需要在客戶端做輪詢跋理,該輪詢的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

其中的參數(shù)r和_都是time,sid恬总,uin前普,deviceid與上面步驟的值相對應(yīng),此處的synkey是上步步驟獲得的同步鍵值越驻,但需要按一定的規(guī)則組合成以下的字符串:

1_124125|2_452346345|3_65476547|1000_5643635

就是將鍵和值用_隔開汁政,不同的鍵值對用|隔開,但記得|需要URL編碼成%7C缀旁,通過訪問上面的地址记劈,會返回如下的字符串:

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

如果retcode中的值不為0,則說明與服務(wù)器的通信有問題了并巍,但具體問題我就無法預(yù)測了目木,selector中的值表示客戶端需要作出的處理,目前已經(jīng)知道當為6的時候表示有消息來了懊渡,就需要去訪問另一個接口獲得新的消息刽射。

8.獲得別人發(fā)來的消息

當一個步驟中知道有新消息時,就需要去獲取消息內(nèi)容剃执,通過訪問以下的鏈接:

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

上面鏈接中的參數(shù)sid對應(yīng)上面步驟中的值誓禁,r為時間,訪問鏈接需要使用POST方式肾档,Body中包括JSON串摹恰,該JSON串格式如下:

{"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與上面步驟中的值對應(yīng),SyncKey也是上面步驟中獲得的同步鍵值對怒见,rr為時間俗慈,訪問成功之后服務(wù)器會返回一個JSON串,其中AddMsgList中是一個數(shù)組遣耍,包含了所有新消息闺阱。

9.向用戶發(fā)送消息

用戶主動發(fā)送消息,通過以下的URL地址:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?sid=QfLp+Z+FePzvOFoG&r=1377482079876
上面的sid和r參數(shù)不再解釋了舵变,訪問該URL采用POST方式酣溃,在Body中的JSON串形如以下的格式:

{
"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都是授權(quán)相關(guān)的值,與上面的步驟中的值對應(yīng)纪隙,Msg是對消息的描述救拉,包括了發(fā)送人與接收人,消息內(nèi)容瘫拣,消息的類型(1為文本)亿絮,ClientMsgId和LocalID由本地生成。rr可用當前的時間。
在返回JSON結(jié)果中BaseResponse描述了發(fā)送情況派昧,Ret為0表示發(fā)送成功黔姜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蒂萎,隨后出現(xiàn)的幾起案子秆吵,更是在濱河造成了極大的恐慌,老刑警劉巖五慈,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纳寂,死亡現(xiàn)場離奇詭異,居然都是意外死亡泻拦,警方通過查閱死者的電腦和手機毙芜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來争拐,“玉大人腋粥,你說我怎么就攤上這事〖懿埽” “怎么了隘冲?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绑雄。 經(jīng)常有香客問我展辞,道長,這世上最難降的妖魔是什么万牺? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任纵竖,我火速辦了婚禮,結(jié)果婚禮上杏愤,老公的妹妹穿的比我還像新娘。我一直安慰自己已脓,他們只是感情好珊楼,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著度液,像睡著了一般厕宗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堕担,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天已慢,我揣著相機與錄音,去河邊找鬼霹购。 笑死佑惠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膜楷,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼旭咽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赌厅?” 一聲冷哼從身側(cè)響起穷绵,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎特愿,沒想到半個月后仲墨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡揍障,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年目养,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亚兄。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡混稽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出审胚,到底是詐尸還是另有隱情匈勋,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布膳叨,位于F島的核電站洽洁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菲嘴。R本人自食惡果不足惜饿自,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龄坪。 院中可真熱鬧昭雌,春花似錦、人聲如沸健田。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妓局。三九已至总放,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間好爬,已是汗流浹背局雄。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留存炮,地道東北人炬搭。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓蜈漓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尚蝌。 傳聞我的和親對象是個殘疾皇子迎变,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容