亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信網頁登錄邏輯與實現方法

2020-03-21 15:58:35
字體:
來源:轉載
供稿:網友

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

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

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

微信網頁SDK加載

在多人團隊協作中,加載資源的代碼需要格外小心。因為可能會有多個開發者在同一業務邏輯下調用,這會造成資源的重復加載。

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

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

// 備忘錄模式: 防止重復加載export const loadWeChatJs = (() => { let exists = false; // 打點 const src = '//res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'; // 微信sdk網址 return () => new Promise((resolve, reject) => {  // 防止重復加載  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); });})();

繪制登陸二維碼

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

// 微信默認配置const baseOption = { self_redirect: true, // true: 頁內iframe跳轉; 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);  } });};

在需要使用的業務組件中,可以在周期函數componentDidMount調用,下面是demo代碼:

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

回調網址與iframe通信

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

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

為了方便說明,請先看模擬的數據配置:

// redirect 地址會被后端拿到, 后端重定向到此地址, 前端會訪問此頁面// redirect 地址中的參數, 是前端人員留給自己使用的; 后端會根據業務需要, 添加更多的字段, 然后一起返回前端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}`) // 微信回調請求地址};

前后端、微信服務器、用戶端交互邏輯

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

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

跨Iframe通信

前面流程走完了,現在的情況是頁面中iframe的二維碼區域,已經被替換成了/account/redirect?...的內容。

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

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

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

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

至此,微信網頁認證的流程完成。

更多:關于iframe通信的更多細節,請查看MDN的文檔

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩的一区二区| 国产成人综合亚洲| 最新的欧美黄色| 国产成人福利夜色影视| 国产精品久久电影观看| 一区二区日韩精品| 欧美三级xxx| 91在线观看免费高清| 久久这里有精品| 91精品视频专区| 日韩电影网在线| 欧美日韩一区二区在线播放| 日韩一区二区在线视频| 亚洲一区二区中文字幕| 国产日韩在线亚洲字幕中文| 麻豆国产va免费精品高清在线| 亚洲综合中文字幕68页| 中文一区二区视频| 欧美激情高清视频| 91免费电影网站| 中国china体内裑精亚洲片| 欧美综合一区第一页| 91夜夜未满十八勿入爽爽影院| 久久国产精品影视| 欧美精品在线极品| 日韩a**中文字幕| 亚洲美女久久久| 一本色道久久88综合亚洲精品ⅰ| 奇米影视亚洲狠狠色| 欧美猛交ⅹxxx乱大交视频| 亚洲xxxxx电影| 亚洲欧美日本伦理| 久久久999精品视频| 国产偷亚洲偷欧美偷精品| 久久久久久久久久久久久久久久久久av| www.亚洲天堂| 亚洲mm色国产网站| 91色在线观看| 久久亚洲精品一区| 精品无人区太爽高潮在线播放| 亚洲精品乱码久久久久久按摩观| 精品久久久久久国产91| 欧美性高跟鞋xxxxhd| 成人免费视频97| 在线观看日韩专区| 国产一区二区三区久久精品| 日韩在线观看免费全| 麻豆乱码国产一区二区三区| 欧美www视频在线观看| 亚洲国产天堂久久国产91| 日本高清+成人网在线观看| 国产女人18毛片水18精品| 国产精品日韩av| 国产99久久久欧美黑人| 亚洲国产精品va在线观看黑人| 国产精品色婷婷视频| 国产91在线播放九色快色| 国产亚洲在线播放| 国产精品久久精品| 亚洲自拍偷拍第一页| 色综合影院在线| 国产日韩精品电影| 亚洲韩国日本中文字幕| 久热精品视频在线观看一区| 亚洲国产精品成人va在线观看| 午夜免费在线观看精品视频| 国产成人aa精品一区在线播放| 日韩毛片在线观看| 久久99青青精品免费观看| 91极品女神在线| 亚洲欧美视频在线| 欧美男插女视频| 精品国产电影一区| 激情成人在线视频| 日韩视频中文字幕| 亚洲午夜精品久久久久久久久久久久| 国产精品v日韩精品| 国产欧美日韩高清| 国产精品亚洲一区二区三区| 国产精品ⅴa在线观看h| 久久久久国产视频| 中文字幕在线看视频国产欧美在线看完整| 欧美成年人网站| 2020国产精品视频| 欧美福利视频网站| 亚洲男人的天堂网站| 亚洲午夜小视频| 久久久在线观看| 国模极品一区二区三区| 中文欧美日本在线资源| 亚洲欧美中文字幕在线一区| 亚洲第一天堂无码专区| 亚洲专区国产精品| 亚洲欧美一区二区三区在线| 综合国产在线观看| 日韩精品久久久久| 国产精品久久久久91| 欧美激情乱人伦一区| 亚洲人精选亚洲人成在线| 国产三级精品网站| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩美女在线| 色哟哟入口国产精品| 国产成人aa精品一区在线播放| 久久91亚洲人成电影网站| 国产视频丨精品|在线观看| 亚洲黄色片网站| 亚洲最新av在线网站| 欧美精品在线免费| 亚洲午夜色婷婷在线| www日韩中文字幕在线看| 91久久精品国产| 中文字幕亚洲综合| 国产精品96久久久久久又黄又硬| 国产精品免费一区豆花| 欧美性极品xxxx做受| 国产精品7m视频| 丝袜美腿亚洲一区二区| 日韩精品欧美国产精品忘忧草| 日韩专区中文字幕| 国产精品成人在线| 成人黄色免费在线观看| 美女国内精品自产拍在线播放| 亚洲精品91美女久久久久久久| 日韩免费观看在线观看| 欧美一级视频免费在线观看| 久久免费精品视频| 日本高清+成人网在线观看| 在线色欧美三级视频| 国产精品ⅴa在线观看h| 亚洲国产欧美久久| 亚洲欧美国产高清va在线播| 国产ts一区二区| 97视频免费在线观看| 亚洲自拍偷拍网址| 91超碰中文字幕久久精品| 亚洲国产精品yw在线观看| 亚洲自拍在线观看| 欧美日韩在线视频首页| 欧美猛交ⅹxxx乱大交视频| 国产美女被下药99| 97人人爽人人喊人人模波多| 亚洲成人中文字幕| 一区二区三区无码高清视频| 91精品国产乱码久久久久久久久| 亚洲女人天堂色在线7777| 国产欧美日韩中文字幕在线| 久久国产精品久久久久久| 97涩涩爰在线观看亚洲| 欧美一级视频免费在线观看| 3344国产精品免费看| 永久555www成人免费| 欧美黑人xxxⅹ高潮交| xxx一区二区| 国产成人91久久精品| 国产精品成人va在线观看| 久久精品电影网| 国产一区二区黄| 992tv成人免费视频| 欧美日韩国产丝袜另类| 国产一区二区在线免费| 综合欧美国产视频二区| 欧美巨乳在线观看| www.欧美视频|