簡體   English   中英

SagePa 3DS2 3377:ACS 提供了錯誤消息。 來自 thephpleague/omnipay-sagepay 的 CReq 驗證失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM