国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

微信網(wǎng)頁授權(quán)+分享踩過的坑

mtunique / 2020人閱讀

摘要:頁面用瀏覽器自帶返回和安卓物理返回死循環(huán)的話,直接看高潮部分背景折磨我兩個工作日加周末一天的問題,我覺得還是有必要記錄一下,為什么程序員總是加班,就是遇到這些意想不到的問題需求領(lǐng)導我想做兩個頁面,放在微信里面可以訪問我簡單啊,用實現(xiàn)產(chǎn)品設計

頁面用瀏覽器自帶返回和安卓物理返回死循環(huán)的話,直接看高潮部分

背景

折磨我兩個工作日加周末一天的問題,我覺得還是有必要記錄一下,為什么程序員總是加班,就是遇到這些意想不到的問題

需求

領(lǐng)導:我想做兩個頁面,放在微信里面可以訪問
我:簡單啊,用H5實現(xiàn)
產(chǎn)品設計中...
產(chǎn)品:好了,看看沒問題就開始開發(fā)吧
我:什么時候多了一個需要獲取用戶信息(產(chǎn)品總是給人驚喜不端)

沒有試過微信授權(quán)這一塊,首先內(nèi)心三連問,能不能拒絕,能不能改需求,能不能通過熟悉的秘方實現(xiàn);然而并沒有什么用(笑哭表情)

開發(fā)中

業(yè)務功能沒什么難點,模擬一個用戶信息,很快就開發(fā)完成了...

微信網(wǎng)頁授權(quán)

官方文檔:https://mp.weixin.qq.com/wiki...

1.登錄自己的服務號?,查看已有的權(quán)限

注意:這里只能是服務號,訂閱號沒有權(quán)限,服務號只能由企業(yè)和組織申請

2.公眾號設置

注意:授權(quán)回調(diào)域名配置規(guī)范為全域名,比如需要網(wǎng)頁授權(quán)的域名為:www.qq.com,配置以后此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行OAuth2.0鑒權(quán)。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com無法進行OAuth2.0...


注意:下載這個文件放在域名對應的根目錄下

3.鏈接的生成

https://open.weixin.qq.com/co...

以訪問www.qq.com/#/detail.html為例,上面第2步的網(wǎng)頁授權(quán)域名設置成 www.qq.com
REDIRECT_URI為encodeURIComponent("http://www.qq.com/#/detail.html")
SCOPE為snsapi_base或snsapi_userinfo,區(qū)別是只獲取用戶id,還是獲取更多用戶信息
state隨便寫吧,以123為例(沒有看出具體有什么用)
其它參數(shù)不變

注意:為什么要用encodeURIComponent,你想想,你在url里面直接寫url,怎么能直接把它解析成參數(shù)

4.放在微信里訪問

把第3步上面生成的鏈接,做為聊天消息,拷貝到微信里面,點擊打開,此時我們用alert(location.href)就會發(fā)現(xiàn),地址變成了http://www.qq.com/?code=生成...

