• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    微信網(wǎng)頁登錄邏輯與實現(xiàn)方法

    來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 21:57:52
    文檔

    微信網(wǎng)頁登錄邏輯與實現(xiàn)方法

    微信網(wǎng)頁登錄邏輯與實現(xiàn)方法:現(xiàn)在的網(wǎng)站開發(fā),都繞不開微信登錄(畢竟微信已經(jīng)成為國民工具)。雖然文檔已經(jīng)寫得很詳細,但是對于沒有經(jīng)驗的開發(fā)者還是容易踩坑。 所以,專門記錄一下微信網(wǎng)頁認證的交互邏輯,也方便自己日后回查: 加載微信網(wǎng)頁sdk 繪制登陸二維碼:新tab頁面繪制 /
    推薦度:
    導讀微信網(wǎng)頁登錄邏輯與實現(xiàn)方法:現(xiàn)在的網(wǎng)站開發(fā),都繞不開微信登錄(畢竟微信已經(jīng)成為國民工具)。雖然文檔已經(jīng)寫得很詳細,但是對于沒有經(jīng)驗的開發(fā)者還是容易踩坑。 所以,專門記錄一下微信網(wǎng)頁認證的交互邏輯,也方便自己日后回查: 加載微信網(wǎng)頁sdk 繪制登陸二維碼:新tab頁面繪制 /

    現(xiàn)在的網(wǎng)站開發(fā),都繞不開微信登錄(畢竟微信已經(jīng)成為國民工具)。雖然文檔已經(jīng)寫得很詳細,但是對于沒有經(jīng)驗的開發(fā)者還是容易踩坑。

    所以,專門記錄一下微信網(wǎng)頁認證的交互邏輯,也方便自己日后回查:

    1. 加載微信網(wǎng)頁sdk
    2. 繪制登陸二維碼:新tab頁面繪制 / 本頁面iframe繪制
    3. 用戶掃碼登陸,前端跳入回調(diào)網(wǎng)址
    4. 回調(diào)網(wǎng)址進一步做邏輯處理,如果是頁內(nèi)iframe繪制二維碼,需要通知頂級頁

    微信網(wǎng)頁SDK加載

    在多人團隊協(xié)作中,加載資源的代碼需要格外小心。因為可能會有多個開發(fā)者在同一業(yè)務(wù)邏輯下調(diào)用,這會造成資源的重復(fù)加載。

    處理方法有兩種,第一種是對外暴露多余接口,專門check是否重復(fù)加載。但是考慮到調(diào)用者每次在加載前,都需要顯式調(diào)用check()方法進行檢查,難免會有遺漏。

    所以采用第二種方法--設(shè)計模式中的緩存模式,代碼如下:

    // 備忘錄模式: 防止重復(fù)加載
    export const loadWeChatJs = (() => {
     let exists = false; // 打點
     const src = '//res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'; // 微信sdk網(wǎng)址
    
     return () => new Promise((resolve, reject) => {
     // 防止重復(fù)加載
     if(exists) return resolve(window.WxLogin);
     
     let script = document.createElement('script');
     script.src = src;
     script.type = 'text/javascript';
     script.onerror = reject; // TODO: 失敗時候, 可以移除script標簽
     script.onload = () => {
     exists = true;
     resolve(window.WxLogin);
     };
     document.body.appendChild(script);
     });
    })();
    
    

    繪制登陸二維碼

    根據(jù)《微信登陸開發(fā)指南》,將參數(shù)傳遞給window.WxLogin()即可。

    // 微信默認配置
    const baseOption = {
     self_redirect: true, // true: 頁內(nèi)iframe跳轉(zhuǎn); false: 新標簽頁打開 
     id: 'wechat-container', 
     appid: 'wechat-appid',
     scope: 'snsapi_login',
     redirect_uri: encodeURIComponent('//1.1.1.1/'),
     state: '',
    };
    
    export const loadQRCode = (option, intl = false, width, height) => {
     const _option = {...baseOption, ...option};
    
     return new Promise((resolve, reject) => {
     try {
     window.WxLogin(_option);
     const ele = document.getElementById(_option['id']);
     const iframe = ele.querySelector('iframe');
     iframe.width = width? width : '300';
     iframe.height = height? height : '420'; 
     // 處理國際化
     intl && (iframe.src = iframe.src + '&lang=en');
     resolve(true);
     } catch(error) {
     reject(error);
     }
     });
    };
    
    

    在需要使用的業(yè)務(wù)組件中,可以在周期函數(shù)componentDidMount調(diào)用,下面是demo代碼:

    componentDidMount() {
     const wxOption = {
     // ...
     };
     loadWeChatJs()
     .then(WxLogin => loadQRCode(wxOption))
     .catch(error => console.log(`Error: ${error.message}`)); 
    }
    

    回調(diào)網(wǎng)址與iframe通信

    這一塊我覺得是微信登陸交互中最復(fù)雜和難以理解的一段邏輯。開頭有講過,微信二維碼渲染有2中方式,一種是打開新的標簽頁,另一種是在指定id的容器中插入iframe。

    毫無疑問,第二種交互方式更友好,因為要涉及不同級層的頁面通信,代碼處理也更具挑戰(zhàn)。

    為了方便說明,請先看模擬的數(shù)據(jù)配置:

    // redirect 地址會被后端拿到, 后端重定向到此地址, 前端會訪問此頁面
    // redirect 地址中的參數(shù), 是前端人員留給自己使用的; 后端會根據(jù)業(yè)務(wù)需要, 添加更多的字段, 然后一起返回前端
    const querystr = '?' + stringify({
     redirect: encodeURIComponent(`${window.location.origin}/account/redirect?` + stringify({
     to: encodeURIComponent(window.location.origin),
     origin: encodeURIComponent(window.location.origin),
     state: 'login'
     })),
     type: 'login'
    });
    
    const wxOption = {
     id: 'wechat-container',
     self_redirect: true,
     redirect_uri: encodeURIComponent(`//1.1.1.1/api/socials/weixin/authorizations${querystr}`) // 微信回調(diào)請求地址
    };
    
    

    前后端、微信服務(wù)器、用戶端交互邏輯

    按照上面的配置,我描述一下前端、用戶端、微信服務(wù)器和后端交互的邏輯:

  • 前端根據(jù)wxOption加載了二維碼,所有信息都放在了二維碼中。同時監(jiān)聽微信服務(wù)器的消息。
  • 用戶手機掃碼,通知微信服務(wù)器確定登陸。
  • 微信服務(wù)器接受到用戶的掃碼請求,轉(zhuǎn)發(fā)給前端。
  • 前端收到微信服務(wù)器傳來消息,根據(jù)wxOption的redirect_uri參數(shù),跳轉(zhuǎn)到此url地址。注意:
  • 這個接口地址是后端的,請求方式是GET
  • 前端通過拼接params攜帶參數(shù)
  • 地址會被拼接微信服務(wù)器傳來的一個臨時token,用于交給后端換取用戶公眾密鑰
  • 后端接收到/api/socials/weixin/authorizations${querystr}的請求,decode解碼querystr中的信息。然后向微信服務(wù)端請求用戶公眾密鑰。根絕前后端的約定(demo中用的是redirect字段),重定向到前端指定的redirect字段,并且拼接用戶公眾密鑰等更多信息。
  • 前端知悉重定向,跳到重定向的路由(demo中用的是/account/redirect)
  • 在對應(yīng)的路由處理后端傳來的用戶密鑰等數(shù)據(jù)即可
  • 至此,微信認證的四端交互邏輯完成
  • 跨Iframe通信

    前面流程走完了,現(xiàn)在的情況是頁面中iframe的二維碼區(qū)域,已經(jīng)被替換成了/account/redirect?...的內(nèi)容。

    為了實現(xiàn)通信,需要在頁面的周期中監(jiān)聽message事件,并在組件卸載時,卸載此事件:

    componentDidMount() {
     // ... ...
     
     window.addEventListener('message', this.msgReceive, false);
    }
    
    componentWillUnmount() {
     window.removeEventListener('message', this.msgReceive);
    }
    
    msgReceive(event) {
     // 監(jiān)測是否是安全iframe
     if(!event.isTrusted) {
     return;
     }
     console.log(event.data); // 獲取iframe中傳來的數(shù)據(jù), 進一步進行邏輯處理
    }
    
    

    而在/account/redirect?...路由對應(yīng)的組件中,我們需要解析路由中的params參數(shù),按照業(yè)務(wù)邏輯檢查后,將結(jié)果傳遞給前面的頁面:

    componentDidMount() {
     // step1: 獲取url中params參數(shù)
     const querys = getQueryVariable(this.props.location.search);
     // step2: 檢查querys中的數(shù)據(jù)是否符合要求 ... 
     // step3: 向頂級頁面?zhèn)鬟f消息
     return window.parent && window.parent.postMessage('data', '*');
    }
    

    至此,微信網(wǎng)頁認證的流程完成。

    更多:關(guān)于iframe通信的更多細節(jié),請查看MDN的文檔

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    微信網(wǎng)頁登錄邏輯與實現(xiàn)方法

    微信網(wǎng)頁登錄邏輯與實現(xiàn)方法:現(xiàn)在的網(wǎng)站開發(fā),都繞不開微信登錄(畢竟微信已經(jīng)成為國民工具)。雖然文檔已經(jīng)寫得很詳細,但是對于沒有經(jīng)驗的開發(fā)者還是容易踩坑。 所以,專門記錄一下微信網(wǎng)頁認證的交互邏輯,也方便自己日后回查: 加載微信網(wǎng)頁sdk 繪制登陸二維碼:新tab頁面繪制 /
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品JIZZ在线观看老狼| 国产在线精品一区二区三区不卡 | 青青青国产精品国产精品久久久久 | 亚洲国产精品成人| 九九热在线精品视频| 亚洲AV午夜福利精品一区二区| 国产高清在线精品一区二区| 大伊香蕉精品视频在线导航| 欧美精品欧美人与动人物牲交| 精品无码久久久久久久动漫| 91久久精品国产成人久久| 国产精品网站在线观看| 亚洲国产精品狼友中文久久久 | 久久国产精品无码一区二区三区 | 国产第一福利精品导航| 日韩精品无码一区二区三区不卡| 久久国产精品免费| 国产成人精品一区二三区在线观看| 91精品全国免费观看青青| 欧美精品v欧洲精品| 亚洲国产美女精品久久久久∴| 人妻偷人精品成人AV| 久99久无码精品视频免费播放| 99精品国产成人一区二区| 亚洲精品高清国产一久久| 国产精品亚洲欧美一区麻豆| 国产成人精品久久一区二区三区| 久久久精品2019免费观看| 色久综合网精品一区二区| 中文字幕日韩精品无码内射| 久久99国内精品自在现线| 夜夜高潮夜夜爽国产伦精品| 日韩精品欧美| 亚洲国产av无码精品| 人妻精品久久久久中文字幕| 久久国产香蕉一区精品| 久久国产精品二国产精品| 日本熟妇亚洲欧美精品区| 亚洲精品动漫免费二区 | 中文精品一卡2卡3卡4卡| 杨幂国产精品福利在线观看|