协议 4.00 的文档可能会更有帮助。对于每个努力让 3DSV2 工作的人来说,我希望任何已经设法让 3DSV2 工作的人能够详细阐述基础知识。
我将根据我的理解总结流程,请大家帮忙纠正必要的地方并添加任何问题,例如从 VPSTx_Id 中删除 {} 大括号。
如果 SagePay 的响应是 3DAUTH,则构建一个表单以向客户显示,其中包含带有必需字段“acsUrl”、“creq”和“thirdDSSessionData”的 iFrame,这些字段是从 SagePay 响应中填写的。(协议 4 指南第 16 页)。笔记 *
该文档说要使其成为自动提交表单,但最好告知客户为什么要向银行进行身份验证并让他们单击按钮继续。青年MMV
Opayo 从我们的付款请求中返回,要求我们联系https://www.rsa3dsauth.co.uk/3ds2/cReqWebBased?issuer=barclays”进行 3D 安全身份验证,因此我们发送以下内容:
<form id="c-form" method="POST" action="https://www.rsa3dsauth.co.uk/3ds2/cReqWebBased?issuer=barclays">
<input type="hidden" name="creq" value="*removed for data protection*" />
<input type="hidden" name="threeDSSessionData" value="tQtpVHCcCVGEhPNDaeCtMK9I%2fREJERnarovmuZPsM4M6xy6gks9rOYix36waoxOn1wukcobCFbfd2jpmVDVDwZjrd3MzJtmpyFDEAu5R9azVveH6kBEXc5F2ETnFijQfEj5l6EzmH7EnMzbTlFHgbkDGR%2fH9CtURo0K2VSUKHN4%3d" />
<script>
document.addEventListener("DOMContentLoaded", function()
{
var b = document.getElementById("c-form");
b && b.submit();
});
</script>
</form>
Run Code Online (Sandbox Code Playgroud)
我们回来了
POST https://xxxxx.xxxxxxx.xxx/api/payment/3dsecurechallenge?eid=ctl00_cphMain_Payment_SagePay_ThreeD
cres=*removed for data protection*&threeDSSessionData=
Run Code Online (Sandbox Code Playgroud)
请注意,下面没有任何内容&threeDSSessionData=,它应该将字符串返回给我们。
文档说:

