IPN, ¿Qué es y cómo tratar con ello en Paypal?

PHP   |   61 Comentarios

En el artículo de hoy vamos a hablar sobre un servicio de mensajes llamado IPN (Instant Payment Notification) o lo que es lo mismo, Notificación de Pago Instantáneo y cómo trabajar con esto. Este sistema se usa en Paypal y se configura desde una cuenta de Paypal tipo Business, ya que desde una cuenta normal no tenemos esta opciónPara configurar este tipo de cuenta te dejo en el siguiente enlace un artículo que te ayudará en eso, Tutorial nuevo Paypal Developer.

¿Qué es IPN?

IPN (Instant Payment Notification) o Notificación de Pago Instantáneo es, como comentábamos antes, un servicio de mensajes que notifica automáticamente a los comerciantes sobre eventos relacionados con operaciones de Paypal. Los comerciantes pueden usarlo para automatizar las funciones administrativas, incluido el cumplimiento automático de pedidos y el estado de los pedidos a los clientes.

Pero, ¿por qué usar IPN?

El uso de este sistema es muy cómodo ya que notifica a los comerciantes casi al instante sobre algunas operaciones como por ejemplo:

  • Pagos recibidos.
  • Autorizaciones de tarjetas de crédito.
  • Pagos eCheck y eventos de estado tanto pendiente, como completados o denegados.
  • Pagos recurrentes y suscripciones.
  • Disputas, reembolsos, etc.

Gracias a esto, los comerciantes pueden actuar dependiendo de la información recibida y pueden llevar a cabo las siguientes acciones:

  • Actualizar su inventario.
  • Enviar por correo electrónico una confirmación de compra.
  • Activación del cumplimiento del pedido.
  • Habilitar la descarga de medios digitales.
  • Actualizar su lista de clientes.
  • Enviar por correo electrónico una notificación de envío.
  • Actualizar información relacionada con la contabilidad.

Vale, lo entiendo pero ¿cómo funciona?

El funcionamiento de este sistema es muy sencillo. El comerciante tiene que crear una página de escucha IPN e indicar esta url en el perfil de su cuenta Paypal. Paypal se encarga de enviar notificaciones de todos los eventos que tienen que ver con las transacciones y las manda a esa URL.

Cuando un cliente realiza un pago por un bien o servicio, Paypal manda un formulario seguro que contiene toda la información relacionada con ese pago a la URL que hemos especificado en nuestro perfil de Paypal.

El evento de escucha de IPN detecta y procesa esta información. La página de escucha IPN que se ha creado al principio, contiene un script que espera la llegada de esta información, la válida con Paypal y luego la pasa a varias aplicaciones para que sea procesada.

Y ahora ¿cómo lo implemento?

Para implementar el sistema IPN se deben realizar las siguientes tareas:

  • Implementar la escucha IPN poniendo el código correspondiente en el lenguaje que queremos usar para que el sistema IPN funcione.
  • Configurar la escucha IPN para que funcione correctamente y como queremos.
  • Probar la escucha IPN para comprobar que la implementación y la configuración se ha hecho correctamente.

1# Implementar la escucha IPN

Las escuchas se pueden implementar en cualquier lenguaje de programación que admita scripts y se ejecute en un servidor. En nuestro caso lo vamos a realizar con PHP y en la página de escucha IPN que hemos creado anteriormente . El código que necesitamos sería el siguiente:

