最近在接入H5微信支付時遇到了一個比較坑的問題,是以寫篇總結
問題描述
在接入H5微信支付時,如果是APP裡調起H5支付,需要在webview中手動設定referer,如下
Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商戶申請H5時送出的授權域名");//例如 http://www.baidu.com
webView.loadUrl(targetUrl, extraHeaders);//targetUrl為微信下單位址
因為微信要驗證請求來源,是以如果這個地方沒有去設定的話,會跳轉如下頁面中

但是測試過程中發現一個相容性問題:在4.4.4、4.4.3的裝置上,下單時一直會跳轉到上面的頁面中。後來通過抓包發現設定的Referer沒有生效。。。
解決方案
google了一大圈最終發現了一個靠譜的解決方案,就是利用loadDataWithBaseURL方法代替loadUrl方法,通過js去請求微信下單Url,loadDataWithBaseURL方法的具體描述如下
public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
data可以是Html代碼片。baseUr為頁面的基礎Url,用來組織html中的相對路徑。我們data這個參數中傳入js代碼片去請求微信下單Url,而baseUr設定為授權域名,這樣請求微信下單Url時,referer自動會被設定為baseUrl(正常請求的referer預設就是請求的來源位址)
最終的代碼如下
if (("4.4.3".equals(android.os.Build.VERSION.RELEASE))
|| ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) {
//相容這兩個版本設定referer無效的問題
view.loadDataWithBaseURL("商戶申請H5時送出的授權域名",
"<script>window.location.href=\"" + targetUrl + "\";</script>",
"text/html", "utf-8", null);
} else {
Map<String, String> extraHeaders = new HashMap<>();
extraHeaders.put("Referer", "商戶申請H5時送出的授權域名");
view.loadUrl(targetUrl, extraHeaders);
}
希望本文能幫助到遇到相同問題的程式員們
微信H5支付常見問題彙總
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
最後感謝提供本方案的大佬,他寫的文章位址如下
https://www.jianshu.com/p/8e138577ec8e