wwwpaypal validación una respuesta proviene ipn ingresar error ejemplo dirección diferente cuenta correo configurar php paypal paypal-ipn

validación - paypal ipn php



Error de Solicitud 400 de IPN de PayPal (6)

Tuve el mismo problema y lo mejor es usar el código de muestra de PayPal ... Funciona perfectamente entonces: https://www.x.com/developers/PayPal/documentation-tools/code-sample/216623

Usando PayPal IPN, sigo obteniendo un error 400.

He estado haciendo que el script me envíe correos electrónicos de $res para ver cuál es la respuesta, dentro del while (!feof($fp)) {} . Siempre termino recibiendo el error: HTTP/1.0 400 Bad Request

En total vuelvo:

HTTP/1.0 400 Bad Request ​Connection: close Server: BigIP Content-Length: 19 ​Invalid Host Header

La última línea después de esto está simplemente en blanco. Aquí está mi código, he intentado cambiar un montón de cosas, pero nada funciona.

$req = ''cmd=_notify-validate''; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $value = preg_replace(''/(.*[^%^0^D])(%0A)(.*)/i'',''${1}%0D%0A${3}'', $value);// IPN fix $req .= "&$key=$value"; } // post back to PayPal system to validate $header = "POST /cgi-bin/webscr HTTP/1.0/r/n"; $header .= "Content-Type: application/x-www-form-urlencoded/r/n"; $header .= "Content-Length: " . strlen($req) . "/r/n/r/n"; $fp = fsockopen(''ssl://www.sandbox.paypal.com'', 443, $errno, $errstr, 30); if (!$fp) { // HTTP ERROR } else { fputs($fp, $header . $req); while (!feof($fp)) { $res = fgets ($fp, 1024); if (strcmp ($res, "VERIFIED") == 0) { //ADD TO DB } else if (strcmp ($res, "INVALID") == 0) { // PAYMENT INVALID & INVESTIGATE MANUALY! // E-mail admin or alert user } } fclose ($fp); }

He agregado una línea, este es el encabezado antes de que se envíe:

Host: www.sandbox.paypal.com POST /cgi-bin/webscr HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 1096


Estaba teniendo los mismos problemas y estos son los cambios requeridos. Algunas de las respuestas anteriores no arreglan todos los problemas.

Nuevo formato para encabezado:

$header = "POST /cgi-bin/webscr HTTP/1.1/r/n"; $header .= "Content-Type: application/x-www-form-urlencoded/r/n"; $header .= "Host: www.sandbox.paypal.com/r/n"; // www.paypal.com for a live site $header .= "Content-Length: " . strlen($req) . "/r/n"; $header .= "Connection: close/r/n/r/n";

Tenga en cuenta el conjunto adicional de / r / n en la última línea solamente. Además, la comparación de cadenas ya no funciona porque se está insertando una nueva línea en la respuesta del servidor, así que cambie esto:

if (strcmp ($res, "VERIFIED") == 0)

a esto:

if (stripos($res, "VERIFIED") !== false) // do the same for the check for INVALID


He encontrado que el código de ejemplo de PayPals con fsockopen no funciona correctamente.

Para que el IPN funcione con PHP, utilicé la sugerencia de Aireff del 5 de agosto y miré el código usando la técnica Curl en el sitio x.com.



Otra solución es recortar $ res antes de la comparación ..

$res = fgets ($fp, 1024); $res = trim($res); //NEW & IMPORTANT


Como usted mismo está abriendo el zócalo, en lugar de utilizar una biblioteca HTTP como curl, debe establecer la versión adecuada del protocolo HTTP y agregar el encabezado del host HTTP justo debajo de la línea POST.

$header = "POST /cgi-bin/webscr HTTP/1.1/r/n"; $header .= "Host: www.sandbox.paypal.com/r/n";