Paypal hace un cambio en su sistema al ampliar más IPs a su servicio y aprovecha para hacer un cambio en la comunicación con sus servidores migrando de HTTP/1.0 a HTTP/1.1, esto tiene repercusión en las webs que tengan integrado el servicio de Instant Payment Notification, o IPN.

En el email que notifican del cambio añaden unos códigos de ejemplo de como realizar el cambio, si os limitáis a copiar y pegar este extracto el IPN no va a funcionar, pues según la implementación que tengas requiere más cambios.

Se requiere en un principio añadir el "Host: www.paypal.com" y el "Connection: Close". Hasta ahí todo bien, pero si tienes indicado el content lenght en las cabeceras, tienes que enviarlo debajo del connection: close y no antes.

Los headers quedarían de la siguiente manera:


$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";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";


Después, en el momento de recuperar los datos del servidor de Paypal, hay algo que no mencionan y que es importante, hay que aplicar un trim a el contenido recibido. En la parte donde se recupera el contenido debe quedar de la siguiente manera:

$res = fgets ($fp, 1024);
$res
= trim($res); // Importante!



Con estos dos cambios deberias de estar preparado para el cambio.