android webview拉起微信h5支付错误解决办法

本文介绍了解决在Android应用中使用WebView加载微信支付链接时出现的“商家参数错误”等问题的方法。通过设置WebView的参数并正确配置Referer,实现微信内部及非微信环境下支付功能的正常调用。

这里坑比较深.网上说的方式也大多没有用.不废话带你解决

1.遇到的问题大概就"商家参数错误";"空白页";"系统繁忙"等等吧
2.问题解决:商家参数错误就是因为没有加Map载loadUrl时候要配置一个Map.key是指定的,url是授权域名
Map<Sting,String> map = new HashMap<>();
map.put("Referer", "http://......");
3.直接用webview去load部分机型可行,因为内核限制的就不行了
4.最终解决方式如下
Map<String, String> map = new HashMap<>();
        map.put("Referer","http://....");
        WebView webView = ((WebView) findViewById(R.id.webview));

        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDefaultTextEncodingName("UTF-8");
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.setWebChromeClient(new WebChromeClient());
        WebViewClient webViewClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                if (url.startsWith("weixin://wap/pay?")) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                } else {
                    Map<String, String> extraHeaders = new HashMap<String, String>();
                    extraHeaders.put("Referer", "http://wxpay.wxutil.com");
                    view.loadUrl(url, extraHeaders);
                }
                return true;
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
                handler.proceed();
            }
        };
        webView.setWebViewClient(webViewClient);
        webView.loadUrl("https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=...", map);



在 Flutter 中使用 `flutter_webview_plugin` 实现 H5 页面拉起微信支付支付,主要依赖于 WebView 中加载的网页内容与设备原生应用之间的交互机制。通常,H5 页面通过特定的 URL Scheme 或者 JavaScript 接口触发支付流程,而原生应用(如微信支付宝)会监听这些 Scheme 并接管支付流程。 ### 实现方式 #### 1. 配置 WebView 支持外部链接跳转 默认情况下,`flutter_webview_plugin` 会拦截所有链接并在 WebView 内部加载。为了支持外部应用(如微信支付宝)的 Scheme 跳转,需要在 WebView 的配置中允许外部链接跳转。 ```dart final flutterWebviewPlugin = FlutterWebviewPlugin(); @override void initState() { super.initState(); flutterWebviewPlugin.onUrlChanged.listen((String url) { if (url.startsWith("weixin://") || url.startsWith("alipay://")) { // 处理微信支付宝 Scheme _handleExternalUrl(url); } }); } void _handleExternalUrl(String url) async { if (await canLaunch(url)) { await launch(url); } else { // 处理无法拉起的情况 print("无法拉起支付应用"); } } ``` #### 2. 加载 H5 支付页面 在 WebView 中加载 H5 支付页面时,确保页面的支付按钮或链接使用了正确的 Scheme。例如: - **微信支付**:通常使用 `weixin://wap/pay` 或类似 Scheme - **支付支付**:通常使用 `alipay://platformapi/startapp` 或类似 Scheme WebView 加载的页面在点击支付按钮时,会触发 Scheme 跳转,系统会根据设备上是否安装了对应的支付应用来决定是否拉起。 #### 3. Android 和 iOS 的适配 ##### AndroidAndroid 上,需要在 `AndroidManifest.xml` 中配置相应的 Scheme 白名单,以允许 WebView 拉起外部应用: ```xml <intent-scheme> <data android:scheme="weixin" /> <data android:scheme="alipay" /> </intent-scheme> ``` 此外,还需要确保应用具有拉起外部应用的权限。 ##### iOS 在 iOS 上,由于 Apple 对 URL Scheme 的限制,需要在 `Info.plist` 文件中添加白名单: ```xml <key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> <string>weixincb</string> <string>alipay</string> </array> ``` 这些配置确保应用可以安全地调用外部 Scheme。 #### 4. 处理支付完成后的回调 支付完成后,用户通常会被重定向回 H5 页面。为了处理这种情况,可以在 WebView 中监听页面 URL 的变化,并根据特定的 URL 执行后续操作: ```dart flutterWebviewPlugin.onUrlChanged.listen((String url) { if (url.contains("payment=success")) { // 处理支付成功逻辑 print("支付成功"); } else if (url.contains("payment=failed")) { // 处理支付失败逻辑 print("支付失败"); } }); ``` #### 5. 安全性与兼容性考虑 - **Scheme 白名单**:确保在 iOS 和 Android 上正确配置 Scheme 白名单,避免因权限问题导致无法拉起支付应用。 - **支付页面适配**:H5 支付页面需要适配移动端浏览器,确保在 WebView 中正常显示。 - **错误处理**:如果用户设备未安装微信支付宝,应提供友好的提示,并引导用户下载安装。 ### 示例代码 ```dart import 'package:flutter/material.dart'; import 'package:flutter_webview_plugin/flutter_webview_plugin.dart'; import 'package:url_launcher/url_launcher.dart'; class PaymentWebView extends StatefulWidget { @override _PaymentWebViewState createState() => _PaymentWebViewState(); } class _PaymentWebViewState extends State<PaymentWebView> { final flutterWebviewPlugin = FlutterWebviewPlugin(); @override void initState() { super.initState(); flutterWebviewPlugin.onUrlChanged.listen((String url) { if (url.startsWith("weixin://") || url.startsWith("alipay://")) { _handleExternalUrl(url); } }); } void _handleExternalUrl(String url) async { if (await canLaunch(url)) { await launch(url); } else { print("无法拉起支付应用"); } } @override Widget build(BuildContext context) { return WebviewScaffold( url: "https://your-payment-page.com", appBar: AppBar( title: Text("H5 支付"), ), withZoom: false, withLocalStorage: true, hidden: true, initialHeaders: {}, ); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值