还有谁有相同的问题吗?
任何人都可以告诉我为什么sagepay抛出5006(无法重定向到供应商的网站.),我可以将交易发布到sagepay并且能够在sagepay结束时提供信用卡信息.但是,我的问题是,一旦它返回我的通知页面,它会抛出错误5006.
我无法达到我的成功或失败的URL.
使用PayPal,我可以非常轻松地创建BuyNow按钮,包含我的商家信息,价格,税金,运费等.这是否可以在SagePay中使用?
我正在使用SagePay Forms,目前正在将他们的VB示例转换为c#.我取得了很好的进展,所以我的项目的加密部分工作正常(SagePay可以解密).
我遇到的问题是,当我尝试解密字符串时,它会变成垃圾.如果有人这样做之前我真的很感激我的解密代码的一些帮助.我已经包含了有效的加密代码,前两行是来自另一种方法的设置和调用.
我没有添加VB代码,但如果需要,我可以添加它.如果不需要,不想要一个巨大的帖子.
实用方法:
public string byteArrayToHexString(byte[] ba)
{
return BitConverter.ToString(ba).Replace("-", "");
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
主加密方法,前几行是从较大的方法中提取的调用.
string crypt = "blahblahblah"
string EncryptAndEncode = "@" + byteArrayToHexString(aesEncrypt(crypt));
private byte[] aesEncrypt(string inputText)
{
RijndaelManaged AES = new RijndaelManaged();
//set the mode, padding and block size for the key
AES.Padding = PaddingMode.PKCS7;
AES.Mode = CipherMode.CBC;
AES.KeySize = 128;
AES.BlockSize = 128; …Run Code Online (Sandbox Code Playgroud) 这是一个PHP(Zend Framework 1.11)站点,不使用现成的软件包.当请求:
https://live.sagepay.com/gateway/service/vspserver-register.vsp
Run Code Online (Sandbox Code Playgroud)
(用TxType的PAYMENT),我得到如下回应:
4020 : Information received from an Invalid IP address.
Run Code Online (Sandbox Code Playgroud)
我已登录SagePay管理区域并将实时服务器的IP地址添加到有效IP部分,我已确保使用正确的SagePay URL发布到和.
一个重要的注意事项是,这个问题是今天早上开始的,当时我们通过更改Vendor属性更改了付款发送到的SagePay帐户.
更新:使用表单集成方法在其他帐户上使用此相同帐户(供应商),但相关站点使用服务器集成方法.个人帐户可以支持多种不同的付款方式,还是需要激活另一种?我在管理面板中看不到与此相关的任何选项.
我使用表单集成实现了SagePay付款.我的实现是基于SagePay提供的.Net集成工具包,一切都很好.
最近我们启用了3D Secure,并且当值3DSecureStatus返回值时遇到了问题NOTAVAILABLE.
看起来当NOTAVAILABLE返回值时,在对程序ConvertToSagePayMessage()集中SagePayIntegration类的方法的调用中抛出错误SagePay.IntegrationKit.DotNet.dll.
特别是,将值解析为ThreeDSecureStatus枚举时会发生此错误.此枚举没有NOTAVAILABLE能够解析的值,因此错误.
我现在暂时解决了这个问题.此修补程序替换了NOTAVAILABLE值NONE,因此现在解析为有效的枚举值.这是在调用之前完成的ConvertToSagePayMessage()
cryptDecoded = cryptDecoded.Replace("3DSecureStatus=NOTAVAILABLE", "3DSecureStatus=NONE");
Run Code Online (Sandbox Code Playgroud)
我只是想知道为什么ThreeDSecureStatus枚举没有值NOTAVAILABLE,因为NOTAVAILABLE它是预期返回的值之一,这在SagePay提供的表单集成协议指南中有所概述.并希望实现更强大的修复,而不是字符串替换.
Sagepay Simulator是否支持协议3.00?我试过但它给了我"你提供的VPSProtocol字段包含无效数据.它应该包含值2.23".
我正在尝试修复这个不受支持的 SagePay 插件中的一些已弃用的功能。
如何替换 WooCommerce 中以下已弃用的代码片段?
foreach ($order->get_items() as $item) {
if ($item['qty']) {
$product = $order->get_product_from_item($item);
Run Code Online (Sandbox Code Playgroud)
我可以看到这是它的替代品:
@deprecated 在未来版本中添加弃用通知。替换为
$item->get_product()
但仅仅改变它是$product = $item->get_product();行不通的。我也尝试将该行更改为:
$product = wc_get_product($item['id']);
但它会在结帐过程中导致内部服务器错误。
我试图使用"表单集成"方法将SagePay支付网关集成到网站中.
基本上,表单集成方法的工作原理是,只要选择了FORM的Submit按钮,就可以在网页中插入FORM并将信息发布到SagePay的服务器.在将信息发送到SagePay的服务器之前,必须使用AES/CBC/PKCS#5算法对其进行加密,然后再进行Base 64编码.
我有加密的基本知识,但我没有在PHP中使用它的经验.有谁能帮我用PHP制定AES/CBC/PKCS#5算法?
到目前为止,这是我的努力:
$CRYPT = "Text Goes Here";
$blocksize = 16;//Does 16 Refer To 16 Bytes Or 16 Bits? 16 Bytes = 128 Bits.
$cryptLength = strlen($CRYPT);
$cryptLengthModuloBlocksize = $cryptLength % $blocksize;
$pad = $blocksize - $cryptLengthModuloBlocksize;
$padString = str_repeat(chr($pad), $pad);
$CRYPT = $CRYPT . $padString;
$encryptionPassword = 'password';
$Encrypted_CRYPT = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionPassword, $CRYPT, MCRYPT_MODE_CBC);
$Base64_Encrypted_CRYPT = base64_encode($Encrypted_CRYPT);
echo "<form action = 'https://test.sagepay.com/gateway/service/vspform-register.vsp' method = 'POST'>
<input type = 'hidden' name = 'VPSProtocol' value = '3.00' />//
<input …Run Code Online (Sandbox Code Playgroud) 我正在网站上整合Sagepay表格.我已经在测试模式下完成了事务,但是当我实现它时,我得到以下错误
表单事务错误状态缺少格式错误的3045货币字段
我正在使用他们的API从SagePay下载交易数据.调用的结果给了我一个XML字符串,然后我反序列化并存储在一个类中.
每次调用检索最多50条记录,我在给定datetime范围内进行多次调用,直到检索到所有记录.这适用于前X次调用,但后来出现错误:
System.Xml.dll中发生了未处理的"System.InvalidOperationException"类型异常
附加信息:XML文档中存在错误(1,141).
内部异常:{"对于无符号字节,值太大或太小."}
XML document (1, 141).每次尝试时,值并不总是保持不变.如果我看看这个位置上的角色,我看不出有什么不对.
在这个例子中,字符141是"t" <totalrows>:
<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><vspaccess><errorcode>0000</errorcode><transactions><startrow>251</startrow><endrow>300</endrow><totalrows>16684</totalrows>
Run Code Online (Sandbox Code Playgroud)
在<startrow>251表明,5个成功的电话有这样一个真实出错之前消失.
反序列化代码:
XmlSerializer serializer = new XmlSerializer(typeof(vspaccess));
StringReader rdr = new StringReader(xmlDoc.InnerXml);
vspaccess sageTransactions = (vspaccess)serializer.Deserialize(rdr);
Run Code Online (Sandbox Code Playgroud)
vspaccess 是由VS2013生成的类(粘贴特殊)
我错过了什么?
我显然无法发布所有XML,因为它是实时交易信息,但如果我错过了任何所需信息,请告诉我