android 调起h5页面微信支付

最近在做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 协议并打开程序

你可能感兴趣的:(android)