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)
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(),這樣前一個介面就不會被強制切換方向。