[英]SagePa 3DS2 3377 : The ACS has provided an Erro message. CReq validation failure from thephpleague/omnipay-sagepay
我正在使用 phpleague/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() function 中包含 CRes 和 CReq,但沒有成功。
有人對此有任何線索嗎?
協議 4 文檔指出:
此 POST 需要包含 VPSTxId(或 MD)和 CRes(或 PARes)。 但如上所述,它似乎不起作用並返回 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 equals ewogICJtZXNzYWdlVHlwZSIgOiAiRXJybyIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjEuMCIsCiAgImFjc1RyYW5zSUQiIDogIjZjOGE2MzQyLTI2OTUtNDAzMi04NDVkLTBmZGU2MDBiYmFhMyIsCiAgImVycm9yQ29kZSIgOiAiMjAzIiwKICAiZXJyb3JDb21wb25lbnQiIDogIkEiLAogICJlcnJvckRlc2NyaXB0aW9uIiA6ICJEYXRhIGVsZW1lbnQgbm90IGluIHRoZSByZXF1aXJlZCBmb3JtYXQgb3IgdmFsdWUgaXMgaW52YWxpZCBhcyBkZWZpbmVkIGluIFRhYmxlIEEuMS4iLAogICJlcnJvckRldGFpbCIgOiAidGhyZWVEU1Nlc3Npb25EYXRhIiwKICAiZXJyb3JNZXNzYWdlVHlwZSIgOiAiQ1JlcSIKfQ
不用擔心通過 testMode 發布的安全性
在返回表單之前,我設法通過從 vpsTxId 中去除括號“{}”來解決此問題。
為了完整起見,我最終用於退貨表格的代碼是:
<!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'])
我真的希望這可以幫助其他人!
我們一直遇到這個完全相同的問題(但使用我們自己的直接集成 pi 方法)。 幾個星期以來,我們在看似隨機的客戶付款中斷斷續續地發生了這個錯誤,一個可以工作,一個會失敗。 我們確定這與特定的發卡機構以及我們通過threeDSSessionData
表單值發送的值類型有關。
我們針對此錯誤的解決方案是對threeDSSessionData
值進行 base64 編碼,然后在從 ACS 返回時解碼 base64 值。
此錯誤似乎是使用VPSTxId
作為您的threeDSSessionData
值的結果。 我遇到了同樣的問題,但能夠通過更改我的threeDSSessionData
以使用我的數據庫中的本地交易 ID 而不是 SagePay 的交易 ID 來解決它。
我注意到的另一件事是,當使用VPSTxId
作為threeDSSessionData
時,3DS 挑戰模擬器實際上並沒有在 3DS 流程中顯示。 一旦我切換到使用我自己的交易 ID,它就會重新啟動。
為了擴展公認的答案,我確實相信這通常與括號有關。 因此,您可能會嘗試像 OP 一樣提供VPSTsId
,或者像我一樣,您可能會嘗試提供JSON
object,它再次包含parentesis 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.