class PaypalIPN
{
    /** Indica si el endpoint final del sandbox se usará. */
    private $use_sandbox = false;
    /** Indica si se usan los certificados locales. */
    private $use_local_certs = true;
    /** URL de vuelta de Producción */
    const VERIFY_URI = ‘https://ipnpb.paypal.com/cgi-bin/webscr’;
    /** URL de vuelta de Sandbox  */
    const SANDBOX_VERIFY_URI = ‘https://ipnpb.sandbox.paypal.com/cgi-bin/webscr‘;
    /** Respuesta de Paypal que indica si la validación fue correcta */
    const VALID = ‘VERIFIED’;
    /** Respuesta de Paypal que indica si la validación fue incorrecta */
    const INVALID = ‘INVALID’;
    /**
     * Establece la verificación de IPN en modo Sandbox (se usa para las pruebas
     * pero no se debe usar en producción)
     */
    public function useSandbox()
    {
        $this->use_sandbox = true;
    }
    /**
     * Establece CURL para usar algunos certificados (puede ser necesario en algunos
     * entornos).
     */
    public function usePHPCerts()
    {
        $this->use_local_certs = false;
    }
    /**
     * Determina el endpoint para los datos de verificación.
     *
     */
    public function getPaypalUri()
    {
        if ($this->use_sandbox) {
            return self::SANDBOX_VERIFY_URI;
        } else {
            return self::VERIFY_URI;
        }
    }
    /**
     * Función de verificación
     * Envía los datos entrantes a Paypal usando CURL.
     */
    public function verifyIPN()
    {
        if ( ! count($_POST)) {
            throw new Exception(«Missing POST Data»);
        }
        $raw_post_data = file_get_contents(‘php://input’);
        $raw_post_array = explode(‘&’, $raw_post_data);
        $myPost = array();
        foreach ($raw_post_array as $keyval) {
            $keyval = explode(‘=’, $keyval);
            if (count($keyval) == 2) {
                /* Si no queremos que el signo ‘+’ de la fecha se codifique en un espacio, lo codificamos manualmente. */
                if ($keyval[0] === ‘payment_date’) {
                    if (substr_count($keyval[1], ‘+’) === 1) {
                        $keyval[1] = str_replace(‘+’, ‘%2B’, $keyval[1]);
                    }
                }
                $myPost[$keyval[0]] = urldecode($keyval[1]);
            }
        }
        /* Se crea el cuerpo de la solicitud agregando el comando _notify-validate.*/
        $req = ‘cmd=_notify-validate’;
        $get_magic_quotes_exists = false;
        if (function_exists(‘get_magic_quotes_gpc’)) {
            $get_magic_quotes_exists = true;
        }
        foreach ($myPost as $key => $value) {
            if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
                $value = urlencode(stripslashes($value));
            } else {
                $value = urlencode($value);
            }
            $req .= «&$key=$value»;
        }
        /* Se publican los datos en Paypal usando CURL y se lanza una excepción si se producen errores */
        $ch = curl_init($this->getPaypalUri());
        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_SSLVERSION, 6);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        /* Esto es necesario a veces si al servidor le falta un paquete de certificado global o está obsoleto */
        if ($this->use_local_certs) {
            curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . «/cert/cacert.pem»);
        }
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            ‘User-Agent: PHP-IPN-Verification-Script’,
            ‘Connection: Close’,
        ));
        $res = curl_exec($ch);
        if ( ! ($res)) {
            $errno = curl_errno($ch);
            $errstr = curl_error($ch);
            curl_close($ch);
            throw new Exception(«cURL error: [$errno] $errstr»);
        }
        $info = curl_getinfo($ch);
        $http_code = $info[‘http_code’];
        if ($http_code != 200) {
            throw new Exception(«PayPal responded with http code $http_code»);
        }
        curl_close($ch);
        // Si Paypal verifica los datos IPN correctamente, devuelve true
        if ($res == self::VALID) {
            return true;
        } else {
            return false;
        }
    }
}

Esto funcionaria de la siguiente manera:

  • La página de escucha recibe los mensajes IPN que ha recibido de forma segura (HTTPS POST) de parte de Paypal con cada evento.
  • Después de recibir el mensaje, se devuelve una respuesta vacía a Paypal, de lo contrario, Paypal reenvía el mensaje IPN.
  • La página de escucha envía el mensaje completo de vuelta a Paypal usando HTTPS POST (envío de forma segura).
  • Paypal devolverá “VERIFIED” si el mensaje coincide con el original o “INVALID” en caso contrario.

2# Configurar la escucha IPN

Una vez hemos implementado nuestro código de recepción de mensajes en nuestra página de escucha IPN, toca configurar las notificaciones IPN desde nuestro perfil de Paypal. La url que indiquemos en nuestro perfil de Paypal debe ser la misma en la que se encuentre la página de escucha, de otra forma no funcionará correctamente.

Los pasos para configurar este sistema de escucha para las pruebas de Sandbox y para las pruebas en producción son los mismos. La diferencia es que hay que iniciar sesión en Sandbox para configurar el sistema de mensajería en Sandbox e iniciar sesión en producción para configurar este sistema en producción. Los pasos a seguir son los siguientes:

  • Iniciar sesión en la cuenta de Paypal.
  • Hacer clic en el icono de configuración en la parte superior de la página de su cuenta y luego darle a “Perfil y configuración”. A continuación le damos a “Mis herramientas de venta”. Si no ve el icono de configuración en la esquina superior derecha, vaya a “Mi cuenta -> Perfil -> Mis herramientas de venta”.
  • Hacer clic en el enlace “Actualizar” en la fila de “Notificación de pago instantáneo” en la sección “Cómo cobrar y administrar mi riesgo”.
  • Hacer clic en “Elegir configuración de IPN” para especificar la URL de la página de escucha y activarla. Se nos abrirá una ventana en la que tendremos que:
  • Especificar la URL de la página de escucha en el campo “URL de notificación”.
  • Hacer clic en “Recibir mensajes IPN (Habilitado)” para habilitar el evento de escucha.
  • Guardamos y se nos abrirá otra página en la que podremos volver al perfil dándole a “Volver al resumen del perfil”, modificar la URL de la página de escucha o deshabilitarla dandole a “Editar configuración” o restablecer las preferencias IPN dándole a “Desactivar IPN”.

3# Configurar la escucha IPN

