在項目打包上線,微信上測試的時候結果報出以上錯誤。網上查看了很多資料,但是都沒有比較詳細的解決方案。
也許是出於安全的考慮,在使用微信提供的JSSDK的時候,我們需要給當前的網址簽名。我們需要在微信公眾平臺上填寫當前網址的url。具體如下:
那麽我們微信公眾平臺上綁定的url就應該是 www.test.com/orderPlus/ 。微信允許網址最後壹個參數可變化,此刻我們就能夠正常調用微信支付接口了。
如果妳訪問的網址如下,就會出現上圖中的錯誤,當前頁面url未註冊的警告。
因為微信簽名url只能允許url地址最後壹個參數可變化。但是,實際開發中,我們的支付頁面可能有很多個,而且深入程度不同,而微信允許添加的url授權地址又只有5個。那樣的話如何解決呢!
如果遇到以上問題,我們可以使用H5的history.pushState()和history.replaceState()這兩個方法。這兩個方法的作用是相同的,他們只會修改當前url的地址,但是不會刷新我們的網頁,唯壹不同點在於壹個重新創建壹個url地址,而另外壹個會修改當前的url地址,導致路由歷史記錄被覆蓋。那麽,我們的問題就可以解決了。而這兩個方法具體的使用,大家可以查詢官方文檔。
大致的解決方法是,比如壹個充值頁面,當我們輸入完金額之後,點擊充值按鈕的時候,首先觸發history.pushState(null,null,"A.html"),傳入三個參數,前兩個參數大家參考官方,最後壹個參數是我們需要修改的url地址。
這裏我說明壹下,自己使用上述方法後的壹點心得。上述方法第三個參數,有壹些註意點。
當我們傳入"/A.html"的時候,他會將我們域名後的參數全部去掉,然後將我們的參數添加上去。
當我們傳入"A.html"的時候,他只會把網址最後壹個參數修改掉。
當我們傳入"?A.html"的時候,他會將我們的添加的參數,添加到我們的url後。
以上就是需要註意的地方。
原本以為通過上訴的方法,壹切會很順利。結果,在我實際測試的時候,又出現了壹個坑爹的情況。測試上安卓手機能夠成功喚起支付,而ios卻不能喚起。(ios下第壹次能夠喚起,關閉網頁,再次打開就不能正常喚起了)。
查看許多的資料,最後得出的結果是,對於單頁應用,ios系統獲取簽名的url是我們首次進入的地址,而安卓系統獲取的是當前的url地址。
我們之前說過,微信能夠允許url後壹個可變參數,而現在出現兩個參數,結果就無法喚起支付了。而安卓是拿取當前的url地址,而我們每次去喚起支付的時候,都會去修改這個地址,所以安卓就沒有問題,而ios拿取的是我們首次進入的地址。
既然如此,就只能為ios系統在壹開始進入的時候,就將url地址修改掉。
本人使用react框架開發單頁應用,所以我在app.js也就是最頂層的組件中將url地址修改掉。成功解決問題。
本來以為壹切就此結束,結果,又壹個麻煩的問題出現了。項目中url中的壹個參數是根據微信授權後,後臺根據不同用戶產生的不同的id值。這樣的話,問題就出現了。
以上只是壹個舉例,實際上用戶是無法預測的。而我們通過微信公眾平臺後臺授權的url地址只有5個,就算沒有限制,手動添加也是不可能的。
想了許久,最後我想到了壹個方法。這裏要使用history.pushState()第三個參數的第三種寫法,也就是增加壹個"?"。因為,在瀏覽器中,系統會默認將?後面的參數全都忽略。
以上url,系統只會識別 www.test.com/orderPlus/demo 至於後面的參數都不會管,而微信授權簽名也只會尋找前面有效的參數。那麽我們就可以通過這種方式將url地址修改掉。
而且通過這種方式修改的url地址,並不會對單頁應用內部路由產生問題。