• Android H5调起原生微信或支付宝支付


    Android H5调起原生微信或支付宝支付

    WebView调用原生微信或支付宝回调:其原理就是在shouldOverrideUrlLoading(final WebView view, String url)方法中进行拦截处理。

    由于支付宝的取消支付之后跳转的页面显示不太友好,所以集成支付宝SDK-手机网站支付转APP支付,说明文档参照https://docs.open.alipay.com/204/105695/。按照说明集成aliPaySdk。

    初始化WebView:

    private void initWebView(){
        WebViewUtil.webSettingsApply(mWebView.getSettings());
        mWebView.setWebViewClient(new MyWebViewClient());
        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                if(!TextUtils.isEmpty(title) && mTitle != null) {
                    mTitle.setText(title);
                }
            }
        });
        mWebView.loadUrl(mUrl);
    }

    覆写url加载:

     private class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, String url) {
            // 微信支付处理
            if (url.startsWith("weixin://wap/pay?")){
                try {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    H5PayActivity.this.startActivity(intent);
                    return true;
                }catch (Exception e){ //异常处理
                    view.goBack(); // 因为会出现有一个weixin空白页面;根据需求自己处理
                    UIUtil.showToastShort("系统检测未安装微信,请先安装微信或者用支付宝支付");
                    return true;
                }
            }

            // 支付宝支付处理
            final PayTask task = new PayTask(H5PayActivity.this); //支持原生APP调用
            //webView处理必须在同一个线程上
            boolean isIntercepted = task.payInterceptorWithUrl(url, truenew H5PayCallback() {
                @Override
                public void onPayResult(final H5PayResultModel result) {
                    // 支付结果返回
                    final String url = result.getReturnUrl();
                    if (!TextUtils.isEmpty(url)) {
                        H5PayActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                view.loadUrl(url);
                            }
                        });
                    }
                    // 5000支付失败 6001重复请求 6002中途取消
                    if ("5000".equals(result.getResultCode()) || "6001".equals(result.getResultCode()) ||
                            "6002".equals(result.getResultCode())){
                        Logg.e("errorCode", result.getResultCode());
                        H5PayActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                view.goBack();
                            }
                        });
                    }
                }
            });


            /**
             * 判断是否成功拦截
             * 若成功拦截,则无需继续加载该URL;否则继续加载
             */

            if (!isIntercepted) {
                if (!(url.startsWith("http") || url.startsWith("https")) || StringUtil.isEmpty(url)) {
                    return true;
                }
                view.loadUrl(url);
            }
            return true;
        }
    }

    通用的WebView设置

    public final class WebViewUtil {

        /**
         * 应用WebView的设置
         * <ul>
         * <li>webSettings.setDomStorageEnabled(true);//设置DOM Storage缓存</li>
         * <li>webSettings.setDatabaseEnabled(true);//设置可使用数据库</li>
         * <li>webSettings.setJavaScriptEnabled(true);//支持js脚本</li>
         * <li>webSettings.setUseWideViewPort(true);//将图片调整到适合webview的大小</li>
         * <li>webSettings.setSupportZoom(false);//支持缩放</li>
         * <li>webSettings.setBuiltInZoomControls(false);//支持缩放</li>
         * <li>webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持内容从新布局</li>
         * <li>webSettings.setSupportMultipleWindows(false);//多窗口</li>
         * <li>webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//关闭webview中缓存</li>
         * <li>webSettings.setAllowFileAccess(true);//设置可以访问文件</li>
         * <li>webSettings.setNeedInitialFocus(true);//当webview调用requestFocus时为webview设置节点</li>
         * <li>webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口</li>
         * <li>webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片</li>
         * <li>webSettings.setGeolocationEnabled(true);//启用地理定位</li>
         * <li>webSettings.setAllowFileAccessFromFileURLs(true);//使用允许访问文件的urls</li>
         * <li>webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允许访问文件的urls</li>
         * </ul>
         */

        @SuppressLint("SetJavaScriptEnabled")
        public static void webSettingsApply(WebSettings webSettings) {
            webSettings.setDomStorageEnabled(true);//设置DOM Storage缓存
            webSettings.setDatabaseEnabled(true);//设置可使用数据库
            webSettings.setJavaScriptEnabled(true);//支持js脚本
            webSettings.setUseWideViewPort(true);//将图片调整到适合webview的大小
            webSettings.setSupportZoom(false);//支持缩放
            webSettings.setBuiltInZoomControls(false);//支持缩放
            webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持内容从新布局
            webSettings.setSupportMultipleWindows(false);//多窗口
            webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//关闭webview中缓存
            webSettings.setAllowFileAccess(true);//设置可以访问文件
            webSettings.setNeedInitialFocus(true);//当webview调用requestFocus时为webview设置节点
            webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
            webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片N
            webSettings.setGeolocationEnabled(true);//启用地理定位

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                webSettings.setAllowFileAccessFromFileURLs(true);//使用允许访问文件的urls
                webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允许访问文件的urls
            }

            if(Build.VERSION.SDK_INT >= 19) {
                if(Configs.DEBUG){
                    WebView.setWebContentsDebuggingEnabled(true);
                }
            }
            // webSettings.setRenderPriority(WebSettings.RenderPriority.NORMAL);//设置渲染优先级 will be Deprecated
        }

        /**
         * webView 销毁webView避免内存泄漏
         */

        public static  void destory(WebView webView){
            if(webView != null){
                webView.stopLoading();
                webView.getSettings().setJavaScriptEnabled(false);
                webView.clearHistory();
                webView.removeAllViews();
                webView.destroy();
            }
        }
    }
  • 相关阅读:
    git 简单操作
    JS中substr与substring的区别
    手写map, filter函数
    node之pipe
    nodejs之child_process
    node真的是单线程模式吗
    【xinsir】分享一个查找文件的脚手架
    【xinsir】函数库,持续更新
    数组循环方法统计
    20190916
  • 原文地址:https://www.cnblogs.com/denluoyia/p/10057794.html
Copyright © 2020-2023  润新知