2

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

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

  1. 向 SagePay 提出请求以注册交易,包括 ThreeDSNotificationURL,这是 ACS 将在成功与否时重定向您的客户的 URL。
  2. 如果 SagePay 的响应是 3DAUTH,则构建一个向客户显示的表单,其中包含一个 iFrame,其中包含必填字段“acsUrl”、“creq”和“threeDSSessionData”,这些字段是从 SagePay 响应中填写的。(Protocal 4 指南中的第 16 页)。笔记 *

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

  3. 客户在 iFrame 中填写身份验证表。
  4. 发卡行向您的 ThreeDSNotificationURL 发送成功或不响应
  5. 根据 3DSv2 或 (3DSv1) 响应,在此响应中发回三个 DSSessionData 或 (MD) 和 CRes 或 (PARes)。
  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 和 threeDSSessionData 根据上面的第 2.) 点。

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

在 MySagePay 上设置 3DSv2 帐户时是否有任何需要注意的问题?

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

4

4 回答 4

1

史密斯写得好。我同意文档可以更直接。在过去的几周里做了我的头。对于您的 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 几乎相同的方式

这从来没有出现在测试服务器上,只有在直播时才会发生。

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

于 2019-08-29T16:12:57.357 回答
0

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

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

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

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

希望这可以帮助。

于 2019-08-29T19:39:05.613 回答
0

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

  1. 2019 年 9 月 14 日,所有电子商务交易都需要通过某种形式的 3-D Secure。因此,将 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 的 SO 声誉 - 叹息)。

于 2019-09-03T10:55:55.490 回答
0

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

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

于 2019-08-29T19:44:41.513 回答