Una vez implementado el código en la página de escucha y configurado nuestro perfil de Paypal, es hora de realizar las pruebas. Hay tres tipos de pruebas y una vez que se hayan realizado las tres, se podrá implementar todo esto en la cuenta de producción. Las pruebas son:

  • Pruebas de desarrollo local, para verificar que la página de escucha IPN recibe y procesa correctamente todos los campos. Este método permite probar todo el procesamiento de back-end sin tener que preocuparse por el proceso de verificación de mensajes de Paypal.
  • Prueba de simulador de IPN. Se usa la herramienta “Simulador IPN” para enviar mensajes simulados de IPN desde el Sandbox de Paypal a la página de escucha. Este método permite verificar que su página de escucha maneja el proceso de verificación de mensajes IPN sin el inicio de sesión del usuario y el flujo del proceso de pago en su sitio para activar un mensaje IPN.
  • Prueba de sandbox de IPN. Se prueba la página de escucha utilizando el entorno de Sandbox de Paypal. Permite probar todo el flujo, incluido el inicio de sesión del usuario, el proceso de pago, la verificación de mensajes de IPN y su procesamiento en el back-end.

Una vez realizada las pruebas y que hayan salido bien, se puede pasar a un entorno de producción. Es recomendable que una vez se pase al entorno de producción, se realicen pruebas con datos reales para asegurarse que funciona correctamente.

Conclusión

Espero que el artículo de hoy haya servido para despejar dudas sobre lo que es el IPN o Notificación de Pago Instantáneo. Si tienes algunas dudas no te preocupes y dejanoslas en los comentarios. También puedes comentarnos si alguna vez has tenido que implementar esto y cómo ha sido tu experiencia. También aceptamos criticas constructivas si nos hemos saltado alguna parte que consideréis importante.

¿Te ha gustado el artículo?
1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (9 votos, promedio: 5,00 sobre 5)
Loading...

Suscríbete. Déjanos tu email y recibe contenido genial cada mes


Artículo escrito por

¡Exprésate! Dejanos tu comentario

Tu dirección de correo electrónico no será publicada.

61 Comentarios

Ángel

Hola, tenemos un problema con el pago en PayPal. Cuando un cliente realiza una compra, nos aparece como "Pendiente de pago" en Pedidos de WooCommerce. Con ese código, ¿se podría solucionar este problema? Gracias, un saludo.

Lorenzo R

Hola nose si todavia veas este mensaje, pero ojala si. Ya hice tu ejemplo y funciona muy bien, pero me hace falta algo y no se como hacerlo, por ejemplo en el IPN me regresa el first_name que esta registrado con paypal y todos los datos, pero yo necesito que mi cliente ponga la direccion de envio, y esa no me llega por IPN, osea si me llega la que registro en paypal pero por ejemplo tiene varias sucursales y es necesario que el la escriba, entonces esos inputs no se me estan regresando nose como hacerle, para que me tome en cuenta los que yo le mando y no los que paypal me manda, gracias.

Jarboox

Gracias por el ejemplo, me ayudó mucho. Saludos.

Juan

Hola, por favor me podrías comentar, retomando una duda anterior en el blog, en que momento se manda llamar la http://www.mipagina.com/paypalipn.php si la respuesta de la compra PayPal la manda a exito.php. Entonces Exito.php debería mandar a llamar paypalipn.php ? como la llamaría y como le pasaría los datos del POS de Paypal que se mandarón a Exito.php? Gracias

Alejandro

Hola, vengo siguiendo varios artículos tuyos y con cada uno me voy aclarando cada vez más. Pero al llegar a escribir en una DB, paso porque no me gustan, me cuesta entender cómo se montan, etc. Mi razonamiento es el siguiente y a ver si tú me puedes corregir en esto: ¿Si coloco un botón en mi web como me lo deja paypal, y NO configuro IPN, puedo llevar igual cada transacción desde un panel de control de paypal? ¿Si se puede hacer así, es necesario que configure IPN en Sandbox, o puedo hacer las pruebas sin IPN? Es decir, que no sé si necesito, sí o sí, configurar el IPN. Espero que no. Gracias por tu tiempo y amabilidad. Un saludo!

Diego Muñoz

Hola, creo que ya no contestan preguntas, pero le intento. Al terminar el pago y rederccionar a mi sitio paypal manda mensaje de que la informacion de mandan de vuleta puede ser vista por terceros, y que si desean continuar Alguna solución para que no mande ese mensaje? Saludos

jose maria

Buenos dias, una duda cuando un usuario compra un producto a traves de paypal y lo envia a la ipn a nuestra bases de datos esa bases de datos la podemos plasmar a una zona especifica del programa de los empleados para revisar la compra y despues comprobar en la zona especifica de paypal. Un cordial saludo y un feliz año 2015

Eduardo

A la hora de configurar botones no veo la opcion de poner el precio de forma dinamica en el momento de mostrar mi pagina con el boton paypal. ¿Como puedo poner el precio de forma dinamica? No tengo ni idea de cuantos articulos se van a comprar, etc.   Gracias por el artículo. He copiado el php que me ha resultado muy util. La documentacion de paypal es basura.

