PayPal IPN в ЛАЙВ-режиме и ошибка SSL_ERROR_SYSCALL, errno 60

256
16 января 2018, 14:05

Здравствуйте все!

Моя проблема коротко обозначена в заголовке вопроса. Я знаю, что не только у меня есть такая же проблема и что многие сталкиваются с ней. Поэтому, прежде чем задать свой вопрос, я пользовался поиском по всему stackoverflow и прочитал множество ответов на подобные вопросы. Я испробовал ВСЕ варианты решения, которые здесь предлагались, но ни один из них не помог мне решить эту проблему.

Я использую простой php-скрипт для обработки IPN и получения подтверждения о проведёной транзакции, в результате которого информация об этой транзакции заносится в мою БД и отправляется в письме покупателю с ссылкой на скачивание файла.

Всё отлично работает в тестовом режиме SANDBOX - в БД заносятся данные и отправляется почта покупателю. Так же я проверял в IPN-симуляторе и тоже никаких ошибок не получал - выдаёт сообщение "IPN was sent and the handshake was verified."

Но как только я переключаюсь в LIVE режим, то в логе получаю такую запись: "SSL_ERROR_SYSCALL, errno 60" и на этом выполнение скрипта останавливается до следующих попыток отправки IPN, которые так же заканчиваются с той же ошибкой.

Ниже приведён код листенера, который я использую:

<?php
$raw_post_data  = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$paypal_post    = array();
foreach ($raw_post_array as $keyval) {
    $keyval = explode ('=', $keyval);
    if (count($keyval) == 2) {
        $paypal_post[$keyval[0]] = urldecode($keyval[1]);
    }
}
//extract vars
extract($paypal_post, EXTR_OVERWRITE);
// build request
$req = 'cmd=' . urlencode('_notify-validate');
$ipn_vars = 'cmd=' . urlencode('_notify-validate');
foreach ($paypal_post as $k => $v) {
    $v = urlencode($v);
    $req .= "&$k=$v";
}
// sort array keys (only after building $req var which will be used to send curl to paypal)
ksort($paypal_post);
foreach ($paypal_post as $k => $v) {
    $ipn_vars .= "\n$k=" . urldecode($v);
}
// paypal mode
$paypal_mode = 1;
// sandbox on/off
if($paypal_mode == 1) {
    $paypal_url = 'https://www.paypal.com/cgi-bin/webscr';
    //for IPN-simulator:
    //$paypal_url = 'https://ipnpb.paypal.com/cgi-bin/webscr';  
}
// else is production site
else {
    $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
    //for IPN-simulator:
    //$paypal_url = 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr';
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $paypal_url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
$res = curl_exec($ch);
//Check if any error occured
if(curl_errno($ch)) {
    error_log("Got " . curl_error($ch); . " when processing IPN data");
}
else {
    if (strcmp (trim($res), "VERIFIED") == 0) {
        //here is the code for adding information to the database, downloading the link for downloading the file and sending the mail to the buyer.
    }
    else if (strcmp (trim($res), "INVALID") == 0) {
        //here is the code to send mail to the seller, if the transaction has not been verified
    }
}
?>

Как видите, в этом коде отключена проверка сертификата в опциях cURL, но в результате я всё равно получал ошибку "SSL_ERROR_SYSCALL, errno 60"!

Ок. Я скачал последний актуальный файл сертифика по этой ссылке: https://curl.haxx.se/docs/caextract.html и включил проверку сертификата в опциях CURL по этой инструкции: http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/, изменив эти строки:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

и добавив путь к файлу сертификата (конечно же я указал реальный путь к файлу, куда его положил):

curl_setopt($ch, CURLOPT_CAINFO, getcwd() . '/cert/cacert.pem');

Но я всё равно продолжаю получать ту же самую ошибку: SSL_ERROR_SYSCALL, errno 60!

Подскажите, пожалуйста - что не так в моём коде? Какие ещё могут быть варианты решения данной проблемы?

PS: Насколько я понимаю, конфигурация моего сервера полностью соответствуют требованиям:PHP 5.6, TLS v1.2, OpenSSL 1.0.1k, в php.ini включена поддержка open_ssl

PS: Техподдержка сервера (valuehost.ru) ничем не смогла мне помочь. Сказали, что всё должно работать, ищите ошибку в своём коде:(

READ ALSO
PHP не понятное поведение array unshift / array filter

PHP не понятное поведение array unshift / array filter

Здравствуйте, мне нужно удалить пустые элементы массива, и добавить один элемент в началоЯ могу сделать это так:

218
Настройка чпу на сайте

Настройка чпу на сайте

Здравствуйте! Пытаюсь настроить чпу на сайте (первый раз), для этого создал файлhtaccess в корне

211
Редактирование таблицы как в PhpMyAdmin [требует правки]

Редактирование таблицы как в PhpMyAdmin [требует правки]

В PhpMyAdmin можно релактировать данные кликнув дважды на ячейкеВозможно ли сделать такою же систему со своими таблицами и базо данных?

270
Почему неверно срабатывает валидатор?

Почему неверно срабатывает валидатор?

Есть страница регистрации:

276