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(); } }}
原文地址:https://www.cnblogs.com/denluoyia/p/10057794.html
时间: 2024-09-30 06:54:52