1. 程式人生 > >Android H5調起原生微信或支付寶支付

Android H5調起原生微信或支付寶支付

優先級 oom 優先 -s -m lean ttext move 自動

Android H5調起原生微信或支付寶支付

WebView調用原生微信或支付寶回調:其原理就是在shouldOverrideUrlLoading(final WebView view, String url)方法中進行攔截處理。

由於支付寶的取消支付之後跳轉的頁面顯示不太友好,所以集成支付寶SDK-手機網站支付轉APP支付,說明文檔參照https://docs.open.alipay.com/204/105695/。按照說明集成aliPaySdk。

初始化WebView:

private void initWebView(){
WebViewUtil.webSettingsApply(mWebView.getSettings());
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if(!TextUtils.isEmpty(title) && mTitle != null) {
mTitle.setText(title);
}
}
});
mWebView.loadUrl(mUrl);
}

覆寫url加載:

 private class MyWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
// 微信支付處理
if (url.startsWith("weixin://wap/pay?"
)){
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
H5PayActivity.this.startActivity(intent);
return true;
}catch (Exception e){ //異常處理
view.goBack(); // 因為會出現有一個weixin空白頁面;根據需求自己處理
UIUtil.showToastShort("系統檢測未安裝微信,請先安裝微信或者用支付寶支付");
return true;
}
}

// 支付寶支付處理
final PayTask task = new PayTask(H5PayActivity.this); //支持原生APP調用
//webView處理必須在同一個線程上
boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
@Override
public void onPayResult(final H5PayResultModel result) {
// 支付結果返回
final String url = result.getReturnUrl();
if (!TextUtils.isEmpty(url)) {
H5PayActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.loadUrl(url);
}
});
}
// 5000支付失敗 6001重復請求 6002中途取消
if ("5000".equals(result.getResultCode()) || "6001".equals(result.getResultCode()) ||
"6002".equals(result.getResultCode())){
Logg.e("errorCode", result.getResultCode());
H5PayActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.goBack();
}
});
}
}
});


/**
* 判斷是否成功攔截
* 若成功攔截,則無需繼續加載該URL;否則繼續加載
*/

if (!isIntercepted) {
if (!(url.startsWith("http") || url.startsWith("https")) || StringUtil.isEmpty(url)) {
return true;
}
view.loadUrl(url);
}
return true;
}
}

通用的WebView設置

public final class WebViewUtil {

/**
* 應用WebView的設置
* <ul>
* <li>webSettings.setDomStorageEnabled(true);//設置DOM Storage緩存</li>
* <li>webSettings.setDatabaseEnabled(true);//設置可使用數據庫</li>
* <li>webSettings.setJavaScriptEnabled(true);//支持js腳本</li>
* <li>webSettings.setUseWideViewPort(true);//將圖片調整到適合webview的大小</li>
* <li>webSettings.setSupportZoom(false);//支持縮放</li>
* <li>webSettings.setBuiltInZoomControls(false);//支持縮放</li>
* <li>webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持內容從新布局</li>
* <li>webSettings.setSupportMultipleWindows(false);//多窗口</li>
* <li>webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//關閉webview中緩存</li>
* <li>webSettings.setAllowFileAccess(true);//設置可以訪問文件</li>
* <li>webSettings.setNeedInitialFocus(true);//當webview調用requestFocus時為webview設置節點</li>
* <li>webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通過JS打開新窗口</li>
* <li>webSettings.setLoadsImagesAutomatically(true);//支持自動加載圖片</li>
* <li>webSettings.setGeolocationEnabled(true);//啟用地理定位</li>
* <li>webSettings.setAllowFileAccessFromFileURLs(true);//使用允許訪問文件的urls</li>
* <li>webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允許訪問文件的urls</li>
* </ul>
*/

@SuppressLint("SetJavaScriptEnabled")
public static void webSettingsApply(WebSettings webSettings) {
webSettings.setDomStorageEnabled(true);//設置DOM Storage緩存
webSettings.setDatabaseEnabled(true);//設置可使用數據庫
webSettings.setJavaScriptEnabled(true);//支持js腳本
webSettings.setUseWideViewPort(true);//將圖片調整到適合webview的大小
webSettings.setSupportZoom(false);//支持縮放
webSettings.setBuiltInZoomControls(false);//支持縮放
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持內容從新布局
webSettings.setSupportMultipleWindows(false);//多窗口
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//關閉webview中緩存
webSettings.setAllowFileAccess(true);//設置可以訪問文件
webSettings.setNeedInitialFocus(true);//當webview調用requestFocus時為webview設置節點
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通過JS打開新窗口
webSettings.setLoadsImagesAutomatically(true);//支持自動加載圖片N
webSettings.setGeolocationEnabled(true);//啟用地理定位

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
webSettings.setAllowFileAccessFromFileURLs(true);//使用允許訪問文件的urls
webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允許訪問文件的urls
}

if(Build.VERSION.SDK_INT >= 19) {
if(Configs.DEBUG){
WebView.setWebContentsDebuggingEnabled(true);
}
}
// webSettings.setRenderPriority(WebSettings.RenderPriority.NORMAL);//設置渲染優先級 will be Deprecated
}

/**
* webView 銷毀webView避免內存泄漏
*/

public static void destory(WebView webView){
if(webView != null){
webView.stopLoading();
webView.getSettings().setJavaScriptEnabled(false);
webView.clearHistory();
webView.removeAllViews();
webView.destroy();
}
}
}

Android H5調起原生微信或支付寶支付