好久沒(méi)寫(xiě)blog了供鸠,今天微信終于讓我忍不住上來(lái)寫(xiě)一篇。
項(xiàng)目中要在微信底下開(kāi)發(fā)單頁(yè)應(yīng)用(SPA)缔杉,前端技術(shù)選型用的vuejs+vue-router扑馁,vue-router使用hashbang模式(使用hashbang也是為了避免微信jssdk的wx.config簽名的坑)。在調(diào)用微信支付的時(shí)候遇到提示“URL未注冊(cè)”黍翎,這通常是因?yàn)闆](méi)有在微信支付后臺(tái)正確配置授權(quán)目錄的問(wèn)題面徽,但我所遇到的并非如此。
我們的應(yīng)用中有3個(gè)頁(yè)面用到微信支付:
1
2
3
http://example.com/#!/cart/index
http://example.com/#!/order/orderlist
http://example.com/#!/order/orderinfo
微信支付允許配置3個(gè)目錄為授權(quán)目錄匣掸,另外允許配置一個(gè)測(cè)試環(huán)境目錄趟紊,授權(quán)目錄必須配置到最后一級(jí)目錄,配置在根目錄不行碰酝。到這里其實(shí)還都不是問(wèn)題霎匈,問(wèn)題是微信判斷當(dāng)前路徑的方式。
我們先定義兩個(gè)名詞:首先把當(dāng)前頁(yè)面叫做“Current Page”送爸;當(dāng)我們從微信別的地方點(diǎn)擊鏈接呼出微信瀏覽器時(shí)所落在的頁(yè)面唧躲、或者點(diǎn)擊微信瀏覽器的刷新按鈕時(shí)所刷新的頁(yè)面,我們叫做“Landing Page”碱璃。舉個(gè)例子弄痹,我們從任何地方點(diǎn)擊鏈接進(jìn)入頁(yè)面A,然后依次瀏覽到B嵌器、C肛真、D,那么Current Page就是D爽航,而Landing Page是A蚓让,如果此時(shí)我們?cè)贒頁(yè)面點(diǎn)擊一下瀏覽器的刷新按鈕,那么Landing Page就變成了D(以上均是在單頁(yè)應(yīng)用的環(huán)境下讥珍,即以hashbang模式通過(guò)js更改瀏覽器路徑历极,直接href跳轉(zhuǎn)的不算)。
問(wèn)題來(lái)了衷佃,在ios和安卓下呼出微信支付的時(shí)候趟卸,微信支付判斷當(dāng)前路徑的規(guī)則分別是:
IOS:Landing Page
安卓:Current Page
這個(gè)規(guī)則是我試了N次試出來(lái)的,非常的坑氏义,這就意味著锄列,在ios環(huán)境下,任何一個(gè)頁(yè)面都有可能成為支付頁(yè)面(因?yàn)槲覠o(wú)法預(yù)知和控制用戶在哪個(gè)頁(yè)面點(diǎn)微信瀏覽器的刷新按鈕惯悠,或是用戶通過(guò)哪個(gè)連接從外部進(jìn)入到系統(tǒng))邻邮。我在網(wǎng)上用了各種方式搜索這個(gè)問(wèn)題的解決方案,都沒(méi)找到好的克婶,有關(guān)這個(gè)問(wèn)題的帖子都少之又少筒严,都只有吐槽它而沒(méi)有解決了的丹泉。
我把這個(gè)問(wèn)題放了好幾天,雖然有一個(gè)解決方案鸭蛙,就是進(jìn)入到支付頁(yè)面的時(shí)候使用href跳轉(zhuǎn)的方式嘀掸,會(huì)造成頁(yè)面刷新,影響一些用戶體驗(yàn)规惰。就是因?yàn)檫@個(gè)方案不完美睬塌,我就一直擱著,今天呢就又把這個(gè)問(wèn)題拿出來(lái)鼓搗歇万。
今天不知道怎么來(lái)了靈感揩晴,尋思我靠這個(gè)不對(duì)啊,
1
http://example.com/#!/cart/index
這個(gè)頁(yè)面的目錄應(yīng)該是
1
http://example.com/
井號(hào)“#”后面應(yīng)該都忽略才對(duì)贪磺。于是乎硫兰,我想了想,反正入口文件就是個(gè)靜態(tài)html寒锚,服務(wù)器端也不直接接收query劫映,于是就把鏈接改成了
1
http://example.com/?#!/cart/index
就加了一個(gè)問(wèn)號(hào),于是微信瀏覽器妥妥的把井號(hào)“#”后面的內(nèi)容給去掉了刹前,(╯‵□′)╯︵┻━┻