https://www.jianshu.com/p/acb548cdd268
Android WebView 调起H5支付,提示商家参数格式有误
网上都说 手动的在 Android WebView 中添加头 referer ,而这个 referer 都说是微信商户平台后台配制的值
需要到微信后台去看。。。。what F .. 我一个广告的链接我找谁去要这个玩意呢,而且明确的可以不获取这个东西俩解决这个问题。
后来才发现 在WebView 请求的时候导致本来有 的 referer,在请求中丢失了。所以只要先获取到这个本来存在的 referer,然后在网页的shouldOverrideUrlLoading()中写回去就行了。
web.setWebViewClient(new WebViewClient() {
// Handle API 21+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
///获取请求uir
String url = request.getUrl().toString();
///获取RequestHeader中的所有 key value
Map<String, String> lRequestHeaders = request.getRequestHeaders();
Timber.e("测试URI"+url);
for (Map.Entry<String, String> lStringStringEntry : lRequestHeaders.entrySet()) {
Timber.d("测试header"+lStringStringEntry.getKey() + " " + lStringStringEntry.getValue());
}
if (lRequestHeaders.containsKey("Referer")) {
mReffer = lRequestHeaders.get("Referer");
}
return super.shouldInterceptRequest(view, request);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url == null) return false;
if (url.startsWith("weixin://wap/pay?")) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
Timber.e("web,微信 "+url);
return true;
}
Timber.e("web,Click "+url);
try {
if (url.startsWith("http:") || url.startsWith("https:")) {
HashMap<String, String> lStringStringHashMap = new HashMap<>();
if (!TextUtils.isEmpty(mReffer)) {
lStringStringHashMap.put("referer", mReffer);
view.loadUrl(url, lStringStringHashMap);
} else {
view.loadUrl(url, lStringStringHashMap);
}
return true;
} else {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
} catch (Exception e) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
return false;
}
}
});
具体的Referer 丢失原因 在链接文章里写的很详细,赞