Android 4.4.3和Android4.4.4系统拉不起微信H5支付问题终极解决方案

      上一篇文章我们解决了一个时而调得起微信H5支付,时而调不起(显示:系统繁忙,请稍后重试!)的问题,那这次我们再来解决一个因为手机系统而拉不起微信H5支付问题!

      上一篇文章中我们有用到下面的这个Referer,这个大家应该都还记得,但是这个在android 4.4.3和4.4.4系统上是失效的,导致shouldOverrideUrlLoading这个方法无法回调,所以就无法拦截到"weixin:..wap/pay?",自然而然就拉不起微信的H5支付页面,这个可能跟WebView的内核版本有关。

 Map<String, String> extraHeaders = new HashMap<String, String>();
 // 此处连接为申请微信H5支付的时候填写的域名
  extraHeaders.put("Referer", "http://wxpay.wxutil.com");
  view.loadUrl(url, extraHeaders);

    上面知道了原因,接下来我们就要找解决方案了,这里我直接上代码了

        webView = findViewById(R.id.webview);
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDefaultTextEncodingName("UTF-8");
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.setWebChromeClient(new WebChromeClient());
        WebViewClient webViewClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 此处log 最终让我发现了问题根源
                Log.i("AAAAAA", "shouldOverrideUrlLoading: ---url = "+url);
                // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                if (url.startsWith("weixin://wap/pay?")) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return false;
                } else {
                    if (("4.4.3".equals(android.os.Build.VERSION.RELEASE))
                        || ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) {
        
                       return false;
                    }else{
                        Map<String, String> extraHeaders = new HashMap<String, String>();
                        // 此处连接为申请微信H5支付的时候填写的域名
                        extraHeaders.put("Referer", "http://wxpay.wxutil.com");
                        view.loadUrl(url, extraHeaders);
                    }
                }
                return true;
            }
 
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
                handler.proceed();
            }
        };
        webView.setWebViewClient(webViewClient);
           // 针对referer失效,这两个版本需要做特殊的兼容处理
         if (("4.4.3".equals(android.os.Build.VERSION.RELEASE))
                        || ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) {
             webView.loadDataWithBaseURL("http://wxpay.wxutil.com",
                "<script>window.location.href=\"" + "https://wxpay.wxutil.com/mch/pay/h5.v2.php" + "\";</script>",
                "text/html", "utf-8", null);
          }else{
              webView.loadUrl("https://wxpay.wxutil.com/mch/pay/h5.v2.php");
          }
        

这里的window.location.href是javascript的重定向跳转,直接在本页上跳转。具体的大家可以深究。这样问题就彻底解决了!

发布了9 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u012850536/article/details/105124944