【问题标题】:Sagepay notification response fails with 5003Sagepay 通知响应失败并显示 5003
【发布时间】:2014-10-29 16:27:04
【问题描述】:

目前我的 SagePay 集成遇到了一些问题。在我必须回复通知 POST 之前,一切都很好。我的脚本以正确的信息响应通知帖子,但实际上我从 SagePay 收到了 5003 内部服务器错误(在其他 html 中)。

我已经多次致电 SagePay 支持,并检查了几笔交易的日志,我可以看到 SagePay 根本没有收到我发送的 POST 数据,这是有道理的,因为我收到了这个 5003 错误。我已确认我在流程早期提供给 SagePay 的 notificationURL 有效,并且 SagePay 能够成功联系该 URL。

以下是将我的响应发送给 SagePay 的相关代码,这也是执行与 SagePay 的初始通信的相同代码,可以正常工作:

    curl_setopt($curlSession, CURLOPT_URL, $url);
    curl_setopt($curlSession, CURLOPT_HEADER, 0);
    curl_setopt($curlSession, CURLOPT_POST, 1);
    curl_setopt($curlSession, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlSession, CURLOPT_TIMEOUT, $ttl);
    curl_setopt($curlSession, CURLOPT_SSL_VERIFYHOST, 2);

    if (!empty($caCertPath))
    {
        curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($curlSession, CURLOPT_CAINFO, $caCertPath);
    } 
    else
    {
        curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, 0);
    }

    $rawresponse = curl_exec($curlSession);

这是可以发送的数据示例,唯一的变化是状态可以正常,而 RedirectURL 可以指向 checkout_thanks.php:

$data['Status'] = 'ERROR';
$data['StatusDetail'] = 'Transaction not found in our system';
$data['RedirectURL'] = 'https://www.e-side.co.uk/checkout_error.php';

正如我所说,我已经设置好了,$rawresponse 变量实际上会通过电子邮件发送给我,所以我可以在这里看到我放入 PasteBin 的响应:http://pastebin.com/73107ga

我只是想补充一点,使用的所有链接都是 https 版本,并且在我尝试将其集成到的站点中有一个有效的 SSL 证书。

谢谢

【问题讨论】:

    标签: opayo


    【解决方案1】:

    好的,在过去几周与 SagePay 支持多次来回后,我已经开始工作了。有两个问题导致了错误。

    首先(这在上面并不清楚)但是发送到 SagePay 的数据用 & 符号分隔,通知请求阶段需要回车换行 (CRLF)。

    因此将构建字符串的部分更改为http_build_query($data, "\n") 解决了这个问题。一个小提示:在我的研究中,我发现 CRLF 字符实际上是 \r\n 而不仅仅是 \n。查看他们提供的 SagePay 开发工具包,他们只是使用\n,所以我使用它来确保它有效。

    下一个问题是我以与使用 curl 启动整个过程相同的方式将此通知请求发布回 SagePay,但事实证明您根本不需要发送 curl 请求,只需回显输出数据,因为 SagePay 会将其读取为对联系通知 URL 的响应。所以最终的代码现在看起来像这样:

    $responseData = arrayToQueryString($data, "\n");
    if ($notificationResponse) {
            echo $responseData; //This line is very very important
            return;             
        } 
    

    您可能会注意到,我还将数据功能换成了 SagePay 在开发套件中提供的功能,arrayToQueryString($data, "\n") 与我上面提到的http_build_query($data, "\n") 的工作完全相同。

    【讨论】:

    • 另一件事:RedirectURL 不能是 urlencoded。在那一点上,这一切都变得有点不一致并且记录不充分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2014-11-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2015-02-03
    • 2015-12-31
    相关资源
    最近更新 更多