首先我們先理一下微信的實(shí)現(xiàn)思路,來方便我們理解解決這一難題的思路方向。微信登錄的二維碼實(shí)際上是將一個(gè)URL轉(zhuǎn)換成二維碼的形式,而通過微信客戶端掃碼后,無非就是打開了這個(gè)url, 我捕捉到的微信二維碼的url為https://login.weixin.qq.com/l/YdmTu30I5A== ,這個(gè)url里的YdmTu30I5A==代表的是本次會(huì)話的唯一ID, 這個(gè)有點(diǎn)兒類似瀏覽器里的session id,通過這個(gè)ID,微信就能定向?qū)⒋_認(rèn)結(jié)果反饋到網(wǎng)頁上。使用微信二維碼登錄功能,需要有兩個(gè)前提:一是客戶端上需要安裝微信app。二是用戶需要登錄到到微信app。https://wx.qq.com/
Python Websocket消息推送
為什么要有這兩個(gè)條件呢?那是因?yàn)槲⑿旁诖_認(rèn)是否允許登錄到網(wǎng)頁版的時(shí)候,微信需要提取當(dāng)前app的登錄信息并將上面的session ID一并發(fā)給服務(wù)器,這樣服務(wù)器收到了登錄信息和sessionID后就可以確認(rèn)兩件事:一是用來確認(rèn)登錄的客戶端的用戶是驗(yàn)證過的;二是通過session ID服務(wù)器知道將反饋結(jié)果推送到哪個(gè)網(wǎng)頁。
所以針對第一點(diǎn),我們的關(guān)鍵在于,在掃描前要確保用戶是已經(jīng)被驗(yàn)證過且合法的用戶(驗(yàn)證方式可以是用戶名+密碼,也可以是一個(gè)secure key),在選擇是否登錄時(shí)將這個(gè)結(jié)果一并推送到服務(wù)器端,就好了。如果用戶沒有驗(yàn)證是否合法,可以像微信的處理方式一樣直接告訴用戶二維碼不可識(shí)別或提示請先登錄到app。
有了身份驗(yàn)證,那么現(xiàn)在就解決第二個(gè)問題,如何將反饋結(jié)果實(shí)時(shí)地顯示在網(wǎng)頁上呢?有朋友可能會(huì)說,客戶端這邊很簡單發(fā)一個(gè)請求到后臺(tái)就好了,而網(wǎng)頁上用ajax定時(shí)發(fā)送到服務(wù)器端看是否有反饋。我不贊成這種做法,因?yàn)閍jax輪詢方式十分消耗客戶端和服務(wù)器端資源!這里涉及到另一個(gè)技術(shù)-web實(shí)時(shí)推送技術(shù),使用推送技術(shù)可以節(jié)約服務(wù)器端和客戶端的資源,可以穩(wěn)定地推送和接收任何消息。我在實(shí)現(xiàn)的過程中我采用了第三方推送服務(wù)-GoEasy推送,用它是實(shí)現(xiàn)非常簡單,我們項(xiàng)目里的其他功能也用到了GoEasy web實(shí)時(shí)推送服務(wù),所以在此我直接就用的GoEasy推送來將登錄反饋結(jié)果推送到服務(wù)器。我的實(shí)現(xiàn)步驟非常簡單,將傳送的session ID作為客戶端與網(wǎng)頁端的通信channel,網(wǎng)頁端訂閱用session ID作為值得channel,客戶端將驗(yàn)證結(jié)果和session ID發(fā)送到服務(wù)器端,服務(wù)器端可以通過這個(gè)channel主動(dòng)將結(jié)果推送給網(wǎng)頁版!如果客戶端也需要做相應(yīng)的反饋的話,那么客戶端也只需要訂閱這個(gè)channel,然后服務(wù)器端會(huì)同時(shí)將結(jié)果推送給網(wǎng)頁版和客戶端,收到消息后,就可以根據(jù)需求在goeasy的回調(diào)函數(shù)里做你想做的事情了。關(guān)于goeasy推送的使用,大家可以參考這篇博客: http://www.cnblogs.com/jishaochengduo/articles/5552645.html,另外GoEasy推送官網(wǎng)上也有一個(gè)demo:GoEasy二維碼掃碼登錄demo,大家可以去看看效果.
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com