【问题标题】:SagePa 3DS2 3377 : The ACS has provided an Erro message. CReq validation failure from thephpleague/omnipay-sagepaySagePay 3DS2 3377:ACS 提供了错误消息。来自 phpleague/omnipay-sagepay 的 CReq 验证失败
【发布时间】:2022-08-11 19:41:00
【问题描述】:

我正在使用 phpleague/omnipay-sagepay https://github.com/thephpleague/omnipay-sagepay

收到 3DS 通知的响应后,我正在运行以下代码:

$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)。 但如上所述,它似乎不起作用并返回 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 发布的安全性

  • 目前有完全相同的问题。有趣的是,响应是协议 v3,直到谷歌搜索 ACS 错误消息发现您的(非常新鲜的)问题,我才注意到这一点。
  • 我们当中好像有不少人。希望有人能尽快找到解决方案!
  • 我在下面添加了一个答案。去掉括号后,VPS 协议确实返回 4.00

标签: laravel-8 opayo omnipay


【解决方案1】:

在返回表单之前,我设法通过从 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'])

我真的希望这可以帮助其他人!

【讨论】:

    【解决方案2】:

    此错误似乎是使用 VPSTxId 作为您的 threeDSSessionData 值的结果。我遇到了同样的问题,但能够通过更改我的threeDSSessionData 以使用我的数据库中的本地交易 ID 而不是 SagePay 的交易 ID 来解决它。

    我注意到的另一件事是,当使用VPSTxId 作为threeDSSessionData 时,3DS 挑战模拟器实际上并没有在 3DS 流程中显示。一旦我切换到使用我自己的交易 ID,它就会重新启动。

    【讨论】:

    • 有意思,谢谢你的回复!出于兴趣,您将什么发回 SagePay 以完成授权?
    • 啊,所以我现在显示了模拟器,但在确认后我收到以下错误“5083:回调中提供的 VpsTxId 与 CRes 中的事务不匹配”
    【解决方案3】:

    为了扩展公认的答案,我相信这通常与括号有关。因此,您可能正在尝试提供 VPSTsId 就像在 OP 的情况下一样,或者像我一样您可能正在尝试提供 JSON 对象,它再次包括亲子关系.

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2014-02-21
      • 2018-02-25
      • 2014-01-24
      • 2015-08-11
      • 2012-10-27
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      相关资源
      最近更新 更多