【问题标题】:How to implement 3D Secure (Verified by Visa / MasterCard SecureCode) in Flutter?如何在 Flutter 中实现 3D Secure(通过 Visa / MasterCard SecureCode 验证)?
【发布时间】:2019-12-23 21:30:56
【问题描述】:

现有的 3DS 实施是这样的,在结帐和付款阶段,它涉及将客户从您的应用程序重定向到银行/发卡机构网站,客户可以在其中输入他们之前设置的密码来验证他们确实是持卡人。然后,该网站会将客户重定向回您的网站,并提供完成交易所需的信息。 如何读取银行服务器对重定向的响应?我尝试通过 webview_flutter 执行此操作,但只能获取 URL 重定向。

Widget _view3ds(PaymentAnswer answer) {
  final url = answer.model['AcsUrl'];
  return Scaffold(
    appBar: AppBar(
      title: const Text('Pay'),
    ),
    body: WebView(
      initialUrl: url,
      initialPostParameters: answer.paramPost3DS(),
      javascriptMode: JavascriptMode.unrestricted,
      onPageFinished: _pageFinished
    ),
  );
}

void _pageFinished(String url)  {
  print(url);
  url.response ??? // Is there a way to get to the server response? Maybe there is another plugin that allows this?
}

有一个运行良好的快速代码:

/// Handle result from 3DS form
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let urlString = request.url?.absoluteString
        if (urlString == Constants.cloudpaymentsURL) {
            var response: String? = nil
            if let aBody = request.httpBody {
                response = String(data: aBody, encoding: .ascii)
            }
            let responseDictionary = parse(response: response)
            webView.removeFromSuperview()
            post3ds(transactionId: responseDictionary?["MD"] as! String, paRes: responseDictionary?["PaRes"] as! String)
            return false
        }
        return true
    }

我可以在纯颤振上得到这样的东西吗?

【问题讨论】:

    标签: swift flutter dart 3d-secure


    【解决方案1】:

    您需要了解支付集成中发生的流程。基本上有应用程序、服务器和支付网关。

    您的应用可能会向您的服务器发起付款,然后您的服务器可能会将此调用重定向到支付网关。或者,您的应用程序可以直接调用支付网关上的链接(这取决于实现)。在任何一种情况下,对支付网关的调用很可能会使用某种callbackUrl 参数启动。支付网关将使用此callbackUrl 通知您任何成功或失败。

    在大多数情况下,如果不是全部,callbackUrl 是一个可公开访问的 url,因此很可能是您的服务器(支付网关无法公开访问您的应用程序以调用任何端点)。请注意,您的应用程序仍然无法访问此数据,因为支付网关直接调用您的服务器。然后,您的服务器将执行 HTTP 重定向,这将由应用程序转到成功或错误页面来反映。

    这个重定向网址是关键。它应该包含一个 transactionId,您以后可以使用它来查询服务器的状态,或者包含为您的下一个工作提供足够信息的一般成功/失败格式。

    另外请理解,以上仅为示例。您必须弄清楚付款流程是如何在您的服务器中实现的。

    要获得 WKWebView 导航功能的句柄,请使用导航委托: https://developer.apple.com/documentation/webkit/wknavigationdelegate

    具体来说,您需要查看委托方法并选择适当的句柄来捕获 url。我认为以下内容会对您有所帮助:

    func webView(WKWebView, didReceiveServerRedirectForProvisionalNavigation: WKNavigation!)
    

    【讨论】:

    • 感谢您的提示,他帮助了我。问题在服务器端解决了。
    【解决方案2】:

    您应该使用 RegExp 解析 url。如果交易成功,我认为它应该是“order_id”或类似的东西

    if (url.contains('order_id')) {
      flutterWebViewPlugin.close();
      RegExp regExp = RegExp("order_id=(.*)");
      var token = regExp.firstMatch(url)?.group(1);
      ...
    } else {
      print('rejected transaction');
    }
    

    【讨论】:

    • 在插件 webview_flutter 中,url 变量是字符串类型。无法读取服务器响应。这是使用webview时如何读取服务器响应的问题。
    • 我知道的唯一方法 - 你应该处理我在上面代码中提到的字符串(字符串 url)。检查 order_id/transaction_id 参数的字符串,如果没有 id 则处理错误。
    猜你喜欢
    • 2013-10-19
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多