不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述Android H5调起原生微信或支付宝支付相关的知识,希望能为你提供帮助。
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;
}
}
【Android H5调起原生微信或支付宝支付】通用的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开发 - 掌握ConstraintLayout分组(Group)
- android中Post方式发送HTTP请求
- 使用Fidder从安卓模拟器获取APP打开网址
- Array.apply(null,{length:6}).map()
- 360文件管理器下载|360文件管理器安卓版下载
- elasticsearch篇之mapping
- 从零开始搭建架构实施Android项目
- 动态规划——Maximum Sum of 3 Non-Overlapping Subarrays
- GDscript中的类