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

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述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,  true,  new  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;
        }
}

【Android H5调起原生微信或支付宝支付】通用的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();
                }
        }
}


    推荐阅读