上一篇Android-Webview加载页面调起支付宝支付(跳转支付页面或者转Native支付) 我们参考网上资料确实是在某些第三方页面调起了支付,不过有些第三方支付确实有问题,而且加载页面还会报错:
类似加载失败的: alipays://platformapi/startApp.....相关的错误页面。
再仔细看我们之前的判断,发现不太对劲,url.contains("platformapi/startapp")是小写,貌似有问题的样子。。
但小白不知道为什么有些第三方页面确实这样的判断,有些确实大写开头的那种。哎!不知道都在干啥妮。。。IOS内置的就直接支持跳转,Android国内的厂商却默默的不支持。哈哈。。。。
然后我们管它,直接把情况都怼上,详细的后面可以考虑去分析研究下,得看看支付文档啥的吧。目前小白发现只有“支护宝”可以,微信没测试过,也没有想过的测试页面,就不管了。
/**
* 自定义MyWebClient
*/
private class MyWebClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
///< 在开始加载网页时会回调
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
// ///< 交给Webview自己处理 - 也能解决加载百度后无法返回退出(不停的刷新百度)
// //view.loadUrl(url);
// //return true;
// return false;
///< 拦截支付宝/微信支付
if (url.startsWith("alipays://platformapi/startApp?") ||
url.startsWith("weixin://wap/pay?")) {
Intent intent;
try {
intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
} catch (Exception e) {
//e.printStackTrace();
}
}else if (url.contains("platformapi/startapp")) {
Intent intent;
try {
intent = Intent.parseUri(url,
Intent.URI_INTENT_SCHEME);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setComponent(null);
startActivity(intent);
} catch (Exception e) {
//e.printStackTrace();
}
}
///< android 6.0 两种方式获取intent都可以跳转支付宝成功,7.1测试不成功
else if ((Build.VERSION.SDK_INT > Build.VERSION_CODES.M)
&& (url.contains("platformapi") && url.contains("startapp"))) {
Intent intent;
try {
intent = Intent.parseUri(url,
Intent.URI_INTENT_SCHEME);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setComponent(null);
startActivity(intent);
} catch (Exception e) {
//e.printStackTrace();
}
}
///< 如果是下载的情况,则跳转到浏览器
else if (url.contains("download")) { ///< && url.contains(".apk")
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
} else {
view.loadUrl(url);
}
return true;
///< 调用Native支付 - 接alipaySdk-20180601.jar - https://docs.open.alipay.com/203/106493/
// if (!(url.startsWith("http") || url.startsWith("https"))) {
// return true;
// }
//
// /**
// * 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
// */
// final PayTask task = new PayTask(ExternalLinkerDetailActivity.this);
// boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
// @Override
// public void onPayResult(final H5PayResultModel result) {
// ///< 支付结果返回
// final String url = result.getReturnUrl();
// if (!TextUtils.isEmpty(url)) {
// ExternalLinkerDetailActivity.this.runOnUiThread(new Runnable() {
// @Override
// public void run() {
// view.loadUrl(url);
// }
// });
// }
// }
// });
//
// /**
// * 判断是否成功拦截
// * 若成功拦截,则无需继续加载该URL;否则继续加载
// */
// if (!isIntercepted) {
// 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) {
///< 加载错误的时候会回调,在其中可做错误处理,比如再请求加载一次,或者提示404的错误页面
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request) {
///< 在每一次请求资源时,都会通过这个函数来回调
return super.shouldInterceptRequest(view, request);
}
}
网友评论