Android webview对接H5微信支付,ERR_UNKNOWN_URL_SCHEME引发的事故
最近项目要求修改微信/支付宝支付方式,由客户端集成SDK方式更改为H5支付,既然提出需求,就只好撸代码了,客户端对接H5支付的处理过程中,遇到了一个小问题,问题是:由于微信支付只能在客户端进行,当手机未安装微信客户端的时候,webview会报如下的错误信息:
The webpage at weixin://wap/pay?prepayid=xxxx........ could not be loadedbecause: net::ERR_UNKNOWN_URL_SCHEME
也就是在未安装微信客户端的情况下,没有对应的浏览器支持打开weixin://wap/pay?prepayid=xxxx… ,这用户体验肯定差咯,就去找前端商量,前端有没有什么法子能实现判断客户端是否安装微信客户端咯,结果是不能,解决方案是:客户端这边判断,然后写个JS交互接口方法提供前端调用(此方案我认为是最好的法子),但我嫌麻烦,我就提出:前端弄一个简单的提示页面,通过webview.loadUrl的方式加载自定义提示页面,替换无法加载微信内部链接的错误页面,代码如下:
/**是否安装微信客户端,默认安装**/
private boolean isInstalledWeiXin = true;webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {try {/**安装了支付宝或者微信客户端,打开对应支付**/if (url.contains("platformapi/startApp") || url.contains("weixin://wap/pay?") ) {Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));startActivity(intent);return true;}} catch (Exception e) {e.printStackTrace();/**未安装微信客户端,屏蔽无法加载微信内部链接的错误页面提示,通过webview.loadUrl的方式加载自定义提示页面,* 提示用户先下载并安装微信客户端,由于支付宝支持H5支付,不用另行处理**/if (url.contains("weixin://wap/pay?")) {/**加载自定义提示页面**/view.loadUrl(Constants.UNINSTALL_WEIXIN_URL);isInstalledWeiXin = false;}return false;}return super.shouldOverrideUrlLoading(view, url);}});public void goBack(Webview webView){if (webView.canGoBack()) {if (isInstalledWeiXin) {webView.goBack();} else {isInstalledWeiXin = true;/**若未安装,则通过loadUrl方式跳转到支付页面,否则是默认的错误提示页面**/webView.loadUrl(url);}} else {finish();}
}
美滋滋的运行,在交互方面又出幺蛾子了,现象:
步骤1:支付页面选微信支付,点支付:,(未安装微信客户端)来到自定义提示页面-------正常
步骤2:自定义提示页面点击返回,来到了支付页面-------正常
步骤3:支付页面再次点击返回,来到了自定义提示页面-----与实际要求不符
实际要求:步骤3中支付页面点击返回,应该返回到进入支付页面的入口页面。导致原因:进行步骤2后,自定义提示页面成为了上一级页面。
解决思路:在每个页面加载完成后,拿到webview的上一级页面的url,与自定义提示页面的url进行对比,若相同,则清除webview的历史页面记录,保证步骤3能返回到进入支付页面的入口页面,否则,不做处理,保证不影响其他页面的二级页面能正常返回上一级页面。修改代码如下:
/**是否安装微信客户端,默认安装**/
private boolean isInstalledWeiXin = true;webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {try {/**安装了支付宝或者微信客户端,打开对应支付**/if (url.contains("platformapi/startApp") || url.contains("weixin://wap/pay?") ) {Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));startActivity(intent);return true;}} catch (Exception e) {e.printStackTrace();/**未安装微信客户端,屏蔽无法加载微信内部链接的错误页面提示,通过webview.loadUrl的方式加载自定义提示页面,* 提示用户先下载并安装微信客户端,由于支付宝支持H5支付,不用另行处理**/if (url.contains("weixin://wap/pay?")) {/**加载自定义提示页面**/view.loadUrl(Constants.UNINSTALL_WEIXIN_URL);isInstalledWeiXin = false;}return false;}return super.shouldOverrideUrlLoading(view, url);}@Overridepublic void onPageFinished(WebView view, String url) {/**当前页面加载完毕,若上一个页面是自定义的微信客户端未安装提示页面,* 则清除webview加载的历史页面,保证除自定义提示页面外,其他页面的二级页面能正常返回上一级页面**/if (Constants.UNINSTALL_WEIXIN_URL.equals(getWebviewLastUrl(view))) {webView.clearHistory();}super.onPageFinished(view, url);}});/**返回点击调用**/
private void goBack(Webview webView){if (webView.canGoBack()) {if (isInstalledWeiXin) {webView.goBack();} else {isInstalledWeiXin = true;/**若未安装,则通过loadUrl方式跳转到支付页面,否则是默认的错误提示页面**/webView.loadUrl(url);}} else {finish();}/**获取webview上一级页面的url**/private String getWebviewLastUrl(WebView webView) {String lastUrl = "";/**获取webview历史页面列表,包括back/forward**/WebBackForwardList webBackForwardList = webView.copyBackForwardList();if (null != webBackForwardList && webBackForwardList.getSize() != 0) {/**得到当前历史记录项的索引**/int currentIndex = webBackForwardList.getCurrentIndex();/**得到当前索引的历史记录项**/WebHistoryItem historyItem = webBackForwardList.getItemAtIndex(currentIndex - 1);if (null != historyItem) {/**的得到历史记录项的url**/lastUrl = historyItem.getUrl();}}return lastUrl;}
到这里终于处理好了,总结一下:自己想的这个方案真是自己挖坑给自己跳,但既然挖坑了,就想办法填补,也算是给自己一个磨炼吧(只能这样来安慰自己了)!文中提到2个方案,推荐使用方案1:客户端判断是否安装客户端,然后写一个JS交互接口提供给前端调用。
Android webview对接H5微信支付,ERR_UNKNOWN_URL_SCHEME引发的事故相关推荐
- android WebView套壳 H5微信支付
看博客,首先得看日期,首先吐槽下,第一次做webview 套壳的android APP ,项目有微信支付这一块,就百度搜 看别人的博客,有的说android webview H5 微 ...
- ios浏览器微信支付回调页面_iOS集成H5微信支付实现跳转与回调的解决方案
前言 最近有个需求,不能在iOS客户端内集成支付宝和微信的App支付SDK(为了防苹果审核检测SDK),因此使用H5支付,虽然微信和支付宝的H5支付文档都说不要在App内使用H5支付而是使用App支付 ...
- 解决ios H5微信支付不能跳回App的问题
解决ios H5微信支付不能跳回App的问题 app项目是uni-app开发的安卓和iOS版本,安卓测试无问题,以下主要说iOS的解决方案. 问题点:app用webview打开H5页面,在H5页面发起 ...
- java+uniapp对接app微信支付
java+uniapp对接app微信支付 1.准备工作 注册app APP接入微信支付,需要先将商户APP在微信开放平台进行注册,登记APP开发参数以生成APPID.具体操作步骤如下: 一.登录微信开 ...
- iOS WKWebView H5微信支付跳转
iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: ...
- Android WebView 支持H5图片上传input type=file
2019独角兽企业重金招聘Python工程师标准>>> Android WebView 缓存处理 Android WebView 支持H5图片上传<input type=&qu ...
- android webview 网关,在Android webview中CC Avenue支付网关会话过期问题
"Your session has been expired. Please re-initiate your transaction. Don't worry... It happens ...
- h5 微信支付 php,用h5做出微信的支付过程的实现步骤
这次给大家实现的案例是用户在微信里打开网页的时候,也可以调用微信支付来完成下单功能.当然,微信官网的,开发文档也有很详细的介绍,但是今天我们来教大家怎样手动做出支付接口的开发. 以提交问题流程为例描述 ...
- 微信h5支付“网站域名ICP备案主体与商户号主体不一致”的解决方法,H5微信支付 授权函下载
微信h5支付"网站域名ICP备案主体与商户号主体不一致"的解决方法,H5微信支付 授权函下载 参考文章: (1)微信h5支付"网站域名ICP备案主体与商户号主体不一致&q ...
最新文章
- ios之开发屏幕适配和系统版本适配(转载)
- pythonddos防御_浅谈拒绝服务攻击的原理与防御(7):用Python和C实现syn flood攻击...
- ExecutorService源码解读
- 单模光电转换器怎么接_单模光纤收发器怎么连接?
- 给Windows 服务添加命令行参数
- 来了!华为首款5G双模手机Mate 20 X (5G)发布:这个价格香吗?
- 结合html5+_基于 HTML5 结合互联网+的电力接线图
- ffmpeg前景_5G时代音视频开发前景怎么样?音视频开发需要掌握哪些技术?
- Deepin中如何使用adb和fastboot工具
- 快递公司type字典
- Win10如何ping端口是否开放
- layui上传文件限制选择文件类型 upload.render
- Windows 10 word无法创建工作文件,找不到临时环境变量
- 零基础CSS入门教程(28)–CSS导航栏实例
- iOS 集成Facebook登陆
- Win11复制粘贴不了怎么办?Win11无法复制粘贴的解决方法
- 怎么在计算机里隐藏文件,怎么显示电脑隐藏文件?
- 已取消到该网页的导航 桌面右下角
- 汉洛塔问题的递归解决方法
- html+css唯品会的登录页面