3DSv2 Sagepay 直接集成基础知识

2023-11-25

协议 4.00 的文档可能会更有帮助。对于每个努力让 3DSV2 工作的人来说,我希望任何已经设法让 3DSV2 工作的人能够详细阐述基础知识。

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

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

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

  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 位安全密钥进行响应 授权已获批准。
  9. 显示完成页面并告知客户成功或失败 交易成功。
  10. 需要一些澄清,“在后备方案中,The Sage Pay MPI 将执行 3DSv1 注册请求,'最好的方法是什么 从响应中确定正在使用 3DSV1,即 iFrame 表单必须包含 PaReq、MD 和 TermUrl,而不是 creq 和 ThreeDSSessionData 按照上面第 2.) 点。

测试时将CHALLENGE放在卡夹区域,测试3D方面。

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

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


史密斯写得好。我确实同意文档可以更直接。过去几周我的脑子很乱。 对于您的 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

EDIT

WebRequest 和 HttpWebResponse 的 ThreeDSNotificationURL 代码:

   /////////////////////////////////////////////////////////
   //// 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 所示处理响应。

EDIT

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

这在测试服务器上从未出现过,只有在上线时才会出现。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3DSv2 Sagepay 直接集成基础知识 的相关文章

  • 如何覆盖“::-webkit-scrollbar”CSS规则并使滚动条再次可见

    我使用以下规则使滚动条不可见 webkit scrollbar display none 如何覆盖此规则以使滚动条再次可见 我尝试了以下方法 webkit scrollbar display initial 在这种情况下 滚动条保留其空间
  • 默认情况下向 gcc 添加一些标志(最好使用 specs 文件)

    我想让我的gcc默认情况下总是添加一些标志 有没有一种干净的方法可以做到这一点 基本上我每次调用时都会传递一些标志gcc 例如 但不限于 g 这样它就有调试信息 有几种解决方法 但它们都很丑陋 alias g 但我不喜欢这种方法 编写一个围
  • Java user.home 被设置为 %userprofile% 并且未被解析

    我们公司最近从 Windows XP 升级到 Windows 7 Enterprise JDK安装不再设置用户主页到用户目录的完整路径 而是将 user home 设置为 userprofile 这导致 Eclipse Maven 等应用程
  • Express 4.0 中的“扩展”是什么意思?

    我在我的应用程序中使用 Express 和 body parser app use bodyParser urlencoded extended false 但是 express 4 0 中的 扩展 是什么意思 我找到了这个 extende
  • 如何清除Python脚本中间的所有变量?

    我正在Matlab中寻找类似于 clear 的东西 一个命令 函数 它从工作区中删除所有变量 从系统内存中释放它们 Python中有这样的东西吗 编辑 我想编写一个脚本 在某个时候清除所有变量 以下命令序列确实删除了every当前模块的名称
  • Google API 密钥的有效期是多久?

    我正在使用获取播放列表的详细信息Youtube API V3使用 API 密钥 我找不到任何有关API KEY有效期的信息 我想确保在应用程序过期之前为其重新生成新的 API 密钥 公共 API 密钥位于底部谷歌开发者控制台API 和身份验
  • 播放 HTTP Live Streaming 视频时访问 AVPlayer 的数据

    我正在使用 AVPlayer 播放 HTTP 实时流媒体视频 有什么办法可以访问播放器的缓存数据并将其保存在本地吗 太长了 这并非不可能 但结果很可能不会那么好 请记住 HTTP 视频流实际上由多个带宽流组成 其中每一个都被分为更小的 MP

