Paypal IPN Получение пустого подтверждения (должно быть «VERIFIED» или «INVALID»)

Я просто тестирую IPN Paypal. Я настроил его с помощью Sandbox. Я отправляю его поддельные запросы IPN, и он получает IPN. Затем я получаю его, чтобы вернуть информацию для проверки, и я пишу ответ на текстовый файл, чтобы я мог проверить его самостоятельно. IPN отлично срабатывает, и ответ записывается в текстовый файл.

Есть только одна проблема … Ответ пустой.

Предполагается, что ответ будет принят как «VERIFIED» или «INVALID», и это единственные 2 возможных ответа … так что происходит = S. Любая помощь приветствуется.

Весь код размещен ниже:

$ipn_post_data = $_POST; $response = ""; // Choose url $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; // Set up request to PayPal $request = curl_init(); curl_setopt_array($request, array ( CURLOPT_URL => $url, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data), CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_HEADER => FALSE, CURLOPT_SSL_VERIFYPEER => TRUE, CURLOPT_CAINFO => 'cacert.pem', )); // Execute request and get response and status code $response = curl_exec($request); $status = curl_getinfo($request, CURLINFO_HTTP_CODE); // Close connection curl_close($request); $fh = fopen( "ipntest.txt", 'a+' ); $date = date( "YMj H:i" ); fwrite( $fh, $date . " Response: " . $response . "\n" ); fclose( $fh ); if($status == 200 && $response == 'VERIFIED') { // All good! Proceed... } else { // Not good. Ignore, or log for investigation... } 

Выход текстового файла:

 2012-Nov-26 23:24 Response: 2012-Nov-26 23:25 Response: 

Раньше я использовал этот код, я пытался заставить его работать неделю, так что это не просто временный сбой или что-то еще …

Привет, ребята.

Related of "Paypal IPN Получение пустого подтверждения (должно быть «VERIFIED» или «INVALID»)"

Так что только для справок в будущем, для людей с этой же проблемой:

Проблема здесь заключалась в отсутствии файла CA.

Я не уверен, что именно делает файл CA, но я знаю, что он имеет какое-то отношение к SSL-сертификату Paypal и установлению SSL-соединения. Когда я начал искать ошибки cURL, я увидел следующее:

 [27-Nov-2012 21:46:11 UTC] cURL error: [77] error setting certificate verify locations: CAfile: /etc/ssl/certs/api_cert_chain.crt CApath: /etc/ssl/certs 

Быстрое решение, которое я нашел, это загрузить класс IpnListener.php . (Это было рекомендовано eldblz . Это упростило работу с IPN, и это обеспечило решение для моего отсутствия CAFile. Если вы загружаете весь пакет IpnListener.php, он включает в себя папку с именем cert, которая включает api_cert_chain.crt, который вы необходимо, и уже настроен для использования.

Я всегда использовал следующее, и он отлично работает …

 // Validate with curl $curl_result=$curl_err=''; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://'.$ppHost.'/cgi-bin/webscr'); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $req); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req))); curl_setopt($ch, CURLOPT_HEADER , 1); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $curl_result = curl_exec($ch); $curl_err = curl_error($ch); curl_close($ch); //are we verified? If so, let's process the IPN if (strpos($curl_result, "VERIFIED")!==false) $valid = true; else $valid = false; 

Вам просто нужно убедиться, что $ ppHost в этом примере правильна в зависимости от того, была ли транзакция получена из песочницы или живых серверов, а затем, конечно, заполнить $ req и $ ssl соответственно.

 class Paypal_IPN { /** @var string $_url The paypal url to go to through cURL private $_url; /** * @param string $mode 'live' or 'sandbox' */ public function __construct($mode = 'live') { if ($mode == 'live') $this->_url = 'https://www.paypal.com/cgi-bin/webscr'; else $this->_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; } public function run() { $postFields = 'cmd=_notify-validate'; foreach($_POST as $key => $value) { $postFields .= "&$key=".urlencode($value); } $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $this->_url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postFields )); $result = curl_exec($ch); curl_close($ch); $fh = fopen('result.txt', 'w'); fwrite($fh, $result . ' -- ' . $postFields); fclose($fh); echo $result; } } 

вызовите это в другом файле php:

 <?php require 'Paypal_IPN.php'; $paypal= new Paypal_IPN('sandbox'); $paypal->run(); ?>