android 调起h5页面微信支付

来源:互联网 发布:windows群集有什么用 编辑:程序博客网 时间:2024/05/17 03:39

最近在做app的支付功能。具体过程在app中获取后台支付url(聚合支付)直接调起微信支付页面。app向webview传入url直接调起网页。以下为webview的部分代码:

webView.getSettings().setJavaScriptEnabled(true);//支持js webView.setWebViewClient(new WebViewClient());//对webview页面加载管理、如url重定向private WebViewClient webViewClient = new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            if (url.startsWith("weixin://")) {                Intent intent = new Intent();                intent.setAction(Intent.ACTION_VIEW);                intent.setData(Uri.parse(url));                startActivity(intent);                return  true;            }            return false;        }    };

先简单分析一下上面的代码,webViewClient 类是对于网页中url加载和重定向的拦截,当url以weixin://开头就对他进行处理跳转到微信页面。为什么会有这种处理,这就不得不说一下app的scheme机制。android中可以通过intent的隐式启动,添加相关界面activity的包路径,来打开对应的应用和界面。但别人的app包路径不通过逆向手段是无法获取到的,并且有些界面需要传递一些参数,所以这种方法很难实现。因此scheme应运而生,开发商提供一个scheme供其他应用进入。
方法很简单在AndroidManifest.xml文件中的activity标签中添加intent-filter,并且添加data的scheme、host等。

<activity android:name=".module.user.ui.LoginAct"            android:screenOrientation="portrait">            <intent-filter>                <data android:scheme="test"                    android:host="hello">                </data>            </intent-filter>        </activity>

上面的代码产生的scheme为test://hello

String url = "test:/hello"  Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));                    startActivity(in);

当然也可以传递参数

String url = "test:/hello?key=传递的参数"  Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));                    startActivity(in);

在目的页面进行接收

Intent intent = getIntent();        String scheme = intent.getScheme();        Uri uri = intent.getData()        if (uri != null) {            String host = uri.getHost();            //获得参数值            String key1 = uri.getQueryParameter("key1");      }

言归正传,我在开发的时候跳转不过去,截取到的url是intent://开头的,经过测试发现在chrome浏览器是无法跳转的,其他浏览器可以,但webview正好是chrome内核。。。
这是通过网页的形式启动app,以前通过网页启动 app 是通过设置 iframe 的 src 属性例如

<iframe src="paulsawesomeapp://page1"> </iframe>

此方法适用 version 18 或者更早版本。其他 android 浏览器也适用。 这个功能在安卓 chrome 浏览器 version 25 之后版本发生了改变。不能在通过设置 iframe 标签的 src 属性来启动 app 了。取而代之的是你应该通过自定义 scheme 实现用户手势启动 app 或者使用本文描述的“intent:”语法。
所以上面程序修改成:

private WebViewClient webViewClient = new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            if (url.startsWith("intent://")) {                Intent intent = Intent.parseUri(uri);                  intent.addCategory("android.intent.category.BROWSABLE");                  intent.setComponent(null);                   intent.setSelector(null);                   startActivity(intent);                return  true;            }            return false;        }    };

感谢Android 解析 Intent 协议并打开程序