Alberto

Después de investigar un poco, encontré el sitio de pruebas de paypal (Sandbox), el cual me permite crear cuentas como vendedor, y comprador para realizar pruebas. he creado la cuenta Sandbox de vendedor y he entrado al sitio de pruebas, en el cual he creado el botón de pago que me arroja el siguiente código: <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top"> <input type="hidden" name="cmd" value="_s-xclick"> <input type="hidden" name="hosted_button_id" value="ENL4GX47CUMXC"> <table> <tr><td><input type="hidden" name="on0" value="Cupones por mes">Cupones por mes</td></tr><tr><td><select name="os0"> <option value="1 Cupón">1 Cupón $5.00 USD</option> <option value="2 Cupón">2 Cupón $10.00 USD</option> <option value="3 Cupón">3 Cupón $12.00 USD</option> <option value="4 Cupón">4 Cupón $16.00 USD</option> </select> </td></tr> </table> <input type="hidden" name="currency_code" value="USD"> <input type="image" src="https://www.sandbox.paypal.com/es_XC/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal, la forma más segura y rápida de pagar en línea."> <img alt="" border="0" src="https://www.sandbox.paypal.com/es_XC/i/scr/pixel.gif" width="1" height="1"> </form> lo he insertado en un documento .html el cual pueden visualizar aqui: http://pktweet.com/paypal.html al presionar el botón, me sale el siguiente error: http://pktweet.com/error-paypal.png alguna idea de porque se produce ese error? y de que puedo hacer para corregirlo... gracias de ante mano.

daniel

si aun sigue siendo funcional tu codigo, aunque tampoco entiendo porque no haces esto $myPost = $_POST , seria mas simple

Ruben Arroyo

Hola. No entiendo porque haces el siguiente código:  // Obtenemos los datos en formato variable1=valor1&variable2=valor2&...         $raw_post_data=file_get_contents('php://input');         // Los separamos en un array         $raw_post_array=explode('&',$raw_post_data);         // Separamos cada uno en un array de variable y valor         $myPost=array();         foreach($raw_post_array as$keyval){             $keyval=explode("=",$keyval);             if(count($keyval)==2)                 $myPost[$keyval[0]]=urldecode($keyval[1]);         } Cuando simplemente podrias haber hecho: $myPost = $_POST; Por lo demás gracias por el aporte. Espero que actualmente siga siendo funcional. Saludos

Joaquín

Ya estoy aquí otra vez. He releído tu código con más atención y veo que cuando lo escribiste ya estabas teniendo en cuenta que get_magic_quotes_gpc iba a desaparecer de PHP mediante la función function_exists. Sin embargo, tu conexión mediante CURL no funciona en algunos servidores debido a falta de soporte de conexiones SSL, por ejemplo el entorno de pruebas de XAMPP que usamos algunos desarrolladores. He encontrado un aporte en StackOverFlow que parece que funciona y he modificado para adaptarlo a tu código: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POSTFIELDS, $req); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); Post original aquí: http://stackoverflow.com/questions/15344742/cannot-connect-to-paypal-api-via-curl  

Joaquín

Hola amigo, hace muchos meses te avisé en un comentario de que PayPal había cambiado sustancialmente su interfaz y hoy estoy aquí para decirte tres cuartos de los mismo... No ya con PayPal sino con el lenguaje PHP. La función get_magic_quotes_gpc que utilizas en tu código ha sido eliminada a partir de PHP 5.4.0. ¡Adivina en qué entorno me estoy viendo ahora mismo programando una integración con PayPal! Agradeceremos que nos ofrezcas una alternativa. Recibe un cordial saludo.

PhiRequiem

Gracias dude, por fin logre acabar un sistema de pagos, excelente tutorial d(^_^o)

Junior Cabrera

Hola, soy un novato en estos asuntos y estoy creando un sitio web, y necesito configurar el IPN de Paypal pero no sé mucho de códigos... me puedes ayudar? Me dices cuánto cuesta y negociamos, gracias!

jorge

porque las transacciones del IPN se repiten ,en mi caso se me estan repitiendo mas de 15 veces y mi sistema truena porque es para actualizar la mensualidad del cliente, entonces le actualiza 15 meses,????? porque

hanhan

Perfecto ! Muchas Gracias!  Me has ayudado mucho !!!! Te lo agradezco. He tirado horas y horas en ello, y no han valido más que mirar 20 minutos tu tutorial

Henry Seron

Hola, Al parecer las opciones en paypal han cambiado, no logro encontrar en donde se configuran las notificaciones, alguien me puede ayudar. Gracias.

alberto

Es horrible, no hay una sola web donde explique como se configura la pagina en la web donde paypal envia el IPN. Todos hablan de como se configura desde Paypal, eso ya la página de Paypal lo dice tambien.

k

Excelente post, me sirvió más que la información oficial de Paypal que es medio confusa; un archivo descargable con el código sería perfecto.

Francisco Roca

