最近解决一个问题,后台返回客户单的是一个支付宝的链接,需要客户端这边来打开,返回地址为:

https://openapi.alipay.com/gateway.do?app_id=***

使用webview加载后会重定向到

https://mclient.alipay.com/cashier/mobilepay.htm?alipay_exterface_invoke_assign_target=

再然后会打开支付宝自定义的scheme

alipays://platformapi/startApp?appId=

这里就需要在shouldOverrideUrlLoading里面添加如下代码:

            if (url.startsWith("http")) {
                return super.shouldOverrideUrlLoading(view, url);
            } else {
                try {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    finish();
                    return true;
                } catch (Exception e) {//防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
                    return true;//没有安装该app时,返回true,表示拦截自定义链接,但不跳转,避免弹出上面的错误页面
                }

            }

webview的setting设置如下

    private void setting(WebView dWebView) {
        dWebView.setWebViewClient(client);
        dWebView.setWebChromeClient(new WebChromeClient());
        WebSettings webSetting = dWebView.getSettings();
        webSetting.setJavaScriptEnabled(true);
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);//这句很重要
        webSetting.setAllowFileAccess(true);
        webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        webSetting.setSupportZoom(true);
        webSetting.setBuiltInZoomControls(true);
        webSetting.setDisplayZoomControls(false);
        webSetting.setUseWideViewPort(true);
        webSetting.setSupportMultipleWindows(true);
        webSetting.setLoadWithOverviewMode(true);
        webSetting.setAppCacheEnabled(true);
        webSetting.setDatabaseEnabled(true);
        webSetting.setDomStorageEnabled(true);
        webSetting.setGeolocationEnabled(true);
        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
        webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
        webSetting.setCacheMode(WebSettings.LOAD_DEFAULT);
        //下面两行代码可以防止webview页打开黑屏
        dWebView.setBackgroundColor(App.getInstance().getColor(android.R.color.transparent));
        dWebView.setBackgroundResource(R.color.white);


    }

如果要用WebView打开微信支付,会出现重定向问题,可以参考这里的解决方案

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