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.
https://www.x.com/content/bulletin-ipn-and-pdt-scripts-and-http-1-1
// post back to PayPal system to validate
$header .="POST /cgi-bin/webscr HTTP/1.1/r/n";
$header .="Content-Type: application/x-www-form-urlencoded/r/n";
$header .="Host: www.paypal.com/r/n";
$header .="Connection: close/r/n";
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";