此刻我的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证书。
由于
答案 0 :(得分:3)
好的,所以经过SagePay的支持,在过去的几个星期里,我得到了很多工作。有两个问题导致错误。
首先(以上情况并未明确)但发送给SagePay的数据正在与&符号,通知请求阶段需要回车换行(CRLF)。
因此,将构建字符串的部分更改为http_build_query($data, "\n")
解决了这个问题。小记:在我的研究中,我发现CRLF字符实际上是\ r \ n而不仅仅是\ n。通过他们提供的SagePay开发工具包,他们只需使用\ n所以我选择了它以确保它有效。
下一个问题是我将此通知请求发送回SagePay的方式与我使用curl启动整个流程的方式相同,但事实证明您根本不需要发送卷曲请求只有回显数据,因为SagePay会将其读作联系notificationURL的响应。所以最终的代码现在看起来像这样:
$responseData = arrayToQueryString($data, "\n");
if ($notificationResponse) {
echo $responseData; //This line is very very important
return;
}
您可能会注意到我还将数据功能交换为SagePay在开发工具包中提供的功能,arrayToQueryString($data, "\n")
执行与上面提到的http_build_query($data, "\n")
完全相同的工作。