最近项目要求修改微信/支付宝支付方式,由客户端集成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引发的事故相关推荐

  1. android WebView套壳 H5微信支付

         看博客,首先得看日期,首先吐槽下,第一次做webview  套壳的android  APP  ,项目有微信支付这一块,就百度搜 看别人的博客,有的说android  webview H5 微 ...

  2. ios浏览器微信支付回调页面_iOS集成H5微信支付实现跳转与回调的解决方案

    前言 最近有个需求,不能在iOS客户端内集成支付宝和微信的App支付SDK(为了防苹果审核检测SDK),因此使用H5支付,虽然微信和支付宝的H5支付文档都说不要在App内使用H5支付而是使用App支付 ...

  3. 解决ios H5微信支付不能跳回App的问题

    解决ios H5微信支付不能跳回App的问题 app项目是uni-app开发的安卓和iOS版本,安卓测试无问题,以下主要说iOS的解决方案. 问题点:app用webview打开H5页面,在H5页面发起 ...

  4. java+uniapp对接app微信支付

    java+uniapp对接app微信支付 1.准备工作 注册app APP接入微信支付,需要先将商户APP在微信开放平台进行注册,登记APP开发参数以生成APPID.具体操作步骤如下: 一.登录微信开 ...

  5. iOS WKWebView H5微信支付跳转

    iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: ...

  6. Android WebView 支持H5图片上传input type=file

    2019独角兽企业重金招聘Python工程师标准>>> Android WebView 缓存处理 Android WebView 支持H5图片上传<input type=&qu ...

  7. android webview 网关,在Android webview中CC Avenue支付网关会话过期问题

    "Your session has been expired. Please re-initiate your transaction. Don't worry... It happens ...

  8. h5 微信支付 php,用h5做出微信的支付过程的实现步骤

    这次给大家实现的案例是用户在微信里打开网页的时候,也可以调用微信支付来完成下单功能.当然,微信官网的,开发文档也有很详细的介绍,但是今天我们来教大家怎样手动做出支付接口的开发. 以提交问题流程为例描述 ...

  9. 微信h5支付“网站域名ICP备案主体与商户号主体不一致”的解决方法,H5微信支付 授权函下载

    微信h5支付"网站域名ICP备案主体与商户号主体不一致"的解决方法,H5微信支付 授权函下载 参考文章: (1)微信h5支付"网站域名ICP备案主体与商户号主体不一致&q ...

最新文章

  1. ios之开发屏幕适配和系统版本适配(转载)
  2. pythonddos防御_浅谈拒绝服务攻击的原理与防御(7):用Python和C实现syn flood攻击...
  3. ExecutorService源码解读
  4. 单模光电转换器怎么接_单模光纤收发器怎么连接?
  5. 给Windows 服务添加命令行参数
  6. 来了!华为首款5G双模手机Mate 20 X (5G)发布:这个价格香吗?
  7. 结合html5+_基于 HTML5 结合互联网+的电力接线图
  8. ffmpeg前景_5G时代音视频开发前景怎么样?音视频开发需要掌握哪些技术?
  9. Deepin中如何使用adb和fastboot工具
  10. 快递公司type字典
  11. Win10如何ping端口是否开放
  12. layui上传文件限制选择文件类型 upload.render
  13. Windows 10 word无法创建工作文件,找不到临时环境变量
  14. 零基础CSS入门教程(28)–CSS导航栏实例
  15. iOS 集成Facebook登陆
  16. Win11复制粘贴不了怎么办?Win11无法复制粘贴的解决方法
  17. 怎么在计算机里隐藏文件,怎么显示电脑隐藏文件?
  18. 已取消到该网页的导航 桌面右下角
  19. 汉洛塔问题的递归解决方法
  20. html+css唯品会的登录页面

热门文章

  1. Android”挂逼”修炼之行—防自动抢红包外挂原理解析
  2. Netty系列之Netty百万级推送服务设计要点
  3. c语言字符数组篇之6翻了
  4. 逆傅里叶变IFFT原始信号恢复方法研究-附Matlab代码
  5. 基于SSM的物流仓储管理系统(包远程安装配置和代码讲解)
  6. Arctic Vision极目生物:眼科医药独角兽香港造
  7. kaggle竞赛 | Quora Insincere Question | 文本情感分析
  8. linspace—创建线性等分向量;logspace—创建对数等分向量
  9. echarts实现环形进度图
  10. 如何去除视频水印?分享两种去除视频水印的方法