Curl / php Пустой ответ от IPN-адреса PayPal - PullRequest
1 голос
/ 17 февраля 2020

В последние пару дней наш IPP PayPal перестал работать и получил пустой ответ от PayPal. Ничего не изменилось на сервере или в нашем коде.

Попытка cUrl к URL-адресу IPN PayPal просто возвращает пустой ответ.

$url = "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

$data = curl_exec($ch);
curl_close($ch);

print $data;

Приведенное выше должно возвращать "НЕДЕЙСТВИТЕЛЬНО" и работает как ожидается на моем localhost и от других серверов. Изменение URL-адреса на любой другой домен, кроме PayPal, также работает без проблем.

Так что, похоже, он получил только пустой ответ от paypal.com

Интересно, столкнулся ли кто-нибудь с проблемой или могли бы дать указание, где искать в надежде решить эту проблему?

С уважением, Мусаффар

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Похоже, что Paypal сделал некоторые изменения безопасности в выходные дни. У некоторых пользователей oscommerce с воскресенья появляются похожие симптомы, когда ошибка скручивания оказалась такой:

Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента

В своих случаях это произошло из-за того, что локальная копия сертификата имела только сертификат Paypal, а не root или промежуточные сертификаты, с решением для его обновления.

Рабочий сертификат можно найти в: OSCOM Phoenix github

1 голос
/ 17 февраля 2020

Возможно, я бы начал проверять, выдал ли curl какие-либо ошибки. В этом случае PHP дает вам curl_errno($ch) и curl_error($ch), которые будут возвращать сообщение или, соответственно, код ошибки.

На случай, если в этом нет ничего подозрительного. Возможно, я бы попытался проверить, если вы можете запустить выше из вашего CLI на сервере. (требуется S SH доступ к нему)

curl -H "User-Agent: ..." "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate"

Надеюсь, это даст вам хорошую отправную точку. Пожалуйста, дайте мне знать, если это поможет или вам нужно больше идей.

Редактировать # 2: После добавления комментариев от автора:

cUrl действительно возвращает ошибку: ошибка 35, и сообщение об ошибке выглядит следующим образом:

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

В этом случае я бы предположил, что ваша система устарела и не поддерживает шифры SSL из PayPal. Вы можете попытаться принудительно указать указанную c версию TLS. На сегодняшний день веб-серверы PayPal поддерживают только TLS1.2 или TLS1.3. Вот как вы можете заставить его:

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

или

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_3);

Additionaly @Preston PHX упомянул в комментарии хорошие ссылки на эту проблему, поступающие из PayPal:

...