【问题标题】:3DSv2 Sagepay Direct Integration basics3DSv2 Sagepay 直接集成基础知识
【发布时间】:2020-01-02 22:18:02
【问题描述】:

Protocol 4.00 的文档可能会更有帮助。对于所有努力使 3DSV2 正常工作的人,我希望任何设法使其正常工作的人都能详细说明基础知识。

我将按我的理解总结流程,请大家帮忙,在必要时更正并添加任何问题,例如从 VPSTx_Id 中删除 {} 大括号。

  1. 向 SagePay 请求注册交易,包括 ThreeDSNotificationURL 是 ACS 将重定向的 url 您的客户是否成功。
  2. 如果 SagePay 的响应是 3DAUTH,则构建一个表单以显示给 包含带有必填字段“acsUrl”的 iFrame 的客户 “creq”和“threeDSSessionData”,从 SagePay 填写的字段 回复。 (Protocal 4 指南中的第 16 页)。注意 *

    文档中说要使其成为自动提交表单,但它可能 最好告知客户他们为什么要进行身份验证 他们的银行并让他们单击按钮继续。 YMMV

  3. 客户在 iFrame 中填写身份验证表。
  4. 发卡行回复成功或未回复您的 三DSNotificationURL
  5. 三个DSSessionData 或(MD)和CRes 或(PARes)在此发回 响应取决于 3DSv2 或 (3DSv1) 响应。
  6. 您的 ThreeDSNotificationURL 代码必须随后发布到 SagePay 回调页面 VPSTxId 和 Cres 或 MD 和 PARes 再次取决于 3DSv2 或 3DSv1
  7. 如果 3DS 身份验证成功,SagePay 将请求卡授权 成功。
  8. SagePay 然后使用 VPSTxId 和 10 位 SecurityKey 进行响应,如果 授权已获批准。
  9. 显示完成页面并告知客户成功与否 交易成功。
  10. 需要澄清一下,“在备用方案中,The Sage Pay MPI 将执行 3DSv1 注册请求,'什么是最好的方式 从响应中确定正在使用 3DSV1,即 iFrame 表单必须包含 PaReq、MD 和 TermUrl,而不是 creq 和 根据上述第 2.) 点的三个DSSessionData。

在测试时,将 CHALLENGE 放在持卡人字段中以测试 3D 方面。

在 MySagePay 上为 3DSv2 设置帐户时有什么需要注意的问题吗?

抱歉,这篇文章太长了,但我敢肯定有很多人试图在截止日期之前完成这项工作。

【问题讨论】:

  • 当银行完成对客户的身份验证后,它会在回调 url 上回调我的系统,但是在质询窗口 (iFrame) 清除和我的脚本在回调时执行之间存在延迟。这可能会让客户感到困惑,有没有办法显示处理正在继续并且客户应该等待片刻的消息?
  • 这取决于您如何处理 3DS 响应,我实现它的方式是一种接受 CRES POST、设置 CRES 以进行处理并返回视图的方法。该视图有一些处理图形和对另一个方法的调用,该方法检查 cres 然后根据通过/失败进行重定向。

标签: opayo 3d-secure


【解决方案1】:

检查您发送到 SagePay 的 PaRes 是否没有空格。我发现我回来的一些 PaRes 有空格。我将空格 (" ") 替换为 + 号,如下所示:

PaRes = PaRes.Replace(" ", "+")

然后我在 URL 中使用更改后的值。