随机推荐

  • ffmpeg 格式设置,矩阵 bt709

    有谁知道我如何实现以下色彩空间 bt 709 通过 FFmpeg 这是我的文件中现在的内容 正如你所看到的Format settings Matrix默认情况下 我该如何设置它 格式设置 矩阵 自定义或标准 组件原色 BT 709 传输特性
  • border-radius 应该裁剪内容吗?

    当容器有时 我的容器中的内容不应该被切断吗 border radius HTML 和 CSS 示例 progressbar height 5px width 100px border radius 5px buffer width 25px
  • 从网站打开新的 Outlook,mailTo 链接太长,*.eml 文件密件抄送字段未加载

    我正在尝试打开一个 eml使用 Microsoft Outlook 2010 文件并遇到问题bcc field 这是我的eml file To email protected Subject Mail Subject cc email pr
  • 如何向soapVars添加属性

    我想创建具有如下属性的soapVars
  • Firebase/Android - 定期丢失数据库连接

    我遵循了 Firebase 身份验证和数据库的文档 全新安装后一切正常 用户可以注册或登录 数据按应有的方式检索 按应有的方式写入 超快 超干净 耶 然后 通过 android Studio 重新启动几次后 数据库的东西就不再工作了 重新启
  • 即使线程中的方法已返回,为什么 Thread.Join() 仍会挂起?

    我有一个 WPF 应用程序 它使用一些库代码进行身份验证 需要在单线程单元线程中运行 我的方法是生成一个单独的线程来获取身份验证对象 阻塞直到线程返回 然后继续执行 然而 在some即使线程方法已返回 我的应用程序也会挂在 Thread J
  • 在docker中更改JAVA_HOME

    我想要 dockerise 的遗留 Web 应用程序使用一些旧的类 例如com sun image codec jpeg ImageFormatExceptionJava SE7 之前都支持 现在在 docker 容器中默认的 jdk 获取
  • 如何在 R 中重用管道运算符长链的部分?

    我有一组管道操作员链 gt 用不同的数据集做不同的事情 例如 dataset gt mutate gt filter gt rowwise gt summarise gt etc 如果我想重用这些链的某些部分 有没有办法做到这一点 而不仅仅
  • 线程忽略键盘中断异常

    我正在运行这个简单的代码 import threading time class reqthread threading Thread def run self for i in range 0 10 time sleep 1 print
  • 使用 IronPython 访问 Pandas 库

    我的目标是将 Python 连接到 NET 以实现流程 我正在使用 IronPython Python 部分涉及一些计算 我使用 Pandas 库 有没有办法连接 IronPython 和 Pandas 我发现使用 IronPython 我
  • 在 Swift 中对 PDF 进行注释/绘图

    我正在编写一个应用程序 其中包含多个 PDF 文档 我将根据用户的输入在屏幕上显示这些文档 显示后 我希望允许用户在 PDF 上绘图 注释 然后我想保存带有绘图 注释的 PDF 以供以后使用 我一直在无休止地搜索有关 PDF 注释的教程 但
  • 文本提取 - 逐行

    我正在使用 Google Vision API 主要是为了提取文本 我工作得很好 但对于我需要 API 扫描输入行的特定情况 在移动到下一行之前吐出文本 然而 该 API 似乎正在使用某种逻辑 使其从左侧从上到下扫描 然后移动到右侧并进行从
  • NGINX:如何在一台服务器或域名中设置多个端口?

    我是 Nginx 新手 我的设置遇到问题 我希望我的服务器在公共上使用多个端口运行 例如 server listen 443 ssl server name
  • D 中异常处理的开销

    在 D2 编程语言中 使用异常处理对性能有何影响 尤其 如果我不写异常处理代码怎么办 如果我这样做了 但没有抛出任何异常怎么办 如果我这样做并且抛出异常怎么办 异常处理是否会导致错过任何优化机会 是否可以像许多 大多数 C 实现中那样禁用异
  • 无法在“ApplicationUser”上配置密钥,因为它是派生类型,但 ApplicationUser 上没有密钥配置

    我正在尝试使用 ApplicationUser 自定义 IdentityUser 我按照微软文章中的步骤操作 但是当我运行应用程序时 我在方法上收到此错误base OnModelCreating modelBuilder System In
  • ES6 对象中的方法:使用箭头函数

    在 ES6 中 这两个都是合法的 var chopper owner Zed getOwner function return this owner 并且 作为简写 var chopper owner Zed getOwner return
  • 如何使用 mongo Java 驱动程序 3.0+ 检查文档是否存在于集合中

    使用新的3 0 java驱动程序来自 mongo 检查文档是否存在于集合中的最佳方法是什么 我看过here并尝试做类似的事情 我只做到了这一点 FindIterable
  • 如何仅删除字符串中的 html 标签?

    我已经编写了删除 HTML 标签的代码 但它也删除了a
  • 除了日志记录和事务管理之外,AOP 还有哪些实际应用?

    我理解这些原理 但我很难看出实际应用在哪些地方 请赐教 询问任何支持人员 日志记录是notAOP的一个很好的应用 他们不关心应用程序内部调用什么方法 他们关心应用程序正在执行的重要操作 并需要以他们理解的方式呈现该信息 要创建像样的日志 您
  • 3DSv2 Sagepay 直接集成基础知识

    协议 4 00 的文档可能会更有帮助 对于每个努力让 3DSV2 工作的人来说 我希望任何已经设法让 3DSV2 工作的人能够详细阐述基础知识 我将根据我的理解总结流程 请大家帮忙纠正必要的地方并添加任何问题 例如从 VPSTx Id 中删