Paypal IPN ответ работает для Paypal, но не для песочницы-Paypal?

Поэтому я использую пример кода, предоставленного Paypal, чтобы правильно общаться и проверять входящие сообщения IPN. Используя предоставленный Paypal инструмент разработчика «IPN Simulator», я могу подтвердить, что мой код прослушивателя IPN способен успешно выполнить рукопожатие с серверами Paypal, однако, когда пришло время повторно отправить информацию для проверки, я могу только успешно соединиться с не -sandbox версия PayPal (которая в любом случае возвращает недействительный, потому что все настроено для связи с песочницей PayPal). Когда я пытаюсь подключиться к версии песочницы, я получаю сообщение об ошибке http, означающее, что я не могу подключиться к серверам.

Я думаю, что я выделил проблему в этой строке кода:

$fh = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); //HTTP error

Код ниже демонстрирует мое тестирование, чтобы увидеть, какие URL могут работать:

$fh = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);//works, returns invalid

$fh = fsockopen ('tls://www.paypal.com', 443, $errno, $errstr, 30);//works, returns invalid

$fh = fsockopen ('www.paypal.com', 443, $errno, $errstr, 30);//Does not work but does not throw HTTP Error (does not return Verified or Invalid either)$fh = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);//HTTP error

$fh = fsockopen ('tls://www.sandbox.paypal.com', 443, $errno, $errstr, 30);//HTTP error

$fh = fsockopen ('www.sandbox.paypal.com', 443, $errno, $errstr, 30);//Does not work but does not throw HTTP Error (does not return Verified or Invalid either)

Вот мой код прослушивателя IPN в настоящее время на моих серверах (Дополнительный код для регистрации данных IPN в моих базах данных не показан для простоты; также вот ссылка, на которой основан этот код: https://developer.paypal.com/docs/classic/ipn/gs_IPN/):

<?php

// STEP 1 - acknowledge PayPal's notification

header('HTTP/1.1 200 OK');// STEP 2 - create the response we need to send back to PayPal for them to confirm that it's legit

$resp = 'cmd=_notify-validate';
foreach ($_POST as $parm => $var)
{
$var = urlencode(stripslashes($var));
$resp .= "&$parm=$var";
}// STEP 3 - Get the HTTP header into a variable and send back the data we received so that PayPal can confirm it's genuine

$httphead = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$httphead .= "Content-Type: application/x-www-form-urlencoded\r\n";
$httphead .= "Content-Length: " . strlen($resp) . "\r\n\r\n";

// Now create a ="file handle" for writing to a URL to paypal.com on Port 443 (the IPN port)

$errno ='';
$errstr='';

$fh = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); //PROBLEM?

// STEP 4 - Nearly done.  Now send the data back to PayPal so it can tell us if the IPN notification was genuine

if (!$fh) {

// Uh oh. This means that we have not been able to get thru to the PayPal server.  It's an HTTP failure

}

// Connection opened, so spit back the response and get PayPal's view whether it was an authentic notification

else    {
fputs ($fh, $httphead . $resp);
while (!feof($fh))
{
$readresp =  fgets ($fh, 1024);
// $readresp = trim($readresp);
if (strcmp ($readresp, "VERIFIED") == 0) //yay verified data!
{}

else if (strcmp ($readresp, "INVALID") == 0) //Invalid data! :(
{
}
}
fclose ($fh);
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>

</body>
</html>

Вот мой код кнопки:

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="M8IC3G88S5WFQ">
<input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

Любая помощь с чем fsockopen() Конфигурация я должен использовать?

1

Решение

Ну, я заставил его работать, установив частный сертификат SSL на моем домене (должен быть 2048-битный и SHA-256), что означает, что вы должны иметь HTTPS.

Я также начал использовать официальный пример PHP-кода для слушателя Paypal, который можно найти здесь: https://github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php.

Кроме того, я добавил curl_setopt($ch, CURLOPT_SSLVERSION, 6); для примеров операторов curl кода для использования связи TSLv1.2 это требуется из-за текущих обновлений безопасности, которые проходят Paypal.

В настоящее время я размещаюсь на Hostgator, если это имеет отношение к кому-либо (частные ssl-сертификаты автоматически становятся 2048-битными, а SHA-256 — хорошим).

Я надеюсь, что результаты моих дней борьбы также помогут кому-то преодолеть те же проблемы, ура!

1

Другие решения

В соответствии с новые правила PayPal

правильные конечные точки HTTPS:

  • ipnpb.paypal.com
  • ipnpb.sandbox.paypal.com

Может попробовать второй (ssl: //ipnpb.sandbox.paypal.com)?

0

Я думаю, что песочница PayPal работает только в протоколе https.

$fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

соединение не удается в http.

Но соединение успешно в https.

0
По вопросам рекламы [email protected]