// 獲取url參數(shù)
export function getQueryVariable(variable) {
  const query = window.location.search.substring(1)
  const vars = query.split("&")
  for (let i=0; i

注意:code只能用一次,而且還有時間限制,code插入的位置尤其要注意,不是在
/#/后面,所以用vue或react的路由組件中獲取路由參數(shù)方式是不可行的,老老實實的寫原生js獲取

5.通過code獲取用戶id

code獲取到了以后前端就無能為力了,接下來的步驟只能交給后臺了(數(shù)據(jù)安全性考慮,比如AppSecret不能暴露給前端),自古以來,前端的地位略低于后端,nodejs的出現(xiàn)極大的拯救了前端,雖然后面的事情前端做不了,但我們可以用nodejs或者是類似于postman這種的工具,把后面的接口模擬跑通,然后直接告訴后端,你該調(diào)什么接口,用什么參數(shù),后端文檔都不用看;當然你也可以做個小白紙,什么都拋給后端,讓后端指揮你怎么做(在一個團隊中,各個角色的重要性,就看能做的事情)

網(wǎng)頁授權(quán)就這么搞完了,是不是很簡單(笑哭表情),可以愉快的玩耍了

當我把這個鏈接通過微信右上角分享給同事一起測試時,啪啪打臉了...,呈現(xiàn)的現(xiàn)象
1.通過code獲取用戶id,報錯了
2.分享標題,描述,圖標好丑,我能不能改(好像沒有分享這個需求,但不分享的話,用戶怎么看,我要不要做,沒有這個需求,我要不要把鍋丟給產(chǎn)品,我好方,但僅有的一點點職業(yè)素養(yǎng)告訴我,我還是做吧,做為一個合格的程序員,必備的技能不就是腦補一些產(chǎn)品沒想到需求嗎(笑哭表情))

分析原因:

1.打印出分享的地址alert(location.href),為http://www.qq.com/?code=上一...,微信分享出去的是當前訪問的地址(原滋原味,加了一些防腐劑,多了一個from=xxxx,應該是來源),但我理想中想要的是上面第3中的地址(重定向之前的地址),報錯的原因是同一個code用了兩次

解決思路:
1.自定義分享地址,此時的思路是,地址改成https://open.weixin.qq.com/co... 這種
2.自定義標題,描述和圖片
3.最終方案看下面

微信網(wǎng)頁分享

官方文檔:https://mp.weixin.qq.com/wiki...

1.還是先配置相應的權(quán)限

2.生成簽名(后端做的,前端可以選擇跳過)

這個時候就不得不吐槽微信的文檔了,殘缺了,在第一步就卡住了,只能求助網(wǎng)友,后面我發(fā)現(xiàn)

這里有,IP白名單也要設置,否則是拿不到access_token的,其它的簽名怎么生成的后端照著文檔做就行了

注意點:網(wǎng)頁授權(quán)和分享是兩個完全獨立的模塊,分享的access_token和授權(quán)返回的access_token是完全不一樣的概念

3.前端配置

yarn add weixin-js-sdk

此時我的版本是"weixin-js-sdk": "^1.4.0-test", 微信客戶端的版本是7.0.4,竟然遇到一個大坑

微信官方讓我用最新的接口,我試了很久都沒有調(diào)通,總以為是自己的姿勢不對,后面實在不行了,我試了一下老接口,竟然通了,竟然通了,竟然通了,我想崩潰了

上代碼

wx.config({
    debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,在pc端時會打印出來,不需要的話可以將true改成false。
    appId: data.appid,  // 必填,公眾號的唯一標識
    timestamp: data.timestamp,  // 必填,生成簽名的時間戳
    nonceStr: data.nonceStr,  // 必填,生成簽名的隨機串
    signature: data.signature,  // 必填,簽名
    jsApiList: ["onMenuShareAppMessage","onMenuShareTimeline","onMenuShareQQ","onMenuShareQZone"]
  })

  wx.ready(function () {
    //分享到朋友圈
    wx.onMenuShareTimeline({
      title, // 分享標題
      link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
      imgUrl, // 分享圖標
    })
    //分享給朋友
    wx.onMenuShareAppMessage({
      title, // 分享標題
      desc, // 分享描述
      link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
      imgUrl, // 分享圖標
    })
    //分享到QQ
    wx.onMenuShareQQ({
      title, // 分享標題
      desc, // 分享描述
      link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
      imgUrl, // 分享圖標
    })

    //分享到QQ空間
    wx.onMenuShareQZone({
      title, // 分享標題
      desc, // 分享描述
      link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
      imgUrl, // 分享圖標
    })
  })

注意:
1.data是后臺返回的簽名信息
2.分享鏈接,該鏈接域名必須與當前頁面對應的公眾號JS安全域名一致,公眾號里面配置的是www.qq.com,這里分享的地址只能是以www.qq.com開頭的,和我們理想的https://open.weixin.qq.com/co... 開頭差距很大(怎么授權(quán),好方)

如果只是單純的自定義分享,到這里就結(jié)束了,如果既要分享又要授權(quán),又有問題需要解決了

4.重定向

初始打開地址為:http://www.qq.com/#/detail.html,這個時候不帶code

進入頁面之后。location. (下面都稱為重定向)

頁面地址變成了http://www.qq.com/?code=生成...

用的是同一個頁面,所以需要判斷url有沒有code,來決定是否要執(zhí)行第2步,否則會死循環(huán)

文章寫到這里,已經(jīng)解決了授權(quán)+分享,是不是感覺故事很平穩(wěn),一部好的電影怎么能這么快結(jié)束

高潮(大坑來了)

現(xiàn)象

微信中打開頁面,用安卓的物理返回鍵,點一下返回不了,需要連續(xù)快速點兩下才能退出

分析原因

打開的頁面是不帶code的地址,經(jīng)過重定向后,生成了帶code的地址,此時瀏覽器的歷史記錄中會有兩條記錄,從帶code的地址返回到不帶code的地址,頁面判斷沒有帶code,又會重定向到帶code的頁面,產(chǎn)生了死循環(huán)

解決方案

1.不讓它產(chǎn)生多一條的記錄

首先想到的是location.replace(url), 發(fā)現(xiàn)把url替換成授權(quán)的地址時(https://open.weixin.qq.com/co...),并不會像想象中的那樣工作,還是會有兩條歷史記錄(不清楚微信為什么不解決,還是解決不了)

結(jié)果:失敗

2.代碼控制清除一條歷史記錄

const params = getQueryParams()
const code = sessionStorage.getItem("code")
if (!params.code && !code) {
  let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${yourAppId}&redirect_uri=${encodeURIComponent(location.href)}&response_type=code&scope=snsapi_base&state=1#wechat_redirect`
   window.location.replace(url)
} else if(!code){
   sessionStorage.setItem("code", params.code)
   history.back()
}

搜索了一大圈,看見了這段代碼(來自:https://www.cnblogs.com/wonyu...),仿佛看見了光,里面比較講究的就是
sessionStorage(只在當前會話有效),用當前會話窗口儲存的code,來判斷不帶code的頁面要不要重定向

看似很完美的代碼,還是逃不過微信的大坑,通過鏈接進入時,偶爾會遇到頁面空白

原因:

上面用到的歷史記錄返回,頁面不刷新(偶爾),我嘗試過強制微信瀏覽器刷新,甚至懷疑是vue的坑,然后用原生寫了一段js來操作dom,并沒有什么用

最后發(fā)現(xiàn)返回的時候,js都能正常的執(zhí)行,UI不重新渲染,UI不重新渲染,UI不重新渲染,偶爾出現(xiàn),不是必現(xiàn),我再次好方

結(jié)果:偶爾失敗

3.返回兩次,才能退出

借鑒上面的思路,判斷當前會話窗口儲存的code是否有值,有值就不重定向

結(jié)果:解決了偶爾不渲染的問題和死循環(huán)的問題,但對于有輕微強迫癥的我來說,需要點兩次才能返回還是挺難接受的

本來屬于愉快的周末,就在微信這個大坑里結(jié)束了,關(guān)上電腦,沉思一會(想想如何說服測試同學這個問題解決不了,是微信的坑(笑哭表情))

結(jié)尾

處女座最大的悲哀就是心里不能放事情,總感覺不踏實,休息也休息不好(悲哀)

突然想到前段時間開發(fā)的app,自己控制過android的返回,微信會不會也提供了自定義返回呢,經(jīng)過一大堆的搜索,發(fā)現(xiàn)js就有能監(jiān)聽瀏覽器返回的事件(有些知識點不用,慢慢就忘了),兜兜轉(zhuǎn)轉(zhuǎn)了一大圈,至少用我的周末幫大家證明了網(wǎng)上說的很多方式行不通,哈哈哈,終極解決,上代碼(vue的思路)

  created () { // 當前需要直接退出的頁面
    window.history.pushState("_android_back", null, location.href)
    window.addEventListener("popstate", this.popstate, false)
  },
  destroyed: function () { // 記得清除,不然單頁面,其它頁面也可以用
    window.removeEventListener("popstate", this.popstate, false)
  },
  methods: {
    popstate () {
      wx.closeWindow() // 微信網(wǎng)頁退出
    }
  }

注意:為什么要多window.history.pushState(null, null, "")這句代碼,因為popstate只能監(jiān)聽pushState創(chuàng)建的

備注:微信的文檔會更新,當你使用時(看一下這篇文章的出生時間),最好參考官方文檔,如果你覺得有一點幫助了你,請點個贊(程序員寫文章不容易,最煩寫這種隨時可能過時的文章,哈哈哈)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104001.html

相關(guān)文章

  • 搭建風控系統(tǒng)道路上踩過的坑01-信息采集 | 一個CPO的心得分享

    摘要:所以,把本人踩過的一些坑在這里分享出來,讓準備搭建風控的人心里有個數(shù)。結(jié)語信息采集往往是實施風控的最難的一個環(huán)節(jié),但也是最重要的環(huán)節(jié),覆蓋質(zhì)量時效都決定了項目的成敗。 showImg(https://segmentfault.com/img/bVEcg5?w=900&h=658); 作者前言 從業(yè)近10年,大大小小參與了3家公司不同領(lǐng)域的風控系統(tǒng)的設計,從前到后把風控系統(tǒng)所有環(huán)節(jié)都細細...

    dailybird 評論0 收藏0
  • 搭建風控系統(tǒng)道路上踩過的坑01-信息采集 | 一個CPO的心得分享

    摘要:所以,把本人踩過的一些坑在這里分享出來,讓準備搭建風控的人心里有個數(shù)。結(jié)語信息采集往往是實施風控的最難的一個環(huán)節(jié),但也是最重要的環(huán)節(jié),覆蓋質(zhì)量時效都決定了項目的成敗。 showImg(/img/bVEcg5?w=900&h=658); 作者前言 從業(yè)近10年,大大小小參與了3家公司不同領(lǐng)域的風控系統(tǒng)的設計,從前到后把風控系統(tǒng)所有環(huán)節(jié)都細細的琢磨過,然而至今仍然感覺剛剛一只腳踏進門而已。...

    Kylin_Mountain 評論0 收藏0
  • 搭建風控系統(tǒng)道路上踩過的坑01-信息采集 | 一個CPO的心得分享

    摘要:所以,把本人踩過的一些坑在這里分享出來,讓準備搭建風控的人心里有個數(shù)。結(jié)語信息采集往往是實施風控的最難的一個環(huán)節(jié),但也是最重要的環(huán)節(jié),覆蓋質(zhì)量時效都決定了項目的成敗。 showImg(https://segmentfault.com/img/bVEcg5?w=900&h=658); 作者前言 從業(yè)近10年,大大小小參與了3家公司不同領(lǐng)域的風控系統(tǒng)的設計,從前到后把風控系統(tǒng)所有環(huán)節(jié)都細細...

    maxmin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<