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

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

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

初始化WebView:

  1. 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加载:

  1.  private class MyWebViewClient extends WebViewClient {
  2.     @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;
                }
            }
  3.         // 支付宝支付处理
            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();
                            }
                        });
                    }
                }
            });
  4.         /**
             * 判断是否成功拦截
             * 若成功拦截,则无需继续加载该URL;否则继续加载
             */
            if (!isIntercepted) {
                if (!(url.startsWith("http") || url.startsWith("https")) || StringUtil.isEmpty(url)) {
                    return true;
                }
                view.loadUrl(url);
            }
            return true;
        }
    }

通用的WebView设置

  1. public final class WebViewUtil {
  2.     /**
         * 应用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);//启用地理定位
  3.         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                webSettings.setAllowFileAccessFromFileURLs(true);//使用允许访问文件的urls
                webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允许访问文件的urls
            }
  4.         if(Build.VERSION.SDK_INT >= 19) {
                if(Configs.DEBUG){
                    WebView.setWebContentsDebuggingEnabled(true);
                }
            }
            // webSettings.setRenderPriority(WebSettings.RenderPriority.NORMAL);//设置渲染优先级 will be Deprecated
        }
  5.     /**
         * webView 销毁webView避免内存泄漏
         */
        public static  void destory(WebView webView){
            if(webView != null){
                webView.stopLoading();
                webView.getSettings().setJavaScriptEnabled(false);
                webView.clearHistory();
                webView.removeAllViews();
                webView.destroy();
            }
        }
    }

Android H5调起原生微信或支付宝支付的更多相关文章

  1. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  2. 微信和支付宝支付模式详解及实现(.Net标准库)

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  3. iOS不用官方SDK实现微信和支付宝支付XHPayKit

    作者:朱晓辉Allen 链接:https://juejin.im/post/5a90dd3a6fb9a0634912b755 前言 前段时间由于项目需求,移除了项目中的微信支付SDK和支付宝支付SDK ...

  4. 关于Java调用接入微信、支付宝支付提现

    前言: 本篇文章介绍关于自己写的一个集成微信.支付宝的支付.提现等功能的介绍,本项目已在码云上进行开源,欢迎大家一起来进行改造,使进行更好的创新供大家使用:也有对应的pom文件坐标可以导入,因目前不知 ...

  5. MUI 微信 和支付宝支付 (前台代码)

    <!-- 校园公告详情界面 用于显示校园公告的详情信息 在校园公告界面点击某一条目后 进入本界面查看详情 --> <!DOCTYPE html> <html> &l ...

  6. 微信端支付宝支付,iframe改造,解决微信中无法使用支付宝付款和弹出“长按地址在浏览器中打开”

    微信对支付宝的链接屏蔽了, https://mapi.alipay.com/gateway.do?_input_charset=utf-8&notify_url=http%3A%2F%2Fzh ...

  7. 利用抖音Cookie充值接口提取支付链接,个人调起原生微信h5支付宝h5支付

    最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...

  8. Android应用跳转到微信和支付宝扫一扫

    新版的微信已经把微信功能的schema都禁掉了,意味着我们无法打开微信的扫一扫等功能,目前正常的只能先进入微信(我测试的时候是微信版本7.0.3)已经是很新的版本了 具体调起微信扫一扫代码如下,测试后 ...

  9. 实现手机网页调起原生微信朋友圈分享的工具nativeShare.js

    http://www.liaoxiansheng.cn/?p=294 我们知道现在我们无法直接通过js直接跳转到微信和QQ等软件进行分享,但是现在像UC浏览器和QQ浏览器这样的主流浏览器自带一个分享工 ...

随机推荐

  1. Libre Office冻结操作-MAC

    冻结行/列 选中所要冻结的行/列,选择window-Freeze 冻结成功 冻结单元格 操作方法与“冻结行/列”一致

  2. (最优m个候选人 和他们的编号)Jury Compromise (POJ 1015) 难

    http://poj.org/problem?id=1015   Description In Frobnia, a far-away country, the verdicts in court t ...

  3. File类、文件过滤器、递归、文件及文件夹的操作方法

    一.File Io概述: 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作. 因此我们把这种输入和 ...

  4. PAT甲级 1125. Chain the Ropes (25)

    1125. Chain the Ropes (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given ...

  5. 三种初步简易的方法求解数值问题 of C++

    1. “二分法解方程” 在二分法中,从区间[a,b]开始,用函数值f(a)与f(b)拥有相反的符号.如果f在这个区间连续,则f的图像至少在x=a,x=b之间穿越x轴一次,因此方程f(x)=0在[a,b ...

  6. shell工具-awk

    awk 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理. 基本用法 awk [选项参数] 'pattern1{action} pattern2{act ...

  7. 转:spring的启动过程-spring和springMVC父子容器的原理

    要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程. s ...

  8. poj 2531 搜索剪枝

    Network Saboteur Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u ...

  9. WPF TreeView IsExpanded 绑定不上的问题

    最近项目上需要通过MVVM来控制TreeView,其中需要需要控制通过搜索来定位某个节点,正常逻辑下,首先通过需要在树上面找到该节点,然后选中该节点,并将该节点的父节点展开,这个时候需要通过MVVM来 ...

  10. 关于.net core使用nginx做反向代理获取客户端ip的问题

    1.正常情况下.net core获取客户端ip是比较简单的 /// <summary> /// 获取客户Ip /// </summary> /// <param name ...