摘要:頁面用瀏覽器自帶返回和安卓物理返回死循環(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用了兩次
解決思路:
微信網(wǎng)頁分享
1.自定義分享地址,此時的思路是,地址改成https://open.weixin.qq.com/co... 這種
2.自定義標題,描述和圖片
3.最終方案看下面官方文檔: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
摘要:所以,把本人踩過的一些坑在這里分享出來,讓準備搭建風控的人心里有個數(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é)都細細...
摘要:所以,把本人踩過的一些坑在這里分享出來,讓準備搭建風控的人心里有個數(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é)都細細的琢磨過,然而至今仍然感覺剛剛一只腳踏進門而已。...
摘要:所以,把本人踩過的一些坑在這里分享出來,讓準備搭建風控的人心里有個數(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é)都細細...
閱讀 594·2021-11-18 13:12
閱讀 1314·2021-11-15 11:39
閱讀 2473·2021-09-23 11:22
閱讀 6194·2021-09-22 15:15
閱讀 3655·2021-09-02 09:54
閱讀 2310·2019-08-30 11:10
閱讀 3245·2019-08-29 14:13
閱讀 2913·2019-08-29 12:49