Hola, llevo unos días implementando mi tienda online y quería saber si se pueden pasar variables adicionales por $POST. Por ejemplo para la talla de una prenda o un código de comercial. He estado viendo la documentación pero no he encontrado nada que me valga. Un saludo y muchas gracias por el post!

dr.schneider

Hola que tal, queria saber si alguien me puede ayudar con esto, voy en la primera parte de todo esto ya tengo listo el boton de paypal, pero mi duda es la siguiente ... que modelo de tabla necesito crear para guardar los datos ? y que datos son necesarios guardar ? que campos debe tener mi tabla de la base de datos ?, gracias espero su respuesta.

rodolfolp

Hola a todos, mi problema es que que me hace todo el proceso de IPN, pero le he puesto en el codigo para que me visualize los campos POST con un  'echo'  y no me hace cas0. Por lo cual no puedo tener un informe de la transaccion. Me envia los correos, pero los campos POST no. Le puse if(isset($_POST[''item_name'] y no me envia nada. Me puedes ayudar?. Gracias.

Alberto

Hola a tod@s, finalmente he logrado hacer funcionar el carrito de compras. Para Daniel, le respondo que no estoy seguro quien tiene prioridad, pero al enviar el mensaje a Paypal figura la opcion de informar cual es la pagina que va a recibir los mensajes (ipn). Deben tener cuidado de colocar la direccion correcta en esa opcion. Saludos y suerte, el tuto funciona!

Daniel

Hola Alexander: Si revisas un poco más arriba; comentaron que si hacen una pasarela directamente a Paypal, y no al SandBox, sí funciona. Por lo demás, yo aún no lo he probado así. Solamente lo he probado con el SandBox, y no llega ninguna notificación de pago. Saludos.

Alexander

Hola Buenos días, Tengo un problema estoy probando con sandbox estoy redireccionando enviando el IPN a la misma URL, pero al momento de volver al php donde integre tu ejemplo no recibe post por parte de PAYPAL gracias, un abrazo

César

Hola Alberto, yo tengo el mismo problema, ya desesperado se me ha ocurrido probarlo contra la pasarela real de paypal pagando :-) y funcina, por lo que entiendo que es un incidencia de sandbox que no hace el callback al IPN o requiere algún nuevo parametro. ¿alguien lo puede verificar? gracias, un saludo, César

Daniel

Hola Alberto: Una consulta, ¿seguiste los pasos tal cual están en este tutorial? En mi caso, cuando realizo el pago, usando una cuenta sandbox, creo que el archivo ipn.php ni siquiera se ejecuta. En la cuenta del vendedor (siempre usando sandbox) configue el IPN, y declaré la URL que corresponde. Pero no ha sucedido lo esperado. ¿Cómo fue tu experiencia? Gracias.

Daniel

Hola David: Los botones los debes hacer en tu cuenta paypal de vendedor. Saludos.

Daniel

Hola Alberto: Una consulta, ¿seguiste los pasos tal cual están en este tutorial? En mi caso, cuando realizo el pago, usando una cuenta sandbox, creo que el archivo ipn.php ni siquiera se ejecuta. En la cuenta del vendedor (siempre usando sandbox) configue el IPN, y declaré la URL que corresponde. Pero no ha sucedido lo esperado. ¿Cómo fue tu experiencia? Gracias.

david

Hhola muy bueno el tuto, pero quiero saber donde creo los botones de compra.

Alberto

Hola, Primero que nada agradecerte por este post, en verdad es muy bueno!! Y ahora la pregunta: he probado tu codigo con un carritos de compras y resulta que si en el carrito hay un solo articulo el script responde que es Paypal quien ha enviado el mensaje, sin embargo, al aumentar la cantidad de articulos en el carrito el script dice que no es Paypal quien ha enviado el mensaje. ¿Alguna idea? Desde ya muchas gracias!!!    

Sergio

Estimados: He seguido al pie de la letra este tutorial. Sin embargo, mi página nunca recibe la notificación. Y es más, el archivo ipn.php nunca se ejecuta :( He revisado bien mi cuenta de Vendedor, y tengo configurado las Preferencias de Notificaciones de Pago Instantánea. Curiosamente, cuando veo el Historial de Notificaciones de Pago Instantáneas, aparecen todas las que he hecho (todas las "ventas"), y en la columna estado, algunas marcan Error, y otras Reintentando. La verdad es que no sé cual pueda ser la causa de este problema. Por lo demás, agradezco cualquier ayuda que me den. Saludos a todos!

Richard

Debes habilitar las librerias curl desde php.ini quitando el ";", reiniciar apache y listo

José Pablo Gallego

Muchas gracias por el tutorial pues resulta muy aclaratorio para determinados aspectos. Planteo un problema que tengo por si alguien pudiera ayudarme con el retorno de paypal. El caso es que en un sistema de tiendas propio en lugar de configurar el retorno por IPN lo asignaba en el formulario que envío a paypal desde la tienda mediante este campo: <input type="hidden" name="return" value="http://<?=$_SERVER['HTTP_HOST']?>/?mod=carrito_pago"> Hasta antes de los últimos cambios en paypal me funcionaba perfecto y al hacer el pago paypal me devolvía a la página carrito_pago donde yo guardaba el pedido en la tienda, pero ya no ocurre así, es algo muy raro pues carga la página carrito_pago (que se identifica por GET) pero sin ningún dato asociado, si pregunto si se ha enviado algo por POST o GET no devuelve ningún valor, sin embargo en cuanto pulso intro en la barra del navegador para volver a cargar la página se muestra como si acaba de entrar, es decir, solo muestra que se ha enviado que cargue la página carrito_pago. No sé si podréis ayudarme con la explicación.

manuel

Hola, todo funciona bien, la única pega es que al registrar los datos, me lo registra muchas veces repetidas. Alguna idea?  Gracias de antemano

Miguel Rodriguez

Hola! muchas gracias por la información sobre trabajar con paypal, me fue de gran ayuda, tambièn quería hacer algunas consultas. creé mis usuarios en sandbox, los estuve probandoy si puedo utilizarlos, realizar transacciones, ademàs pude hacer notificaciones de IPN (cierto tiene que ser una ruta completa que esta en la web, localmente no funciona). ahora tengo un inconveniente. ¿Cómo podría enviar un parámetro desde el formulario que aparece en paypal y poder recuperarlo desde la respuesta de paypal IPN?. Estoy haciendo el formulario comprar ahora, cuando el usuario presione en ese formulario, quiero enviar un parametro ejem: id_mensaje y cuando paypal me responde por la ruta IPN, alli quiero recuperar esa variable y poder procesarla, para saber que estoy enviado desde el formulario. ¿Cómo lo podría hacer? muchas gracias por tu respuesta..

Juan Viñas

Según estoy leyendo aquí, sí, los pagos periódicos son compatibles con IPN:

Los eventos de pagos periódicos se le notifican a través de IPN y correo electrónico
En realidad no conozco el sistema de pagos periódicos de PayPal como para responder a tu pregunta con total seguridad, pero supongo que no pasa nada porque coincidan varios pagos. Quiero decir, PayPal siempre suele tratar los pagos por separado, y cada uno lleva sus identificadores y demás. Supongo los trata por separado, pero ya te digo que no conozco bien esta característica de PayPal. Espero que el enlace que te facilito te aclare algunas dudas más: Integración de pagos periódicos Un saludo.

Luis Benito Gall

Buenos días, antes de nada felicitarte y agradecerte el magnífico tutorial que has realizado.  Iba loco buscando algo que explicara con tanta claridad este tema. Quisiera preguntarte si este código es talmente válido para pagos periódicos, como lo tengo montado para un cliente.  Hasta ahora el pago se realizaba correctamente pero no recibía notificación, porque lo tenía mal desarrollado.  Espero que con tu código funcione. También preguntarte qué ocurre si coinciden varios pagos periódicos en la misma fecha, si Paypal lo trata por separado o hay que hacer algún bucle. Saludos y gracias por tu respuesta, Luis Benito Gall        

Juan Viñas

Hombre, lo cierto es que no soy experto en seguridad, pero se me ocurre que hagas tu sistema de forma que, en el último paso, cuando el cliente ya ha confirmado los productos que quiere y antes de mandar esa información a PayPal, hagas una última comprobación:

  • Comprobamos la ID de los productos que el cliente ha seleccionado.
  • Obtenemos el precio de cada producto desde la base de datos para que sea correcto.
  • Volvemos a sumar el precio.
  • Continuamos con el pago a PayPal.
De todos modos, deberías hacer algún sistema que guarde en la base de datos cada compra que te hacen, con cada artículo que se compra, su precio por unidad en ese momento y cuantas unidades se han comprado, entre otros datos interesantes. De esta forma sabrás seguro si alguien te ha pagado de menos.

edgar vasquez

Hola Juan ,estoy haciendo mi sitio web para vender algunos articulos artesanales que fabrico,y lo estoy haciendo con el poco conocimiento que tengo de diseño web,asi que como comprenderas,tengo que ir aprendiendo literalmente sobre la marcha,tal vez me puedas ayudar con una duda...¿si alguien altera el codigo de una de las paginas de pago de mi sitio y pone en lugar del precio real uno alterado como hago para saber si me esta timando si paypal no diferencia entre el precio real y el alterado? es decir si el articulo vale $25 y se altera a 5 paypal recibe el pago de $5 como si fuera real y lo mas importante como hago para evitarlo? desde ya un abrazo desde Costa Rica y gracias por tu tiempo,saludos.

Fran

¡Gracias! Probare esto a ver que tal.

Juan Viñas

Hombre, ciertamente es la primera vez que me veo en esa situación, así que no sé decirte 100% seguro. Mi lógica me lleva a pensar que no, ya que como bien dices, sólo se puede establecer una URL. Supongo que tampoco les interesará demasiado darte esas posibilidades en una cuenta PayPal cuando podrias tener más de una (con los gastos que conllevan)... Pero mientras escribo esta respuesta se me ocurre una solución, y no tardo en dar con ella en Google. Bien podrías tener una dirección de IPN fija (en una de tus tiendas) que esté preparada para recibir una información IPN. Según la información que llega, deducimos a qué página va, y reenviamos toda la información a la correcta. El proceso es exactamente el mismo que el seguido anteriormente (también es imprescindible comprobar con PayPal los datos que han llegado), pero con un paso intermedio. Es decir... Tu prepara el receptor IPN para cada tienda como lo has visto aquí, como si fuesen únicos. Luego prepara el sistema que va a recibir la información para reenviarla. Y finalmente, en PayPal, establece la URL de tu recibidor. Así lo he entendido yo de lo que he leido por encima, pero puedes leer más sobre ello aquí. Espero que te sea de ayuda!

Fran

Un post estupendo y muy clarito, ¡felicidades. Tengo una duda y no se si es posible hacerlo. Tengo varias tiendas online y los pagos de todas ellas convergen en la misma cuenta de paypal. Lo hice así para no andarme con mil cuentas diferentes. ¿Es posible usar IPN en estos casos? Lo digo porque como hay que indicar la web de retorno y sólo deja campo para una sóla URL... Saludos!

Juan Viñas

Pues es raro. Quizá no esté totalmente implementado para México, pero me extraña, puesto que las APIs Clásicas deberían seguir funcionando correctamente... Lo curioso es que no veo México en el selector de paises :S ¿Estamos rellenando el mismo formulario? Captura de pantalla 2013-04-26 a la(s) 10.22.54

berenice

Pues igual pero simplemente me aparece en blanco la única diferencia es que yo le puse México en lugar de España.

Juan Viñas

La cantidad máxima que admite una cuenta creo que son 5000... De todos modos, aquí tienes un tutorial más extenso sobre PayPal Sandbox, con la imagen del formulario de creación de cuenta. Es en el momento de crear la cuenta cuando ponemos los fondos iniciales. Yo lo he hecho así, y ahora en la pestaña Funding veo el saldo que tiene la cuenta. ¿Cómo lo estás haciendo tú?

berenice

Hola yo también he creado cuentas personal y de empresas en developer.paypal pero le he puesto al balance inicial cantidades  de 9999,100 y 99 € pero al revisar el profile de la cuanta en la pestaña funding los campos me salen sin ningún valor.    Agradecería si me ayudaras a crear una cuenta poniéndole fondos mediante un manual o un pequeño vídeo, Te estaré muy agradecida.

Juan Viñas

Vale, vamos por partes :) 1. Probablemente te la has saltado. Al crear la cuenta personal, hay un campo llamado "PayPal Balance". Aquí es donde le ponemos dinero a la cuenta personal. 2. Sí, necesitas tener tu sistema montado en Internet, puesto que necesitas una URL de devolución para la IPN (y aquí no te sirve una url local, claro). De nada! :)

agustin

Antes que nada te agrades que compartas, Tambien aprovecho para compartirme mis duda, he creado mis cuentas de empresa y personal pero nose como ponerle dinero a la cuenta personal, no se si me he saltado ese paso, para hacer esta puebas en completamente necesario que tenga mi sistema ya montado en  internet, no lo puedo hacer desde local?   gracias.

Juan Viñas

En realidad no he probado a pagar con tarjeta, pero puedes probarlo tu mismo. Sé que hay una lista de tarjetas "ficticias" que PayPal ha puesto a disposición de los desarrolladores para que prueben estas cosas. Prueba a usarlas y comprueba qué datos te llegan con ellas :) En cuanto a vender, la cuenta Personal tiene ciertas desventajas con respecto a la Business. Para empezar, vender con cuenta Personal no te ofrece notificaciones IPN, no hay donde configurarlas ni nada parecido. Lo que puedes hacer es intentar configurar tu Sandbox para que los pagos lleguen a la cuenta Personal de pruebas que has creado, a ver qué ocurre, que opciones te da o te quita, o si directamente lanza un error al intentar pagar. ¡Un saludo! :)