您说的是 3DSecure 版本 1,对吗? 3DSecure 版本 2 查找 cres(小写字母的 cres)。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我认为它是 v1,因为它在 URL 中。这对我来说都是新的。我还没有看到任何地方提到过 V2?

    无论如何返回的 PaRes 中没有任何空格。

    【讨论】:

      【解决方案3】:

      WRT“deadline”提到,我对时间线的理解如下:

      1. 2019 年 9 月 14 日,所有电子商务交易都需要通过某种形式的 3-D 安全。因此,将 Direct API v3.00 或 v4.00 与 3-D Secure 集成会很好(消费者将通过 v4.00 获得更好的体验)。 SagePay 也在这个时候启用了他们的 v4.00 API,我预计这可能会出现一些问题。
      2. 2020 年某个时间点:所有交易都应通过 3-D Secure V2(即 Direct API v4.00),因为卡方案(即 Visa / MasterCard)将停止支持 3-D Secure V1。因此,所有与 SagePay 直接集成以进行电子商务支付的商家都将升级到 v4.00

      Smitthhy - 要在 SagePay 测试系统上测试用户必须做某事的流程,您必须通过 CardHolderCHALLENGE 发送(我无法回复其他帖子,因为我没有还拥有 50 的声望 - 叹息)。

      【讨论】:

      • 最近来自 Sagepay 的电子邮件(2020 年 11 月 25 日)设置了 3Dv2 的日期:which will be enforced from the 31 December 2020 in Europe and the 14 September 2021 in the UK respectively
      【解决方案4】:

      史密斯写得很好。我同意文档可以更直接。在过去的几周里做了我的头。 对于您的 1),您需要发布文档中提到的所有必填字段。 至 8) 您从 SagePay 获得更多数据。如下所示:

      VPSProtocol=4.00
      Status=OK
      StatusDetail=0000 : The Authorisation was Successful.
      VPSTxId={1B19CB3F-E553-0E69-CFD5-6D75B53753C1}
      SecurityKey=UAW4ZETUK7
      TxAuthNo=2261559
      AVSCV2=SECURITY CODE MATCH ONLY
      AddressResult=NOTMATCHED
      PostCodeResult=NOTMATCHED
      CV2Result=MATCHED
      3DSecureStatus=OK
      CAVV=Q042ZUZRWndDbjAyWHRjYUFkZ2c=
      DeclineCode=00
      ExpiryDate=1035
      BankAuthCode=999778
      

      至 9) 您可以通过检查从 SagePay 获得的 StatusDetails 来区分 3DSecure v1 和 3DSecure v2。

      3DSv1 returns StatusDetail=2007
      3DSv2 returns StatusDetail=2021
      

      我在结帐页面调用的类文件中进行付款处理。该类将响应返回到结帐页面,其中包含我需要的详细信息。对于 v1 和 v2,它们是不同的。

      For v1 I return:
      return "v1" + Status + "&3DSecureStatus=" + s3DSecureStatus + "&MD=" + sMD + "&ACSURL=" + sACSURL + "&PAReq=" + sPAReq + "&VendorTxCode=" + o.OrderID;
      
      For v2 I return:
      return "v2" + Status + "&3DSecureStatus=" + s3DSecureStatus + "&VPSTxId=" + sVPSTxId + "&ACSURL=" + sACSURL + "&CReq=" + sCReq + "&VendorTxCode=" + o.OrderID;
      

      这使我可以在结帐代码中进行相应的操作。

      我将 v1 重定向到带有 iFrame 的页面。 iFrame 加载之前在响应中收到的 ACSURL。这会立即显示“挑战”窗口。

      这主要是因为 SagePay 接受带有 3DSv1 查询字符串的 URL 并期望 3DSv2 的表单发布。

      v2 使用 iFrame 重定向到另一个页面。 iFrame 首先在我的网站上加载一个页面:

      <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ChallengeiFrame.aspx.cs" Inherits="ac_ChallengeiFrame" %>
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head id="Head1" runat="server">
           <title></title>
      </head>
      <body>
       <div id="content">
       <div id="contentHeader">
          Your Bank requires Authentication
       </div>
       <p>
           Please click the button below to continue.
       </p>
      
       <form action="<%= sACSUrl %>" method="post">
           <input type="hidden" name="creq" value="<%= sCReq %>" />
           <input type="hidden" name="threeDSSessionData" value="<%= sVPSTxId %>" />
           <input type="submit" value="Click to continue" />
       </form>
       </div>
       </body>
       </html>
      

      单击按钮发布到 ACSURL 并显示挑战窗口。 客户填写密码并提交。 银行响应您为 v1 分配的页面,它是 TermUrl,而对于 v2,它是 ThreeDSNotificationURL。

      在这些页面上,您发布您需要发布的内容并处理来自 SagePay 的回复。如果一切顺利,付款已收到,您可以将客户重定向到感谢页面并完成订单。

      基本上,我使用 2 组代码文件来处理 3DSv1 和 3DSv2。喜欢将其分开,一旦 3DSv1 停产,我只需删除这些文件并删除我的付款处理页面和结帐页面中的代码块。那么应该直截了当。

      希望这会有所帮助。

      这里是 3DSecure v2 文档的链接: DIRECT_Integration_and_Protocol_4_Guidelines.pdf

      编辑

      WebRequest 和 HttpWebResponse 的三个DSNotificationURL 代码:

         /////////////////////////////////////////////////////////
         //// This is to get the posted results from the bank
         /////////////////////////////////////////////////////////
         NameValueCollection coll;
         coll = Request.Form;
         /////////////////////////////////////////////////////////
         string sSagePayUrl = "";
         if (EcommerceSettings.bLiveTransactions()) //That's just some logic so I can control live or test at one place in a settings class file.
         {
              sSagePayUrl = "https://live.sagepay.com/gateway/service/direct3dcallback.vsp?";
         }
         else
         {
              sSagePayUrl = "https://test.sagepay.com/gateway/service/direct3dcallback.vsp?";
         }
         ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
         WebRequest request = WebRequest.Create(sSagePayUrl + "cres=" + coll["cres"] + "&VPSTxId=" + coll["threeDSSessionData"]);
         // Get the response.
         HttpWebResponse getResponse = (HttpWebResponse)request.GetResponse();
         // Display the status.
         // Get the stream containing content returned by the server.
         Stream dataStream = getResponse.GetResponseStream();
         // Open the stream using a StreamReader for easy access.
         StreamReader reader = new StreamReader(dataStream);
         // Read the content.
         string responseFromServer = reader.ReadToEnd();
         // Cleanup the streams and the response.
         reader.Close();
         dataStream.Close();
         getResponse.Close();
         //Check the response and act accordingly
      

      您需要为 3DSv1 构建不同的请求: 这是我在 TermUrl 页面中的方式:

      vendorTxCode = Request.QueryString["VendorTx"];
      NameValueCollection coll;
      coll = Request.Form;
      sMd = coll["MD"];
      sPaRes = coll["PaRes"];
      
      ////////////////////////////////////////////////////
      //// Build post to SagePay
      ////////////////////////////////////////////////////
      StringBuilder sb = new StringBuilder();
      if (EcommerceSettings.bLiveTransactions())
      {
          sb.Append("https://live.sagepay.com/gateway/service/direct3dcallback.vsp?");
      }
      else
      {
          sb.Append("https://test.sagepay.com/gateway/service/direct3dcallback.vsp?");
      }
      sb.Append("VendorTxCode=");
      sb.Append(sOrderID);
      sb.Append("&MD=");
      sb.Append(sMD);
      sb.Append("&PaRes=");
      sPaRes = sPaRes.Replace(" ", "+");//HttpUtility.UrlEncode(sPaRes);
      sb.Append(sPaRes);
      string sRequestQuery = sb.ToString();
      
      /////////////////////////////////////////////////////
      //// Post To SagePay 3DCallback page
      /////////////////////////////////////////////////////
      ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
      WebRequest request = WebRequest.Create(sRequestQuery);
      

      如 v2 所示处理响应。

      编辑

      我发现您最好为 3DSv1 发布帖子,并且不要使用 URL 参数,因为有些银行不接受这个。与 3DSv2 的方式几乎相同

      这从未出现在测试服务器上,仅在上线时发生。

      看起来测试服务器并没有提供我们上线后遇到的各种可能性。

      【讨论】:

      • 谢谢 我同意最好将 v1 和 v2 的代码分开。我仍然不清楚“第 6 步:3D-Authenticaiton 和您的网站回调”(协议 4 指南)的机制。完成后(无论成功与否),ACS 会将您的客户重定向回您在 ThreeDSNotificationURL 中提供的 URL,您在步骤 2 中提供了该 URL(或 TermURL)。 ACS 如何将我的客户重定向回 ThreeDSNotificationURL?他们是否在我打开带有 iFrame 的页面的同一窗口中打开 ThreeDSNotificationURL/TermURL,以便他们向银行进行身份验证?
      • Smitthhy,一旦挑战(任一协议)完成(将数据发布到银行),银行就会发回结果。对于 3DS v2,答案转到 ThreeDSNotificationURL(我的解决方案中的 aspx 页面),在那里我向 SagePay 发出 WebRequest(我将编辑我的答案并添加一些代码)。这些页面处理来自 WebRequest 的响应,如果收到成功的付​​款,则发送到感谢页面并完成所有操作。
      • 在持卡人姓名中使用魔法值 - 请参阅文档第 28 页。挑战将提供一个 3DS v2 挑战窗口。 STATUS201DS 模拟回退到 3DSv1。没有工作。发现其他值总是返回OK。上周与 SagePay 支持进行了交谈,他们正在努力。
      猜你喜欢
      • 2019-12-10
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2018-05-25
      • 2014-11-28
      • 2014-02-14
      相关资源
      最近更新 更多