SagePay 3DS2 3377:ACS 提供了一条错误消息。来自 thephpleague/omnipay-sagepay 的 CReq 验证失败
SagePa 3DS2 3377 : The ACS has provided an Erro message. CReq validation failure from thephpleague/omnipay-sagepay
我正在使用 thephpleague/omnipay-sagepay
https://github.com/thephpleague/omnipay-sagepay
收到3DS Notification的回复后,我运行下面的代码:
$gateway = $this->fetchGateway();
$completeRequest = $gateway->completeAuthorize([
'transactionId' => $payment->transaction_id
]);
$completeResponse = $completeRequest->send();
print "<pre>";
print_r($completeResponse);
并收到以下消息:
[data:protected] => Array (
[VPSProtocol] => 3.00
[Status] => ERROR
[StatusDetail] => 3377 : The ACS has provided an Erro message. CReq validation failure. )
我也试过在 $gateway->completeAuthorize() 函数中包含 CRes 和 CReq,但没有成功。
有人对此有任何线索吗?
协议 4 文档指出:
此 POST 需要包含 VPSTxId(或 MD)和 CRes(或 PARes)。
但如上所述,它似乎不起作用并且 returns CReq 验证错误
不确定这是否相关?
https://dijitul.uk/payment-gateway-3d-secure-timing-out-huge-issue/#comment-121740
我在某处读到 threeDSSessionData 周围的 {} 可能会导致问题,但删除它们没有任何效果。
有点担心截止日期是 3 月 14 日:(
编辑:
我也试过同样的反应:
$gateway = $this->fetchGateway();
$completeRequest = $gateway->completeAuthorize([
'VPSTxId' => str_replace("{", "", str_replace("}", "", $payment->vpsTxId)),
'CRes' => $cres,
'CreateToken' => '1',
]);
$completeResponse = $completeRequest->send();
发送的$payment->vpsTxId 等于:
923DD024-8E55-A543-AA6F-4E76AECB67D8
$cres 等于
ewogICJtZXNzYWdlVHlwZSIgOiAiRXJybyIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjEuMCIsCiAgImFjc1RyYW5zSUQiIDogIjZjOGE2MzQyLTI2OTUtNDAzMi04NDVkLTBmZGU2MDBiYmFhMyIsCiAgImVycm9yQ29kZSIgOiAiMjAzIiwKICAiZXJyb3JDb21wb25lbnQiIDogIkEiLAogICJlcnJvckRlc2NyaXB0aW9uIiA6ICJEYXRhIGVsZW1lbnQgbm90IGluIHRoZSByZXF1aXJlZCBmb3JtYXQgb3IgdmFsdWUgaXMgaW52YWxpZCBhcyBkZWZpbmVkIGluIFRhYmxlIEEuMS4iLAogICJlcnJvckRldGFpbCIgOiAidGhyZWVEU1Nlc3Npb25EYXRhIiwKICAiZXJyb3JNZXNzYWdlVHlwZSIgOiAiQ1JlcSIKfQ
不担心通过 testMode 发帖的安全性
此错误似乎是使用 VPSTxId
作为您的 threeDSSessionData
值的结果。我遇到了同样的问题,但能够通过更改我的 threeDSSessionData
以使用我的数据库中的本地交易 ID 而不是 SagePay 的交易 ID 来解决它。
我注意到的另一件事是,在将 VPSTxId
用作 threeDSSessionData
时,3DS 挑战模拟器实际上并未在 3DS 流程中显示。一旦我切换到使用我自己的交易 ID,它就会恢复。
我设法通过在return输入表单之前从 vpsTxId 中去除括号“{}”来解决这个问题。
为了完整起见,我最终用于 return 表单的代码是:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Redirecting...</title>
</head>
<body onload="document.forms[0].submit();">
<form action="' . $responseMessage->getRedirectUrl() . '" method="' . $responseMessage->getRedirectMethod() . '">
<p>Redirecting to payment page...</p>
<p>
<input type="hidden" name="creq" value="' . $data['creq'] . '" />
<input type="hidden" name="threeDSSessionData" value="' . str_replace(array("{", "}"), "", $data['threeDSSessionData']) . '" />
<input type="submit" value="Continue" />
</p>
</form>
</body>
</html>
这里真正重要的一行是:
str_replace(array("{", "}"), "", $data['threeDSSessionData'])
我真的希望这对其他人有帮助!
我正在使用 thephpleague/omnipay-sagepay https://github.com/thephpleague/omnipay-sagepay
收到3DS Notification的回复后,我运行下面的代码:
$gateway = $this->fetchGateway();
$completeRequest = $gateway->completeAuthorize([
'transactionId' => $payment->transaction_id
]);
$completeResponse = $completeRequest->send();
print "<pre>";
print_r($completeResponse);
并收到以下消息:
[data:protected] => Array (
[VPSProtocol] => 3.00
[Status] => ERROR
[StatusDetail] => 3377 : The ACS has provided an Erro message. CReq validation failure. )
我也试过在 $gateway->completeAuthorize() 函数中包含 CRes 和 CReq,但没有成功。
有人对此有任何线索吗?
协议 4 文档指出:
此 POST 需要包含 VPSTxId(或 MD)和 CRes(或 PARes)。 但如上所述,它似乎不起作用并且 returns CReq 验证错误
不确定这是否相关? https://dijitul.uk/payment-gateway-3d-secure-timing-out-huge-issue/#comment-121740
我在某处读到 threeDSSessionData 周围的 {} 可能会导致问题,但删除它们没有任何效果。
有点担心截止日期是 3 月 14 日:(
编辑:
我也试过同样的反应:
$gateway = $this->fetchGateway();
$completeRequest = $gateway->completeAuthorize([
'VPSTxId' => str_replace("{", "", str_replace("}", "", $payment->vpsTxId)),
'CRes' => $cres,
'CreateToken' => '1',
]);
$completeResponse = $completeRequest->send();
发送的$payment->vpsTxId 等于:
923DD024-8E55-A543-AA6F-4E76AECB67D8
$cres 等于
ewogICJtZXNzYWdlVHlwZSIgOiAiRXJybyIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjEuMCIsCiAgImFjc1RyYW5zSUQiIDogIjZjOGE2MzQyLTI2OTUtNDAzMi04NDVkLTBmZGU2MDBiYmFhMyIsCiAgImVycm9yQ29kZSIgOiAiMjAzIiwKICAiZXJyb3JDb21wb25lbnQiIDogIkEiLAogICJlcnJvckRlc2NyaXB0aW9uIiA6ICJEYXRhIGVsZW1lbnQgbm90IGluIHRoZSByZXF1aXJlZCBmb3JtYXQgb3IgdmFsdWUgaXMgaW52YWxpZCBhcyBkZWZpbmVkIGluIFRhYmxlIEEuMS4iLAogICJlcnJvckRldGFpbCIgOiAidGhyZWVEU1Nlc3Npb25EYXRhIiwKICAiZXJyb3JNZXNzYWdlVHlwZSIgOiAiQ1JlcSIKfQ
不担心通过 testMode 发帖的安全性
此错误似乎是使用 VPSTxId
作为您的 threeDSSessionData
值的结果。我遇到了同样的问题,但能够通过更改我的 threeDSSessionData
以使用我的数据库中的本地交易 ID 而不是 SagePay 的交易 ID 来解决它。
我注意到的另一件事是,在将 VPSTxId
用作 threeDSSessionData
时,3DS 挑战模拟器实际上并未在 3DS 流程中显示。一旦我切换到使用我自己的交易 ID,它就会恢复。
我设法通过在return输入表单之前从 vpsTxId 中去除括号“{}”来解决这个问题。
为了完整起见,我最终用于 return 表单的代码是:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Redirecting...</title>
</head>
<body onload="document.forms[0].submit();">
<form action="' . $responseMessage->getRedirectUrl() . '" method="' . $responseMessage->getRedirectMethod() . '">
<p>Redirecting to payment page...</p>
<p>
<input type="hidden" name="creq" value="' . $data['creq'] . '" />
<input type="hidden" name="threeDSSessionData" value="' . str_replace(array("{", "}"), "", $data['threeDSSessionData']) . '" />
<input type="submit" value="Continue" />
</p>
</form>
</body>
</html>
这里真正重要的一行是:
str_replace(array("{", "}"), "", $data['threeDSSessionData'])
我真的希望这对其他人有帮助!