原文摘自:http://www.tuicool.com/articles/mQ7RRfb
? ? ? ?項目中要在微信底下開發(fā)單頁應(yīng)用(SPA),前端技術(shù)選型用的vuejs+vue-router怀浆,vue-router使用hashbang模式(使用hashbang也是為了避免微信jssdk的wx.config簽名的坑)。在調(diào)用微信支付的時候遇到提示“URL未注冊”扰路,這通常是因為沒有在微信支付后臺正確配置授權(quán)目錄的問題猾骡,但我所遇到的并非如此。
我們的應(yīng)用中有3個頁面用到微信支付:
http://example.com/#!/cart/index
http://example.com/#!/order/orderlist
http://example.com/#!/order/orderinfo
? ? ? ?微信支付允許配置3個目錄為授權(quán)目錄靶草,另外允許配置一個測試環(huán)境目錄担猛,授權(quán)目錄必須配置到最后一級目錄幕垦,配置在根目錄不行丢氢。到這里其實還都不是問題,問題是微信判斷當(dāng)前路徑的方式先改。
? ? ? ?我們先定義兩個名詞:首先把當(dāng)前頁面叫做“Current Page”疚察;當(dāng)我們從微信別的地方點擊鏈接呼出微信瀏覽器時所落在的頁面、或者點擊微信瀏覽器的刷新按鈕時所刷新的頁面仇奶,我們叫做“Landing Page”貌嫡。舉個例子,我們從任何地方點擊鏈接進(jìn)入頁面A该溯,然后依次瀏覽到B岛抄、C、D狈茉,那么Current Page就是D夫椭,而Landing Page是A,如果此時我們在D頁面點擊一下瀏覽器的刷新按鈕论皆,那么Landing Page就變成了D(以上均是在單頁應(yīng)用的環(huán)境下,即以hashbang模式通過js更改瀏覽器路徑猾漫,直接href跳轉(zhuǎn)的不算)点晴。
問題來了,在ios和安卓下呼出微信支付的時候悯周,微信支付判斷當(dāng)前路徑的規(guī)則分別是:
IOS:Landing Page
安卓:Current Page
? ? ? ?這個規(guī)則是我試了N次試出來的粒督,非常的坑,這就意味著禽翼,在ios環(huán)境下屠橄,任何一個頁面都有可能成為支付頁面(因為我無法預(yù)知和控制用戶在哪個頁面點微信瀏覽器的刷新按鈕,或是用戶通過哪個連接從外部進(jìn)入到系統(tǒng))闰挡。我在網(wǎng)上用了各種方式搜索這個問題的解決方案锐墙,都沒找到好的,有關(guān)這個問題的帖子都少之又少长酗,都只有吐槽它而沒有解決了的溪北。
? ? ? ?我把這個問題放了好幾天,雖然有一個解決方案夺脾,就是進(jìn)入到支付頁面的時候使用href跳轉(zhuǎn)的方式之拨,會造成頁面刷新,影響一些用戶體驗咧叭。就是因為這個方案不完美蚀乔,我就一直擱著,今天呢就又把這個問題拿出來鼓搗菲茬。
今天不知道怎么來了靈感吉挣,尋思我靠這個不對啊派撕,
http://example.com/#!/cart/index
這個頁面的目錄應(yīng)該是
http://example.com/
? ? ? ?井號“#”后面應(yīng)該都忽略才對。于是乎听想,我想了想腥刹,反正入口文件就是個靜態(tài)html,服務(wù)器端也不直接接收query汉买,于是就把鏈接改成了
http://example.com/?#!/cart/index
就加了一個問號衔峰,于是微信瀏覽器妥妥的把井號“#”后面的內(nèi)容給去掉了,這個困擾了好幾天的問題蛙粘,最后用一個問號解決了垫卤。