Vue微信公眾號開發(fā)踩坑記錄

需求

  • 微信授權(quán)登錄(基于公眾號的登錄方案)
  • 接入JS-SDK實現(xiàn)圖片上傳,分享等功能

現(xiàn)狀及難點

  • 采用的Vue框架同眯,前后端分離模式(vue工程僅作為客戶端)南蓬,用戶通過域名訪問的是客戶端调炬,但是微信授權(quán)中涉及簽名和token校驗依賴服務端
  • JS-SDK需要向服務端獲取簽名语盈,且獲取簽名中需要的參數(shù)包括所在頁面的url,但由于單頁應用的路由特殊缰泡,其中涉及到iOS和android微信客戶端瀏覽器內(nèi)核的差異性導致的兼容問題

解決方案

授權(quán)登錄

本人將授權(quán)流程設(shè)計如下:


此處輸入圖片的描述
此處輸入圖片的描述

詳細說明:

  1. 用戶訪問網(wǎng)站主域名
  2. vue客戶端(domain/)接收請求刀荒,在路由解析前判斷用戶是否登錄(比如檢查cookie);
  3. 如果沒有登錄棘钞,則通過api獲取微信授權(quán)地址缠借,獲取后跳轉(zhuǎn)到微信授權(quán)頁面;
  4. 用戶確認授權(quán)宜猜,微信服務器發(fā)起回調(diào)請求烈炭,這時回調(diào)到服務器端(domain/api/xxx)
  5. 服務器端保存用戶信息,進行注冊登錄操作(記錄cookie)宝恶,重定向到vue客戶端(domain/)
  6. 重復第一步,授權(quán)登錄成功

踩坑記錄:
以下是另一個授權(quán)方案


此處輸入圖片的描述
此處輸入圖片的描述

其實如果只實現(xiàn)授權(quán)登錄到話趴捅,這個方案是可以的垫毙,而且也很清晰,vue客戶端單方面在服務器和微信服務器之間進行通信拱绑,微信服務器不能直接和服務器通信综芥。這種方案的坑在于當微信授權(quán)回調(diào)時會攜帶一個code參數(shù),該參數(shù)會污染vue路由導致ios上進行JS-SDK簽名時失斄圆Α(后續(xù)會具體描述這個問題)

JS-SDK簽名

對于簽名膀藐,官方是這么說的

