You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter WebView加载Mastercard Hosted Checkout仅显示加载动画的问题求助

问题

我在Flutter应用中使用WebView集成Mastercard Payment Gateway Hosted Checkout,计划通过后端获取的Session ID(API版本83,测试环境)打开Mastercard支付门户,但支付门户仅显示加载动画,实际支付页面始终无法加载,控制台日志报错如下:

Flutter代码实现

void loadPaymentPage() {
  print('Step: Starting loadPaymentPage at ${DateTime.now()}');
  if (sessionId == null) {
    print('Step: Session ID is null - Aborting loadPaymentPage at ${DateTime.now()}');
    return;
  }
  print('Step: Session ID available - $sessionId at ${DateTime.now()}');

  String htmlContent = """
<!DOCTYPE html>
<html>
<head>
  <script src="https://test-xxx.gateway.mastercard.com/static/checkout/checkout.min.js"
          data-error="errorCallback"
          data-cancel="cancelCallback"></script>
  <script type="text/javascript">
    function errorCallback(error) {
      console.log(JSON.stringify(error));
    }
    function cancelCallback() {
      console.log('Payment cancelled');
    }
    window.onload = function() {
      Checkout.configure({
        session: {
          id: '$sessionId'
        }
      });
      Checkout.showPaymentPage();
    };
  </script>
</head>
<body>
  <p>Loading payment...</p>
  <div id="embed-target"></div>
  <input type="button" value="Pay with Embedded Page" onclick="Checkout.showEmbeddedPage('#embed-target');" />
  <input type="button" value="Pay with Payment Page" onclick=";" />
</body>
</html>
""";

  _controller.loadHtmlString(htmlContent);
}

控制台错误日志

Possible Unhandled Promise Rejection: [object DOMException]
Unrecognized feature: 'payment'.
Uncaught SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.

请问如何解决Flutter WebView中传入Session ID后Mastercard支付网关门户无法加载的问题?是否需要特殊的WebView设置、权限或变通方案才能让Mastercard Hosted Checkout在Flutter中正常工作?


解决方案

1. 强制开启WebView的JavaScript与存储权限

Mastercard Checkout脚本依赖sessionStorage和完整的JavaScript支持,必须在WebView配置中明确开启相关权限:

WebView(
  controller: _controller,
  javascriptMode: JavascriptMode.unrestricted, // 核心:开启全量JS支持
  initialUrl: 'about:blank',
  onWebViewCreated: (controller) {
    _controller = controller;
  },
  // Android端配置
  androidSettings: AndroidSettings(
    domStorageEnabled: true, // 开启DOM存储(sessionStorage依赖)
    databaseEnabled: true,
    allowFileAccess: true,
    allowContentAccess: true,
  ),
  // iOS端配置
  iosSettings: IosSettings(
    javaScriptEnabled: true,
    domStorageEnabled: true,
  ),
)

2. 放弃本地HTML加载,直接跳转至Mastercard官方支付页面

本地HTML加载会触发跨域和存储权限限制,建议直接构造Mastercard官方支付URL进行加载:

// 替换为你的测试网关域名
String paymentUrl = "https://test-xxx.gateway.mastercard.com/checkout/payment?sessionId=$sessionId";
_controller.loadUrl(paymentUrl);

这种方式让支付脚本在Mastercard自有域名环境下运行,完全规避本地HTML带来的权限问题。

3. 配置导航代理允许Mastercard域名跳转

如果必须使用本地HTML,需通过NavigationDelegate允许WebView与Mastercard网关域名交互:

navigationDelegate: (NavigationRequest request) {
  if (request.url.startsWith('https://test-xxx.gateway.mastercard.com')) {
    return NavigationDecision.navigate;
  }
  return NavigationDecision.prevent;
},

4. 验证Session ID有效性

测试环境下Mastercard Session ID有效期较短,需确保后端返回的Session ID未过期、格式正确,且与测试网关环境匹配。


内容的提问来源于stack exchange,提问作者Dasun Dola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:27:07