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;
}
}
通用的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调起原生微信或支付宝支付的更多相关文章
- 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列
支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...
- 微信和支付宝支付模式详解及实现(.Net标准库)
支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...
- iOS不用官方SDK实现微信和支付宝支付XHPayKit
作者:朱晓辉Allen 链接:https://juejin.im/post/5a90dd3a6fb9a0634912b755 前言 前段时间由于项目需求,移除了项目中的微信支付SDK和支付宝支付SDK ...
- 关于Java调用接入微信、支付宝支付提现
前言: 本篇文章介绍关于自己写的一个集成微信.支付宝的支付.提现等功能的介绍,本项目已在码云上进行开源,欢迎大家一起来进行改造,使进行更好的创新供大家使用:也有对应的pom文件坐标可以导入,因目前不知 ...
- MUI 微信 和支付宝支付 (前台代码)
<!-- 校园公告详情界面 用于显示校园公告的详情信息 在校园公告界面点击某一条目后 进入本界面查看详情 --> <!DOCTYPE html> <html> &l ...
- 微信端支付宝支付,iframe改造,解决微信中无法使用支付宝付款和弹出“长按地址在浏览器中打开”
微信对支付宝的链接屏蔽了, https://mapi.alipay.com/gateway.do?_input_charset=utf-8¬ify_url=http%3A%2F%2Fzh ...
- 利用抖音Cookie充值接口提取支付链接,个人调起原生微信h5支付宝h5支付
最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...
- Android应用跳转到微信和支付宝扫一扫
新版的微信已经把微信功能的schema都禁掉了,意味着我们无法打开微信的扫一扫等功能,目前正常的只能先进入微信(我测试的时候是微信版本7.0.3)已经是很新的版本了 具体调起微信扫一扫代码如下,测试后 ...
- 实现手机网页调起原生微信朋友圈分享的工具nativeShare.js
http://www.liaoxiansheng.cn/?p=294 我们知道现在我们无法直接通过js直接跳转到微信和QQ等软件进行分享,但是现在像UC浏览器和QQ浏览器这样的主流浏览器自带一个分享工 ...
随机推荐
- Flex布局(CSS Flexbox)
参考:Flex 布局语法教程 Flex布局是什么? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局 注意:设为Fle ...
- 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue
gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...
- Ng第十六课:推荐系统(Recommender Systems)
16.1 问题形式化 16.2 基于内容的推荐系统 16.3 协同过滤 16.4 协同过滤算法 16.5 矢量化:低秩矩阵分解 16.6 推行工作上的细节:均值归一化 16.1 问题形式 ...
- eclipse/sublime 等宽字体设置
转载请注明出处:http://www.cnblogs.com/wubdut/p/4621889.html 使用ubuntu14.04会产生很多想日犬的地方.大家一般习惯于使用 eclipse 进行 j ...
- Yeoman安装和使用详解
Yeoman generator-react-webpack 一 什么是Yeoman Yeoman帮助我们创建项目,提供更好的工具来使我们的项目更多样化. Yeoman提供generator系统,一个 ...
- 4、C语言的编译过程链
在学校学C语言的时候,很多人都不是很注重编译过程链,但是其实编译过程是项目过程中很重要的一部分,有时候有些语法诸如static.volatile等关键词不理解时大多数都是对整个C语言编译链没有进行过详 ...
- hdu 5090 数列贪心加成1~n
http://acm.hdu.edu.cn/showproblem.php?pid=5090 给一段长度为n数列,问能否给任意个数加上k的倍数,使得加完之后恰好只有1~n 贪心,先排序,依次加出1~n ...
- 量子力学与广义相对论的统一——用广义相对论解释海森堡测不准原理 Unification of Quantum Mechanics and General Relativity: Explaining Heisenberg Uncertainty Principle with General Relativity
从海森堡测不准原理的实验开始: 从实验中可以看到,当有光源测定路线,且双孔打开的时候,接收板原波谷处变成了波峰. 对此,广义相对论的解释是:此时电子经过双孔后的轨迹发生了变化.双孔周围的空间弯曲度被光 ...
- linux时间格式总结
原文:https://blog.csdn.net/drcwr/article/details/50971637 %% a literal % 一个文字 %a locale's abbre ...
- 查询字段描述sql-postgresql
查询字段描述sql SELECT 'comment on column ' || n.nspname ||'.'|| c.relname || '.' || a.attname ||' is '''| ...