需求: flutter项目中使用webView, webView中使用微信h5支付.
1. 方案1, 使用webview_flutter库(安卓失败)
webview_flutter: 0.3.22+1
WebView(
initialUrl: 'https://www.example.com',
javascriptMode: JavascriptMode.unrestricted,
navigationDelegate: (NavigationRequest request) async{
var url = request.url;
print('拦截URL = $url');
if(url.startsWith("weixin://wap/pay?"))
{
await launch(url);
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
webView中接入微信h5支付, 正常只要拦截url(weixin://wap/pay?), 打开微信app即可。iOS中正常可以进行微信支付,但是在安卓手机上就坑了, 拦截之后, 打开微信后就报错(商家参数格式有误, 请联系商家解决), 前后端一切切配置都是正常的, 就是安卓报错.
经过搜索发现安卓中的webView有一个参数 ignoreSSLErrors, 忽略SSL错误, 设置为true即可. 但是webview_flutter库里面并没有该参数, 故使用flutter_webview_plugin
库.
方案2, 使用flutter_webview_plugin
把ignoreSSLErrors参数设置为true, 即可解决安卓中出现的问题
final _flutterWebviewPlugin = new FlutterWebviewPlugin();
WebviewScaffold(
url: widget.url,
withJavascript: true,
clearCache: true,
ignoreSSLErrors: Platform.isAndroid ? true: false,
)
void initState() {
_flutterWebviewPlugin.onStateChanged.listen((event) async{
if (event.type == WebViewState.shouldStart) {//拦截即将展现的页面
if (event.url.startsWith("weixin://")) {
_flutterWebviewPlugin.stopLoading();//停止加载
await launch(event.url);
return;
}
if(event.url.startsWith("alipays://") || event.url.startsWith("alipay://")) {
await launch(event.url);
}
}
super.initState();
}