【问题标题】:Flutter Integrate Paypal Buttons with WebViewFlutter 将 Paypal 按钮与 WebView 集成
【发布时间】:2019-12-14 20:27:34
【问题描述】:

我在将 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) {

              }),
        ],
      ),
    )

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

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

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

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

这很好,但是让我来告诉你,在我按下“同意并订阅”之后会发生什么(只是最后一步的行为很奇怪):

正在开始处理...

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

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

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

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

以前有人见过吗? 跟支付宝打开的“弹窗”有关系吗?

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

任何帮助将不胜感激!

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

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

【问题讨论】:

    标签: flutter dart android-webview wkwebview paypal-subscriptions


    【解决方案1】:

    因此,经过许多小时的谷歌搜索和寻找替代方案后,我产生了根本不使用 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;
            });
    }
    

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

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

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

    【讨论】:

    • 您能帮我如何将 PayPal 集成到 Flutter 中,我对此一无所知,或者您可以向我推荐任何教程。提前致谢
    • 我知道flutter没有官方的SDK,这种情况下如何集成Paypal?
    • 嗨@Toyed,我还没有找到足够好的教程,它们都不能像你期望的那样工作——因此我最初在这里问自己这个问题。我也许可以写一篇关于这个的教程。在这种情况下,我将在 cmets 中发布一个链接,或者作为我答案更新的一部分。但是,现在,请考虑实现 webview_flutter - 访问网页 - 并使用 uni_links 获取传递的一些数据并采取相应措施(大致如上所示)
    • 你是如何检测到paypal的onApprove功能的?
    • 另外@MoralCode 不要忘记从手机/模拟器中删除应用程序,然后让 Flutter 重新安装它,让 uni_links 正常工作
    【解决方案2】:

    如日志所述,您发送的请求来自 Origin null。 这意味着请求的来源来自本地页面,而不是需要在您的贝宝帐户中定义的可信来源。 Paypal 的 api 应该在为您提供此网页的服务器上实现 贝宝上的端点不接受这一点。 在这里阅读更多:Paypal Access-Control-Allow-Origin

    【讨论】:

    • 谢谢:)。这些错误是不言自明的,因为 WebView,一旦它打开 Paypal 弹出窗口,就不会显示与我们打开它时相同的来源 - 我只是想找到一个解决方法,如果可能的话,仍然使用 WebView - 我有一个解决方法对我来说很好 - 如果有兴趣,请查看我的答案。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2012-01-29
    • 2021-01-28
    • 1970-01-01
    • 2013-06-01
    • 2013-02-25
    相关资源
    最近更新 更多