android通过webview调起支付宝app支付

摘要:
//ds.alipay.com/from=移动编解码器&qrcode=https%3A%2F%2Fqr.alipay.com%2Fbax05351pghc4yegd2y2084%3F_s%3Dwebother&scheme=alipayqr;包=com.eg.android.AlipayGphone;favicon);

webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好。但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带的浏览器。

webview.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                LoadingDialog.closeDialog();
            }

        });

在此方法中可以监听浏览器开始加载网页和加载网页结束。

今天着重讲的并不是上边的两个方法而是下面的这位

putinmoney_webview.setWebViewClient(new WebViewClient() {
                        @Override
                        public boolean shouldOverrideUrlLoading(WebView view, String url) {
} });

shouldOverrideUrlLoading并不是每次都在onPageStarted之前开始调用的,只有在调用webview.loadURL的时候才会调用。

webview.loadUrl("https://qr.alipay.com/bax05351pgjhc4yegd2y2084");

但发起请求的时候后,webview的连续动作是先后请求两个url

1.https://mobilecodec.alipay.com/client_download.htm?qrcode=bax05351pgjhc4yegd2y2084

2.https://ds.alipay.com/from=mobilecodec&scheme=alipayqr%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D10000007%26clientVersion%3D3.7.0.0718%26qrcode%3Dhttps%253A%252F%252Fqr.alipay.com%252Fbax05351pgjhc4yegd2y2084%253F_s%253Dweb-other

之后返回一个意图,也是用这个意图来打开支付宝app

intent://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=https%3A%2F%2Fqr.alipay.com%2Fbax05351pgjhc4yegd2y2084%3F_s%3Dwebother&_t=1474448799004#Intent;scheme=alipayqr;package=com.eg.android.AlipayGphone;end

webview.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                // TODO Auto-generated method stub
                super.onPageStarted(view, url, favicon);
            }
            
            @Override
            public void onPageFinished(WebView view, String url) {
                // TODO Auto-generated method stub
                super.onPageFinished(view, url);
            }
            
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.e(TAG, "访问的url地址:" + url);
                if (parseScheme(url)) {
                    try {
                        Uri uri = Uri.parse(url);
                        Intent intent;
                        intent = Intent.parseUri(url,
                                Intent.URI_INTENT_SCHEME);
                        intent.addCategory("android.intent.category.BROWSABLE");
                        intent.setComponent(null);
                        // intent.setSelector(null);
                        startActivity(intent);

                    } catch (Exception e) {

                    }
                } else {
                    view.loadUrl(url);
                }

                return true;

            }
            
        });
关于"android.intent.category.BROWSABLE"参考:

http://blog.csdn.net/gf771115/article/details/7827833

此外要对webview设置下:

WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
// 设置可以访问文件
webSettings.setAllowFileAccess(true);
// 设置支持缩放
webSettings.setBuiltInZoomControls(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// webSettings.setDatabaseEnabled(true);

// 使用localStorage则必须打开
webSettings.setDomStorageEnabled(true);

webSettings.setGeolocationEnabled(true);

实例下载地址:https://github.com/reachchen/loadurltoali.git

在项目中发现的问题在此修正:

发现一些手机(例如一些升级了7.0的手机)在请求后并没有返回intent,所以就会出现调不起支付宝的情况。但是用浏览器直接打开是可以的

兼容的思路如下:

新建一个线程,在用户发出请求后,如果10秒的时间没有收到调起的intent,就用浏览器直接调起。

代码如下:

    public boolean parseScheme(String url) {
        
        if (url.contains("platformapi/startapp")){
            myHandler.removeCallbacks(runable);
            return true;
        } else if(url.contains("web-other")){
            
            myHandler.postDelayed(runable, 10000);
            return false;
        }else {
            return false;
        }
    }

新建的线程

    myHandler = new Handler();
        
        runable = new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                LoadingDialog.closeDialog();
                webview_another.loadUrl(myaliWebUrl.get("code_url"));
            }
        };
    }

免责声明:文章转载自《android通过webview调起支付宝app支付》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇低代码开发平台: 华为AppCube vs. 炎黄盈动BPMPaas vs. 吉鼎科技J2Paascmd 下登陆ftp及相关操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android学习笔记八:用Broadcast Receiver跨进程(跨app)通信

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7515194.html 在前面介绍四大组件的时候提到了可以对外部事件进行过滤的Broadcast Receiver,这里就对它的用法作进一步的探讨。 一:Broadcast Receiver的使用 主要有以下三个流程:定义接收器,在其中定义接收到广播后的响应行为——注册...

正则替换URL地址为链接地址

最近项目中有用到判断URL文本转化为链接地址的正则,刚好记录下 /*替换链接*/ replaceSrc:function(txt){ var reg = /(((https?:(?://)?)(?:[-;:&=+$,w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,w]+@)[A-Za-z0-9.-]+)((?:/...

百度UEditor上传图片-再再总结一次

本周,CSDN有个网友遇到了百度UEditor上传问题,最后商定付50元钱,我帮他解决这个问题。    他最初想自己搞定这个问题,结果搞了好多次,好几天,还是没能解决。    2015年1月17日8:25~2015年1月18日00:24,4个小时终于搞定了这个问题。 1.总的感悟    本来预计1个小时,就能解决的,结果硬是花费了4个小时,挺无奈的。 虽说...

微信小程序上传图片 并和文字一起提交 (有接口)

实现功能如图 html代码 <viewclass="main"> <viewclass="card"> <viewclass="card-up"> <view>身份证</view> <view>上传身份证</view> </view> <image...

暴力猴

https://www.52pojie.cn/thread-614101-1-1.html 不建议阅读者: 前端大神 想要深入学习(涉及到分析挖掘调用网站中js算法/自己写算法)油猴脚本的读者【备注:楼主也不会,楼主也很绝望啊...】 阅读以下内容所需知识: javascript/jQuery基础知识【李炎恢的JavaScript教程(http://...

Python3调用企业微信用于告警

代码实现请见文末 前段时间利用py爬虫抓取一些网页信息,然后通过wxpy发送到微信群,以用作日常告警,感觉还是很方便。 但好景不长,我的小号微信被腾讯封了(很常见咯), 显示无法登录网页版微信,至今已经有半个多月了。 怎么办,已经体验过微信告警的方便后,无法回归原始人工查看了。思来想去,决定探(bai)索(du)Python调用微信企业号试试看; 一、申...