1. 程式人生 > >android webview呼叫微信支付

android webview呼叫微信支付

有個需求是呼叫微信支付和支付寶支付,原本以為要整合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(),這樣前一個介面就不會被強制切換方向。