У меня есть проблема, с которой я надеюсь, что кто-то сможет мне помочь, так как поддержка SagePay была такой же полезной, как шоколадный чайник. У меня есть сделанное на заказ решение для электронной коммерции с SagePay Server Integration, некоторые работают под v2.23, другие v3.00. У нас было несколько веб-сайтов внезапно перестали работать.
Уведомление от SagePay пустое, полностью и совершенно пустое. На обоих веб-сайтах нет доступных данных. Тем не менее, у нас есть два других сайта, где все остальное не так, все работает нормально.
Единственное различие между четырьмя сайтами заключается в версии, которая потребовала незначительных изменений в том, что отправляется в SagePay, и где они размещаются. Два рабочих сайта размещены на HeartInternet, тогда как два неработающих сайта размещены на разных хостах, один с 123reg, а другой с неизвестным американским хостом.
SagePay прислал мне свои журналы для пары транзакций, обе из которых показывают данные уведомления, так что, насколько они обеспокоены, они отправляют их мне нормально, и это проблема сервера. Я даже не уверен, где начать отлаживать это.
Не уверен, что это актуально, но я добавил в начале нашего метода уведомления:
public function Notify() {
$this->Load();
define('LOG_FILE', ROOT_LIB . 'sagepaylog-v2.23.txt');
error_log(date('c') . " NEW NOTIFICATION" . PHP_EOL, 3, LOG_FILE);
$input = file_get_contents('php://input');
$query = $response = array();
$exp = explode('&', $input);
foreach($exp as $keyVal) {
$e = explode('=', $keyVal, 2);
$response[$e[0]] = urldecode($e[1]);
}
/* Comment out the above code and uncomment below when testing using POSTMAN.
foreach($_POST as $key => $val) {
$response[$key] = $val;
}*/
error_log("Notification Post Data" . PHP_EOL . "-------------------------" . PHP_EOL, 3, LOG_FILE);
foreach($response as $key => $val) {
error_log("$key: $val" . PHP_EOL, 3, LOG_FILE);
}
//We record the transaction during the initial registration. We need to load the details of that transaction, and of the order for the specified order ID, and make sure they match the details sent to us by SagePay.
$valid = FALSE;
$orders = $this->glob->order->LoadOrderHistory("WHERE ordId = " . (int)$response['VendorTxCode'], TRUE);
if(count($orders)) {
$order = $orders[$response['VendorTxCode']];
} else {
$order = new Order($this->glob);
}
$transaction = new Transaction($this->glob, $order->txnId);
Оказывается, это было вызвано тем, что htaccess перенаправил не-www на www, а URL-адрес уведомления не содержал www. Это было исправлено путем проверки URL-адреса и добавления www впереди, если его еще не было.
Других решений пока нет …