Android WebView 无法调用微信客户端支付

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 lRequestHeaders = request.getRequestHeaders();
                Timber.e("测试URI"+url);
                for (Map.Entry 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 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 丢失原因 在链接文章里写的很详细,赞

你可能感兴趣的:(Android WebView 无法调用微信客户端支付)