android webview调用微信支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linsawako/article/details/64502648

有个需求是调用微信支付和支付宝支付,原本以为要集成SDK,之后才知道后台返回的是html,只需要用webview显示出来,之前没有接触过这种,结果跳了几天的坑 o(////▽////)q

傻傻地直接显示,结果什么都没有显示!!Σ(⊙▽⊙”

既然不懂,就查查吧

H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),weixin://wap/pay是微信定义的一种支付协议,用于网页端支付,微信app必定设置了名为weixin://的scheme,因此可以在网页上唤起微信app,在通过约定的参数名称,获取各种参数,从而可以完成支付

mWebView = (WebView) findViewById(R.id.wechat_webview);
WebSettings mWebSettings = mWebView.getSettings();
mWebSettings.setJavaScriptEnabled(true);
mWebView.loadDataWithBaseURL("about:blank", response, "text/html", "utf-8", null);

然后设置一个WebChromeClient,点击页面的链接会经过shouldOverrideUrlLoading。return true时,就是你自己来处理这个url,webview就不管了,普通的可以设置view.loadUrl(url),或者像是微信这种协议跳转;return false时,就是webview来处理,会开启手机自带的浏览器。

        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100) {
                   // 可以在完成时做一些处理
                }
            }
        });

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                if(url.startsWith("weixin://wap/pay?")) {

                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);

                    return true;
                }
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                // 这个方法有可能会多次执行
                super.onPageFinished(view, url);
            }



            @Override
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                // TODO Auto-generated method stub
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

        });
    }

设置一下,按返回键时, 不退出程序而是返回上一浏览页面:

public boolean onKeyDown(int keyCode, KeyEvent event) {       
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
        mWebView.goBack();// 返回前一个页面
        return true;       
    }       
    return super.onKeyDown(keyCode, event);       
}

需要注意的是,在onDestroy时需要清除webview,因为webview是有可能造成内存泄漏的

   @Override
    protected void onDestroy() {
        super.onDestroy();
        mWebView.stopLoading();
        mWebView.removeAllViews();
        mWebView.destroy();
        mWebView = null;
    }

正常来说,这样就完成了,但是,,我淡定地跳入了一个大坑,每次在微信支付完,返回时,它又调用了微信支付。。

刚开始猜测,是不是302跳转,导致无法退回,但是查找了相关的博客,发现,并不是这个问题,它只跳转了一次。(悲剧的过程就不描述了orz)

尝试把activity的生命周期打印了一遍,发现,,横竖屏切换的时候刷新了,,重新的onCreate了一次,所以当然又调用了啊,需要加上

android:configChanges="orientation|keyboardHidden|screenSize"

因为只是想调用微信支付,所以希望webview完成后就消失,跳转的时候显示的就为前一个界面。
发现跳转的时候强制为竖屏,原本的界面为横屏,但也被强制切换成了竖屏,所以也加上了android:configChanges="orientation|keyboardHidden|screenSize"

但是有些时候还是会在调用完之后再次调用,,这个我到现在都没有解决,不知道是为什么orz

先强行设置为了webview在再次onresume的时候finish(),这样前一个界面就不会被强制切换方向。

展开阅读全文

没有更多推荐了,返回首页