El código de escucha Paypal IPN está colgando / no responde

Estoy usando el ejemplo de script IPN ‘libro de texto’ tal como se encuentra en el sitio web de PayPal. Sin embargo, cuando se ejecuta este código a través del simulador IPN, hay un gran tiempo de carga y PayPal arroja este error:

Proxy Error 

El servidor proxy recibió una respuesta no válida de un servidor en sentido ascendente. El servidor proxy no pudo manejar la solicitud POST / webapps / developer / applications / ipn_simulator.

Motivo: Error al leer desde un servidor remoto

Aquí está mi código de escucha IPN.

¡Agradecería mucho ayuda!

  // Send an empty HTTP 200 OK response to acknowledge receipt of the notification header('HTTP/1.1 200 OK'); // Assign payment notification values to local variables $item_name = $_POST['item_name']; $item_number = $_POST['item_number']; $payment_status = $_POST['payment_status']; $payment_amount = $_POST['mc_gross']; $payment_currency = $_POST['mc_currency']; $txn_id = $_POST['txn_id']; $receiver_email = $_POST['receiver_email']; $payer_email = $_POST['payer_email']; $job_id = $_POST['custom']; // Build the required acknowledgement message out of the notification just received $req = 'cmd=_notify-validate'; // Add 'cmd=_notify-validate' to beginning of the acknowledgement foreach ($_POST as $key => $value) { // Loop through the notification NV pairs $value = urlencode(stripslashes($value)); // Encode these values $req .= "&$key=$value"; // Add the NV pairs to the acknowledgement } // Set up the acknowledgement request headers $header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; // HTTP POST request $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; // Open a socket for the acknowledgement request $fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); // Send the HTTP POST request back to PayPal for validation fputs($fp, $header . $req); while (!feof($fp)) { // While not EOF $res = fgets($fp, 1024); // Get the acknowledgement response $message = 'fail'; if (strcmp ($res, "VERIFIED") == 0) { // Response contains VERIFIED - process notification // Possible processing steps for a payment include the following: $job = $this->jobmodel->get_by_id($job_id); // Process payment $this->jobmodel->add_payment($job_id, $_POST); $message = $job_id; } else if (strcmp ($res, "INVALID") == 0) { // Authentication protocol is complete - begin error handling $message = 'fail'; } $filename = 'Paypal IPN' . date('dmY g-i', mktime()); $myFile = $_SERVER['DOCUMENT_ROOT']."/assets/html/paypal/$filename.html"; $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $message); fclose($fh); } fclose($fp); // Close the file 

No está enviando un encabezado ‘Host’ a lo largo de su solicitud de verificación IPN, y su secuencia de comandos no parece ser capaz de manejar datos fragmentados HTTP.
Sugeriría comenzar con este ejemplo y trabajar desde allí.

  $value) { if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { $value = urlencode(stripslashes($value)); } else { $value = urlencode($value); } $req .= "&$key=$value"; } // Post IPN data back to PayPal to validate the IPN data is genuine // Without this step anyone can fake IPN data if(USE_SANDBOX == true) { $paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr"; } else { $paypal_url = "https://www.paypal.com/cgi-bin/webscr"; } $ch = curl_init($paypal_url); if ($ch == FALSE) { return FALSE; } 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, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); if(DEBUG == true) { curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLINFO_HEADER_OUT, 1); } // CONFIG: Optional proxy configuration //curl_setopt($ch, CURLOPT_PROXY, $proxy); //curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); // Set TCP timeout to 30 seconds curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); // CONFIG: Please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path // of the certificate as shown below. Ensure the file is readable by the webserver. // This is mandatory for some environments. //$cert = __DIR__ . "./cacert.pem"; //curl_setopt($ch, CURLOPT_CAINFO, $cert); $res = curl_exec($ch); if (curl_errno($ch) != 0) // cURL error { if(DEBUG == true) { error_log(date('[Ymd H:ie] '). "Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE); } curl_close($ch); exit; } else { // Log the entire HTTP response if debug is switched on. if(DEBUG == true) { error_log(date('[Ymd H:ie] '). "HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE); error_log(date('[Ymd H:ie] '). "HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE); // Split response headers and payload list($headers, $res) = explode("\r\n\r\n", $res, 2); } curl_close($ch); } // Inspect IPN validation result and act accordingly if (strcmp ($res, "VERIFIED") == 0) { // check whether the payment_status is Completed // check that txn_id has not been previously processed // check that receiver_email is your PayPal email // check that payment_amount/payment_currency are correct // process payment and mark item as paid. // assign posted variables to local variables //$item_name = $_POST['item_name']; //$item_number = $_POST['item_number']; //$payment_status = $_POST['payment_status']; //$payment_amount = $_POST['mc_gross']; //$payment_currency = $_POST['mc_currency']; //$txn_id = $_POST['txn_id']; //$receiver_email = $_POST['receiver_email']; //$payer_email = $_POST['payer_email']; if(DEBUG == true) { error_log(date('[Ymd H:ie] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE); } } else if (strcmp ($res, "INVALID") == 0) { // log for manual investigation // Add business logic here which deals with invalid IPN messages if(DEBUG == true) { error_log(date('[Ymd H:ie] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE); } } ?>