Flutter 将 Paypal 按钮与 WebView 集成

Fre*_*red 4 paypal-subscriptions android-webview dart wkwebview flutter

我在将 PayPal 集成到webview_flutter时遇到了一个奇怪的问题。这似乎与 WebView 有关,因为当我在 iOS Safari 或 Chrome 中打开它时,它工作正常。

我的问题是,在 PayPal 订阅过程的某个阶段,(准确地说是最后一步),PayPal 窗口一直处于“正在处理”状态。

首先,让我展示一下我的 WebView 作品:

    WebView(
      initialUrl: builtURL,
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController webViewController) {
        _controller = webViewController;
      },
      javascriptChannels: Set.from(
        [
          JavascriptChannel(
              name: 'OnApprove',
              onMessageReceived: (JavascriptMessage message) async {

              }),
          JavascriptChannel(
              name: 'OnSuccess',
              onMessageReceived: (JavascriptMessage message) {

              }),
          JavascriptChannel(
              name: 'OnCancel',
              onMessageReceived: (JavascriptMessage message) {

              }),
          JavascriptChannel(
              name: 'OnError',
              onMessageReceived: (JavascriptMessage message) {

              }),
        ],
      ),
    )
Run Code Online (Sandbox Code Playgroud)

我使用 Javascript 通道能够从 JavaScript 调用 Dart 代码中的函数。

这一切正常,我可以看到我的 PayPal 按钮,如下所示:

在此处输入图片说明

我也可以点击(按)它们。

我可以登录 Paypal,所有这些步骤都运行良好。

那太好了,但让我向您展示在我按下“同意并订阅”后会发生什么(只是最后一步表现得很奇怪):

在此处输入图片说明

是开始处理...

这就是它卡在 iOS 上的地方(只是说......):

在此处输入图片说明

在 Android 上,它会进入一个空白屏幕:

在此处输入图片说明

现在,我可以无限等待,什么也不会发生——它只是停留在每个平台的相应屏幕上。

如前所述,如果我在这些设备上的浏览器中打开它,它确实可以正常加载并正确完成 PayPal 进程,然后返回到主 WebView 屏幕。

有没有人见过这个?和PayPal打开的“弹窗”有什么关系?

需要注意的是,如果我按右上角的“X”关闭 PayPal 弹出窗口,它仍然会触发“onCancel”事件 - 所以它不像是卡住了 - 也许它只是无法加载页面或其他东西。 ..

任何帮助将不胜感激!

编辑 1:我设法在 Safari 中调试 WebView,这是我收到的错误消息。这些错误消息是有道理的。尤其是 SAMEORIGIN 问题。也许这就是它最有可能失败的原因。这是输出: 在此处输入图片说明

有没有人知道如何使用 WebView 解决这个问题?提前致谢!

Fre*_*red 7

因此,经过许多小时的谷歌搜索和寻找替代方案后,我有了根本不使用 WebView 的想法。我现在使用url_launcheruni_links,而不是使用webview_flutter插件,这在这种情况下是有限的。

我首先调用url_launcher打开浏览器,其中包含托管在我们域中某处的 HTML 页面。此 html 页面旨在仅从移动应用程序中显示。

随着uni_links,当组件didChangeDependencies(在配置环节之后,当然Info.plistAndroidManifest.xml),我初始化他们是这样的:

Future<Null> initUniLinks() async {
    _sub = getUriLinksStream().listen((Uri uri) async {
        //Do something with uri... for example...
        
        Map<String, String> queryParameters = uri.queryParameters;
        String action = queryParameters["action"];

        switch (action) {
            case "onSuccess":
                //Do something...
            break;
        });
}
Run Code Online (Sandbox Code Playgroud)

所以本质上发生了什么,是我打开了一个正确的浏览器窗口。然后使用普通的 HTML 和 Javascript,我仍然检测到 PayPalonApprove()功能等。但是,然后这些功能执行,我打开uni link,这导致打开我们离开的应用程序。

如果 WebView 给您带来问题,这是一个不错的选择。更多的配置,但它适用于我的情况。

我仍然对任何其他建议持开放态度:) - 即使我已经从这个开始 - 了解更多信息会很有趣!