最近我其中一个项目需要接入微信支付,实现方式是在WebView里利用Url拉起微信支付页面,但是实际操作的时候却发现始终无法拉起支付页面,最后排查了一段时间,发现原来是因为一个很简单的问题出错了,于是解决问题以后特意想把这个问题记录下来分享,也便于以后自己解决同类问题。
代码如上,每次微信支付走到https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=************,这个开头的url时,就停住了,根本不会跳到weixin://wap/pay?开头的url中,然后再调用startActivity打开微信客户端支付。当时我百思不得其解,到底那里出错了呢,为什么吊不起微信支付,后来我看了一下自己之前的项目,发现我原先的项目是这样的:
可以看到,这里return 返回的是false,问题出在这里。这时我又在想,为什么会这样?
查阅资料以后我发现shouldOverrideUrlLoading的返回值的意义为:
- 若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理,也就是程序员自己做处理。
- 若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。
- 若没有设置 WebViewClient 则由系统(Activity Manager)处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
那么这种情况下,返回值应该改为 false或者super .shouldOverrideUrlLoading(view, url); ,因为微信支付调用https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb这个开头的url后,会重定向到weixin://wap/pay开头的url,然后调用微信客户端支付,如果用true,则WebView不会自动重定向到weixin://wap/pay开头的url,需要程序员自行处理,这种情况下自然是无法吊起支付的。