aabilio

Hola @Juan Viñas muy buen post, gracias por la info y por la ayuda ;) (estaba hecho un lío con todo el cambio de las APIs de PayPal hasta que encontré toda la info proporcionada por este blog). Me resulta interesante preguntarte una cosa a ver si sabes. El caso, es que estoy intentando desarrollar una plataforma de pagos a través de PayPal para una web que estoy haciendo para un familiar que quiere vender sus fotografías a través de Internet. Como es un familiar no le voy a cobrar, y puesto que tengo bastante trabajo y ya he perdido bastante tiempo en programar y maquetar su web estaba interesado en la opción de programar solamente el botón para que pueda hacer cobros a través de PayPal y no guardar ningún registro en una base de datos en la web (programarla, crear acceso a los registros, conectarla con el IPN,...), simplemente, que cuando a él le llegue el mail que automaticamente manda PayPal al vendedor, se ponga en marcha para hacer los trámites de envío (como PayPal en el panel de control te da ya todos los datos de las transacciones realizadas...) y si tiene algún problema que contacte con el email que PayPal le ha dicho que registró el comprador. El caso en el que estaba pensando es en los datos de envío si se paga con tarjeta. Es decir, que si yo no guardo ningún registro, y el tio que compra no lo hace a través de una cuenta de PayPal, sino que directamente lo hace a través de la plataforma pero con tarjeta de crédito, ¿PayPal le preguntará igualmente los datos para el envío y los enviara por email al vendedor? Es por si conocías esta cuestión, sino gracias igualmente por la atención. Ah! por cierto, otra pregunta si no es mucho abusar: para vender un par de fotografías (en papel) cada mucho tiempo a través de PayPal, ¿qué es mejor, una cuenta Personal o una Bussines? (ya que tengo entendido que puedes vender con la personal, pero no tienes ciertas ventajas, y no vaya a ser que ese registro de vendedor no aparezca, o que el comprador no pueda pagar con tarjeta...). Muchas gracias por tu atención. Saludos.