所有需要使用JS-SDK的頁面必須先注入配置信息屠阻,否則將無法調(diào)用(同一個url僅需調(diào)用一次,對于變化url的SPA的web app可在每次url變化時進行調(diào)用

vue中路由有history和hash兩種模式额各;在history模式下国觉,理想的設(shè)計方案是,當進入到需要用到JS-SDK組件時虾啦,獲取以下當前url(也就是通過 location.href.split(‘#’)[0]獲得到的地址)傳遞到服務端進行簽名麻诀,應該就沒問題了,但是IOS獲取的url并不是調(diào)用微信js的時候所在頁面的地址傲醉,而是進入到網(wǎng)站第一個頁面的地址蝇闭。

網(wǎng)上查詢到一個方案是針對ios設(shè)備進入頁面時先將當前url記錄下來,到授權(quán)頁面時將記錄的url傳遞給服務端進行簽名硬毕。該方案經(jīng)實踐是可行的呻引,媽媽再也不用擔心我的網(wǎng)址很丑很難看啦。

另外一個方案就是使用hash模式吐咳,這種模式下逻悠,url永遠都只是主域名地址,省去了傳遞url的煩惱挪丢,也沒必要處理兼容蹂风,所以如果不建議路由中有#的話,該方案應該是首選方案乾蓬。

這里還有一個深坑惠啄,那就是如果授權(quán)方案采用了上述中的vue客戶端處理回調(diào)的方式,那么ios將永遠無法簽名成功任内,為什么呢撵渡,因為這種方案路由通常是這樣子的:

http://domain.com/?code=xxxxxx&stat=#/xxx

這種路由中帶了參數(shù)的url是沒法簽名校驗成功的!
這種路由中帶了參數(shù)的url是沒法簽名校驗成功的死嗦!
這種路由中帶了參數(shù)的url是沒法簽名校驗成功的趋距!
重要的事情得說三遍啊
在我另外一篇文章中對js-sdk簽名做了更多的介紹,可以移步到vue微信公眾號開發(fā)踩坑記錄(2)

Coding

任何不上代碼的吹逼都是耍流氓越除,這里筆者分享下在vue中具體怎么coding的节腐。

微信授權(quán)登錄

筆者在項目中使用的vue-router進行路由控制,使用了vuex記錄用戶登錄信息摘盆,但是由于vuex中存儲的內(nèi)容在頁面刷新后會丟失翼雀,所以服務端同時也寫了用戶登錄狀態(tài)到cookie中,vue中需要通過這兩個條件進行登錄判斷孩擂,不多BB狼渊,直接看代碼吧

// ... other code

router.beforeEach((to, from, next) => {
  if ((!VueCookie.get('user') && !store.state.userInfo)) {
    // 第一次訪問
    console.log('授權(quán)登錄')
    // 跳轉(zhuǎn)到微信授權(quán)頁面,微信授權(quán)地址通過服務端獲得
    axios.post('/api/login').then(res => {
      var data = res.data
      if (data.code === 100) {
        window.location.href = data.data
      }
    })
  } else if (!store.state.userInfo) {
    // 刷新頁面类垦,獲取數(shù)據(jù)存入vuex
    axios.get('/api/currentuser').then(res => {
      if (res.data.code === 100) {
        store.dispatch('setUserInfo', res.data.data)
        next()
      }
    })
    console.log('cookie生效期內(nèi)登錄')
    next()
  } else {
    // 已經(jīng)登錄
    console.log('已登錄')
    next()
  }
})

//... other code

history模式下的JS-SDK簽名

在入口文件中將當前url存入vuex

// ... other code
router.beforeEach((to, from, next) => {
  document.title = to.meta.title
  // 處理jssdk簽名,兼容history模式
  if (!store.state.url) {
    store.commit('setUrl', document.URL)
  }
  // ... other code

在需要獲取簽名的組件中獲取并進行配置

// ... other code
created () {
      var sef = this
      var url = ''
      // 判斷是否是ios微信瀏覽器
      if (window.__wxjs_is_wkwebview === true) {
        url = this.$store.state.url.split('#')[0]
      } else {
        url = window.location.href.split('#')[0]
      }
      this.$http.get('/api/jssdk?url=' + url).then(function (res) {
        sef.lists = res.data.data
        hmTools.wechact(sef.lists, sef) //js-sdk配置
      })
    }
// ...other code

結(jié)語

由于本人文筆一般狈邑,思維的表達估計不到位城须,見解也是淺嘗輒止,所以如果看官您有疑惑的地方或者有歧義歡迎來和本人交流米苹。為了方便大家互相溝通糕伐,本人也創(chuàng)建了一個vue公眾號開發(fā)的qq群,歡迎加入和大家一起分享開發(fā)心得驱入,qq群號:130903919

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赤炒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖讯壶,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遵岩,居然都是意外死亡,警方通過查閱死者的電腦和手機巡通,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門尘执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宴凉,你說我怎么就攤上這事誊锭。” “怎么了弥锄?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵丧靡,是天一觀的道長。 經(jīng)常有香客問我籽暇,道長温治,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任戒悠,我火速辦了婚禮熬荆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绸狐。我一直安慰自己卤恳,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布寒矿。 她就那樣靜靜地躺著纬黎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劫窒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天拆座,我揣著相機與錄音主巍,去河邊找鬼冠息。 笑死,一個胖子當著我的面吹牛孕索,可吹牛的內(nèi)容都是我干的逛艰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼搞旭,長吁一口氣:“原來是場噩夢啊……” “哼散怖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肄渗,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镇眷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翎嫡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欠动,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年惑申,在試婚紗的時候發(fā)現(xiàn)自己被綠了具伍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡圈驼,死狀恐怖人芽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绩脆,我是刑警寧澤萤厅,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站衙伶,受9級特大地震影響祈坠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矢劲,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一赦拘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芬沉,春花似錦躺同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黄刚,卻和暖如春捎谨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工涛救, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畏邢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓检吆,卻偏偏與公主長得像舒萎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹭沛,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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