<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuā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)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

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

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:57:52
        文檔

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

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

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

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

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

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

        在多人團(tuán)隊(duì)協(xié)作中,加載資源的代碼需要格外小心。因?yàn)榭赡軙?huì)有多個(gè)開(kāi)發(fā)者在同一業(yè)務(wù)邏輯下調(diào)用,這會(huì)造成資源的重復(fù)加載。

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

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

        // 備忘錄模式: 防止重復(fù)加載
        export const loadWeChatJs = (() => {
         let exists = false; // 打點(diǎn)
         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: 失敗時(shí)候, 可以移除script標(biāo)簽
         script.onload = () => {
         exists = true;
         resolve(window.WxLogin);
         };
         document.body.appendChild(script);
         });
        })();
        
        

        繪制登陸二維碼

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

        // 微信默認(rèn)配置
        const baseOption = {
         self_redirect: true, // true: 頁(yè)內(nèi)iframe跳轉(zhuǎn); false: 新標(biāo)簽頁(yè)打開(kāi) 
         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'; 
         // 處理國(guó)際化
         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通信

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

        毫無(wú)疑問(wèn),第二種交互方式更友好,因?yàn)橐婕安煌?jí)層的頁(yè)面通信,代碼處理也更具挑戰(zhàn)。

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

        // redirect 地址會(huì)被后端拿到, 后端重定向到此地址, 前端會(huì)訪問(wèn)此頁(yè)面
        // redirect 地址中的參數(shù), 是前端人員留給自己使用的; 后端會(huì)根據(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)請(qǐng)求地址
        };
        
        

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

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

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

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

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

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

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

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

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

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

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

        文檔

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

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

        最新推薦

        猜你喜歡

        熱門(mén)推薦

        專(zhuān)題
        Top
        主站蜘蛛池模板: 很黄很黄的网站免费的| 中文在线免费视频| 亚洲精品在线免费观看视频| 永久亚洲成a人片777777| 午夜成人无码福利免费视频| 亚洲色欲久久久久综合网| 久久亚洲国产精品一区二区| 少妇性饥渴无码A区免费| 久久久久亚洲av无码专区导航 | 亚洲人成人网站色www| A级毛片成人网站免费看| 亚洲乱码中文字幕综合| 一个人免费视频在线观看www| 亚洲国产精品福利片在线观看| 亚洲视频免费在线观看| 免费一区二区视频| 亚洲国产av一区二区三区丶| 中文在线免费观看| 久久青青草原亚洲av无码app | 亚洲w码欧洲s码免费| 亚洲最大av无码网址| a色毛片免费视频| 久久久久亚洲av无码专区喷水| 日韩毛片免费无码无毒视频观看 | 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲国产精品丝袜在线观看| 好湿好大好紧好爽免费视频| 亚洲宅男永久在线| 在线观看视频免费国语| 亚洲激情电影在线| 99ee6热久久免费精品6| 亚洲色大成网站www久久九| 久久久高清免费视频| 亚洲日韩国产精品无码av| 精品国产麻豆免费网站| 亚洲欧美日韩中文高清www777| 日韩在线免费视频| 精品一区二区三区无码免费直播| 久久香蕉国产线看观看亚洲片| 无码人妻一区二区三区免费| 本道天堂成在人线av无码免费|