Gustavo

Hola, es muy bueno el tutorial, pero ya cree las cuentas sandbox, a la hora de tratar de crear un botón sandbox con mi cuenta Business me lanza a mi cuenta oficial de paypal. Como puedo generar el botón desde mi cuenta sandbox? 

Juan Viñas

Sí, ya hemos visto que han cambiado la web de PayPal Sandbox. En breve haremos revisiones a estos tutoriales. Gracias!

Raul

Hola, no se si ya se dieron cuenta en el sandbox.paypal, ya no me permite ingresar la URL en el IPN , es mas ni se puede encontrar el IPN, tendran alguna solucion??? Gracias d antemano

Juan Viñas

Es correcto, si te he entendido bien, es correcto. A ver, el usuario que compre en tu web va a ser redirigido a exito.php, ¿Cierto? Esa es la web de redirección para el usuario. La IPN de PayPal funciona de forma diferente, sin que el usuario lo vea (pues tampoco es algo que necesite ver). Por un lado, PayPal redirige a tu usuario a exito.php, mientras que los datos IPN los estás recibiendo en paypalipn.php, ¿No es así? En este archivo es donde tienes configurada la entrada de datos por parte de PayPal, ¿Verdad? Si es así, entonces lo deberias estar haciendo bien. Un saludo :)

