flutter接入H5支付微信支付宝不能唤醒app解决方案

flutter接入H5支付微信支付宝

webview容器

推荐使用: webview_flutter

根据webview_flutter文档允许运行js后,前端通过window.localtion.href跳转 唤醒微信支付宝,并不能正常唤醒。

在 navigationDelegate 下拦截 唤醒 app请求,然后导入url_launcher想用launch拉起微信和支付宝的小手,会吊起IOS微信、安卓支付宝。但是就是吊不起IOS支付宝、安卓微信。

最后公司大佬接手后,不断的测试。发现页面在等待一段时间后就可以正常唤醒app

然后在onWillPop添加future 正常唤醒app 完成支付请求

onWillPop: () {
    Navigator.pop(context);
    // 安卓端微信H5支付吊不起来 大多是是因为这个
    if (title == 'H5网站title属性') {
        return Future.value(false);
    } else {
        return Future.value(true);
    }
}

不得不说,大佬就是大佬

最后,完整拦截打开app代码如下:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart';

///通用webview
class WebViewPage extends StatefulWidget {
  String title; // 网址title
  String data; // 网页地址
  WebViewPage(this.data, this.title);

  @override
  WebViewExampleState createState() => WebViewExampleState(data, title);
}

class WebViewExampleState extends State<WebViewPage> {
  var data;
  var title;
  late WebViewController _controller;

  WebViewExampleState(this.data, this.title);

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        Navigator.pop(context);
        // 安卓端微信H5支付吊不起来 大多是是因为这个
        if (title == 'H5网站title属性') {
          return Future.value(false);
        } else {
          return Future.value(true);
        }
      },
      child: Scaffold(
          body: Wrap(
        children: [
          Container(
            height: MediaQuery.of(context).size.height,
            child: WebView(
              // 网页地址
              initialUrl: data,
              // 允许运行js
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (controller) {
                _controller = controller;
                // 给网页添加referer头信息
                _controller.loadUrl(data, headers: {"Referer": data});
              },
              // 拦截支付
              navigationDelegate: (NavigationRequest request) {
                if (Platform.isAndroid) {
                  if (request.url.startsWith("https://wx.tenpay.com")) {
                    _controller.loadUrl(request.url,
                        headers: {"Referer": 'H5 Referer'});
                    return NavigationDecision.prevent;
                  }
                  if (request.url.startsWith("weixin://wap/pay")) {
                    launch(request.url);
                    return NavigationDecision.prevent;
                  }
                  if (request.url.startsWith("alipays") ||
                      request.url.startsWith("alipay://")) {
                    launch(request.url);
                  }
                } else if (Platform.isIOS) {
                  if (request.url.startsWith("weixin://wap/pay") ||
                      request.url.startsWith("alipays") ||
                      request.url.startsWith("alipay://")) {
                    launch(request.url);
                  }
                }
                return NavigationDecision.navigate;
              },
              // 与JS约定好的方法名
              javascriptChannels: <JavascriptChannel>[
                // goBackLastPage
                JavascriptChannel(
                  name: "方法名",
                  onMessageReceived: (JavascriptMessage message) {
                    // 吧啦吧啦
                    // message js传入的参数
                  },
                ),
              ].toSet(),
            ),
          )
        ],
      )),
    );
  }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
通过flutter的webview_flutter插件,我们可以在应用中嵌入支付微信支付,并实现支付功能。使用webview_flutter的步骤如下: 1. 首先,在`pubspec.yaml`文件中引入webview_flutter插件。可以在dependencies部分添加`webview_flutter: ^2.0.0`,然后运行`flutter pub get`命令进行依赖安装。 2. 在需要嵌入支付功能的页面中,导入webview_flutter插件。在页面的顶部引入`import 'package:webview_flutter/webview_flutter.dart';`。 3. 在页面的主体中,创建一个WebView组件,并指定需要加载的URL。例如,在Container中使用WebView组件,可以使用如下代码: ```dart Container( child: WebView( initialUrl: 'https://www.alipay.com/', javascriptMode: JavascriptMode.unrestricted, ), ) ``` 4. 在支付微信支付的URL中,传递相关的支付参数,例如订单号、支付金额等。 5. 在WebView组件中,可以通过注册一个JavaScript channel来监听网页中的支付回调信息。例如,在页面初始加载完成后,可以通过使用`onPageFinished`回调方法来执行一段JavaScript代码,监听支付结果。在该代码中,可以通过调用与原生平台交互的方法,将支付结果返回到Flutter中进行处理。 6. 在Flutter中,可以根据支付结果展示相关的提示信息,例如支付成功、支付失败等。 需要注意的是,支付微信支付的具体接口和参数可能会根据版本的更新而有所变化,所以在代码实现中需要根据最新的文档进行调整。同时,为了确保支付过程的安全性,建议在应用中对支付接口进行适当的安全设置,例如使用HTTPS协议,并对支付参数进行加密处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值