ando necesitada de ayuda con paypal IPN, vereis, ando tratando de hacer una sencilla pagina de esas que son una carta de ventas con un boton de paypal y cuando el visitante paga se le manda a otra pagina donde descarga el producto comprado. Ok, tengo las paginas ya creadas, con la carta de ventas y el boton paypal (esta parte en principio creo que no tiene ningun misterio). Mi pesadilla esta en la verificacion del pago de paypal. Llevo desde ayer probando codigos (de webs de por ahi, de stackoverflow, del propio paypal, potpurris mios...) y no doy con ello, SIEMPRE me da INVALID tanto cuando lo testeo desde el Instant Payment Notification (IPN) Simulator (https://developer.paypal.com/developer/ipnSimulator/) como en real (haciendo una compra de 1$).
Os pego el ultimo codigo que he probado, que una vez me dio un valido... pero no se si fue un falso positivo o que, porque despues pasó a invalid de nuevo.
Código PHP:
<?php
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$req = 'cmd=_notify-validate&';
$req .= $raw_post_data;
// Step 2: POST IPN data back to PayPal to validate
$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
//$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');
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);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// In wamp-like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set
// the directory path of the certificate as shown below:
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
if( !($res = curl_exec($ch)) ) {
file_put_contents('ipn.log', curl_error($ch) , FILE_APPEND);
curl_close($ch);
exit;
} else {
$text = $raw_post_data."\n";
$text .= $req."\n";
$text .= $res."\n\n";
file_put_contents('ipn.log', $text , FILE_APPEND);
curl_close($ch);
}
echo $text;
?>
Ahora, que he probado? pues como vi que tenia problmas con la codificacion de la respuesta (se me codificaban lso espacios como + en algunas partes en lugar de %20 y cosas asi) , despues de dar muchas vueltas y probar unas cuantas funcioes de php (tipo htmlentites, urlencode etc etc etc) sin que me funcionara nada, se me ocurrió que para que ###### iba a procesar el mensaje, si lo que quiere paypal es que se lo devuelva IGUAL que me lo ha mandado, no? pues pensé que lo mejor es coger el raw_post_data , pegarle el primer parametro de la respuesta (cmd=_notify-validate) seguido de & para concatenerlo al resto y ya está.
Y de esa forma, como digo, la prmera vez me dio VALID (que me parecio raro porque debia ser VERIFIED pero pensé que igual la documentacion habia quedado obsoleta. ademas tenia como unos simbolitos raros delante y detras) pero a la siguiente en el log me salio un monton de codigo HTML dentro del cual ponia "page not found" y despues ya no he conseguido que de otra cosa que INVALID, pero el caso es que comparo las cadenas (siempre en modo de test y mandando la verificacion a sandbox.paypal.com, pues la pido desde el testeador de ipn) y son iguales, y no se por qué no lo da por bueno.
El caso es que leyendo por ahi (en stackoverflow) he visto algunas posibles causas y sus soluciones: que los botones de paypal no esten configurados en UTF-8, ok, los tenia en... no recuerdo, en otro y ya estan en UTF-8. No parece qu feura eso porque no tuvo ningun efecto visible. Tambien lei que podia ser de las credenciales, que si mi perfil de paypal esta en modo real no me va a funcionar el modo test , asi que se me ha ocurrido testear en real (con pagos bajos y de la cuetna de mi pareja a la mia). Y asi no solo me da INVALID si no que cuando logueo el post raw... esta vacio!!!!! y claro, lo devuelvo igual de vacío y no pasa.
Ah! tambien he probado (sin mucho convencimiento, la verdad) a ponerle el archivo este que dice el script, cacert.pem , por si era eso (la web está alojada en un compartido de banahosting), pero como me temía, como el que tiene tos y se rasca la barriga.
Y bueno, que ya estoy un poco desesperada, lo que se suponia un trabajo facil y rapido me esta comiendo la moral
A alguien le ha pasado esto? Por que en real el postraw me llega vacío? Por qué si el postraw y lo que develvo es igual (como lo logueo, lo he comparado con herramientas de comparacion de codigo y me da que es exacto) me da como invalido?
Gracias a todos