Port

Muchas gracias por tu respuesta, una última duda que te pregunto: ¿la página paypalipn.php, que es la que pones en tu cuenta Paypal para que reciba los datos IPN, tiene que ser la que reciba los datos en tu sitio? Yo por ejemplo pongo que se redireccione a una llamada exito.php, pero en mi cuenta paypal, en editar configuración de comunicaciones de pago pongo www.mipagina.com/paypalipn.php.   Muchisimas gracias!

Juan Viñas

Correcto, si tienes por ejemplo "http://www.tupagina.com/paypalipn.php", este codigo va en ese archivo, en "paypalipn.php". Lo que hace es recoger los datos POST que PayPal envía. Es raro que te esté devolviendo INVALID. ¿Cómo estás haciendo la comprobación IPN? ¿Con las herramientas de SandBox de PayPal? ¿O envías datos por POST tú mismo a la página? Si es lo segundo, es normal que esté devolviendo INVALID. Este código lo primero que hace es devolver a PayPal los datos que le acaban de llegar. Luego, PayPal devuelve VERIFIED si esos datos son realmente suyos, o INVALID si esos datos no los ha enviado PayPal. Si necesitas hacer pruebas "reales" con PayPal (pero pagando de forma ficticia), échale un ojo a esta otra entrada que escribí hace unos días, quizá te sea de ayuda: PayPal Sandbox: cómo usarlo correctamente

Port

Hola de nuevo! muchas gracias por el apunte! me ha sido de gran ayuda! El problema que tengo ahora es que con el código que has indicado siempre me devuelve INVALID. Este código hay que situarlo en la página a la que redirecciona paypal una vez acabado el proceso de pago, verdad? Muchas gracias

Juan Viñas

Si te esta ocurriendo esto, es porque debes tener la libreria curl desactivada en la configuración de php (o simplemente no está instalada en tu servidor). Una de las causas más habituales es que, en el archivo php.ini, está comentada la linea ";extension=php_curl.dll". Si tienes acceso a este archivo, prueba a quitar el ; del principio de esa línea y guarda el archivo. Si esto no lo arregla, o no tienes acceso a este archivo, consulta con tu proveedor de hosting. Si el servidor lo tienes montado en local, consulta http://es.php.net/manual/es/intro.curl.php.

Port

Hola, Muy agradecido al post que has realizado pero tengo un pequeño problema, te lo comento haber si me puedes echar un cable: Call to undefined function curl_init() Muchas Gracias!!