IPN: Tratar la información de compras que nos envia PayPal

PHP   |   60 Comentarios

Cuando trabajamos con PayPal como vendedores, podemos configurar que cierta información de la transacción se nos envíe a nuestro sitio para tratarla y almacenarla. Podemos especificar en PayPal una dirección, una página de nuestro sistema, que está lista para recibir esa información, de forma totalmente independiente del comprador. Pues bien, hoy veremos cómo tratar los datos IPN de PayPal.

¿Qué son los datos IPN?

PayPalPayPal ofrece a los vendedores que usan su servicio un sistema llamado IPN (Instant Payment Notification). Funciona de esta forma:

  1. Un cliente llega a nuestra tienda, selecciona sus productos, y procede a realizar el pago mediante PayPal.
  2. Confirmado el pago, PayPal redirige al cliente a una ventana de confirmación, y posiblemente a volver a la tienda.
  3. El cliente recibe un email de confirmación.

Eso es el transcurso normal de una compra de PayPal. Lo que el cliente no ve es que PayPal ejecuta otra tarea a la vez, la Notificación de Pago Instantaneo o IPN, por la cual contacta con una página web de nuestro sitio (que hemos configurado previamente, pongamos que es, http://www.miweb.com/paypalipn.php), y envía la información de la compra por POST. Así que, reexpliquemos el proceso:

  1. Un cliente llega a nuestra tienda, selecciona sus productos, y procede a realizar el pago mediante PayPal.
  2. Confirmado el pago, PayPal redirige al cliente a una ventana de confirmación y posiblemente a volver a la tienda. A la vez que esto ocurre, PayPal contacta con la URL que hemos configurado (http://www.miweb.com/paypalipn.php) y envía los datos de la transacción mediante $_POST.
  3. El cliente recibe un email de confirmación de PayPal. Mientras, nuestro sistema procesa los datos tal como lo hemos programado.

El tema que nos ocupa hoy es precisamente programar cómo trata nuestra web los datos [def]IPN[/def] de PayPal, es decir, el punto 3. ¿Qué hacer con esos datos? ¿Los guardamos en una base de datos? ¿Enviamos un email al usuario de confirmación de la compra? ¿Le mandamos un email al encargado de la tienda para que vaya preparando el envío? Eso ya forma parte de nuestras necesidades y de nuestra imaginación.

Pero nuestro trabajo no servirá de nada si no configuramos correctamente PayPal.

Configurando PayPal

Lo primero es lo primero: necesitamos configurar nuestra cuenta de PayPal para que envíe notificaciones IPN a una página de nuestro sitio que las reciba y procese. Asi que vamos a acceder a nuestra cuenta de PayPal, y pasaremos por Mi cuenta > Perfil > Más opciones.

Detalle importante: Nuestra cuenta PayPal debe ser una cuenta Business. Es la única cuenta que admite notificaciones IPN. Si tenemos una tienda, lo normal es que la cuenta PayPal de la tienda sea Business.

En más opciones hay tres columnas. Bajo la última, “Preferencias de ventas”, buscamos “Preferencias de Notificacion de Pago Instantanea”, y después, pulsamos en “Editar configuración”.

Actualización (29/marzo/2013): Esta pantalla ha cambiado recientemente. Ahora hay que pulsar en “Mi cuenta” > “Perfil” y no hay tres columnas, si no varias “secciones”. En realidad es bastante parecido a como estaba antes, puesto que lo que buscamos sigue en la sección “Preferencias de ventas”, pero ahora está distribuido de otra forma. Buscamos el enlace “Preferencias de Notificación de Pago Instantánea”. Después, pulsaremos en el botón “Seleccionar configuración de IPN”, y aparecerá la siguiente pantalla.

Pantalla de configuracion IPN

Habilitamos las notificaciones IPN (“Recibir mensajes de IPN (activado)”) y escribimos en el recuadro “URL de notificación” la url de nuestro sistema que va a recibir los datos IPN desde PayPal (recordemos que en este ejemplo es http://www.miweb.com/paypalipn.php).

Aquí ya tendríamos nuestro IPN configurado, pero vamos a tocar un par de detalles más (opcionales):

  • No bloquear pagos de otras divisas: tu cuenta PayPal podría bloquear pagos que se hagan en una divisa diferente a la que tienes establecida por defecto; esto es, si tu divisa es el euro, PayPal bloquea a alguien que intente pagar en dólares. Podemos establecer que, en lugar de bloquear, convierta de dólares a euros (algo mucho más lógico si queremos abrir nuestra tienda al mundo). Volvemos a la página del perfil y, de nuevo bajo “Preferencias de ventas”, buscamos “Preferencias de recepción de pago”. Si está marcada la opción “Sí” en “Bloquear pagos que se me envíen en una divisa que no acepto”, marquemos “No, aceptarlas y convertirlas a Euros”.Actualización (29/marzo/2013): Esto también ha cambiado. Ahora ya no está bajo “Preferencias de ventas”, si no en la sección “Configuración de seguridad y riesgo” > “Preferencias de recepción de pago”.
  • Redirigir al comprador de vuelta a nuestra web después de la compra: es mejor devolver a nuestros clientes a nuestra tienda después de una compra (a un mensaje de agradecimiento por comprar, por ejemplo), que dejarlos navegando en el limbo de PayPal. Para esto, volvemos a nuestros ajustes en nuestro perfil, y buscamos “Preferencias del pago en el sitio Web”, también en la columna “Preferencias de ventas”. Habilitamos el “Retroceso automático” y establecemos la “URL de devolución”, que es la dirección a la que PayPal llevará a un usuario tras efectuar el pago.Actualización (29/marzo/2013): Otro cambio, ahora está más escondida esta opción. En la primera columna, encontramos la sección “Configuración para Pagos en sitio web“, que tiene dos subsecciones. Vamos a “Pago estándar y Pago exprés” y pulsamos en “Preferencias“. Aquí encontramos el retroceso automático. Si queremos usarlo, pulsamos en “Activar” y establecemos la URL de devolución.
  • Otros detalles: Si nos hemos detenido a mirar todos los campos de la configuración que acabamos de modificar, habremos visto que en “Preferencias de recepción de pago” existen más opciones. Por ejemplo, bloquear pagos accidentales, bloquear pagos según ciertos motivos, podemos añadir un campo de texto “Añadir instrucciones para el vendedor”, e incluso podemos modificar el texto que aparecerá en el extracto bancario del comprador. Por supuesto, todo esto lo podemos modificar a nuestro antojo, siempre que sepamos lo que estamos haciendo. Conviene revisar bien todas las configuraciones que podemos hacer en PayPal, para no dejarnos cabos sueltos. Al fin y al cabo, es el medio con el que nuestros clientes van a pagarnos, y si no consiguen hacerlo por algún motivo, podríamos perder esa venta.

Ya tenemos PayPal configurado y listo para enviarnos los datos IPN tras una compra, para aceptar pagos de todo el mundo, y para que nuestros clientes no se pierdan por el camino.

Consejo: Para realizar pagos en tu sistema “de pruebas”, puedes utilizar una segunda cuenta de PayPal para realizar micropagos de 0,01 €, y cosas así, pero te recomendamos que en lugar de eso, te registres en el SandBox de PayPal. Es un clon de PayPal en todos los aspectos, salvo que los usuarios de uno no son válidos en el otro, y que todo el dinero de SandBox es ficticio. Crea tu cuenta en SandBox, añade una cuenta Business y configurala para recibir notificaciones IPN como hemos visto. Luego crea otra cuenta personal (con fondos) para hacer pagos, y configura tu modulo de PayPal para que la pasarela de pago pase por sandbox.paypal.com en lugar de por paypal.com. ¡Y recuerda que todos los pagos son ficticios! Si alguien registra una compra mientras el sistema esté configurado con SandBox, significa que ha usado una cuenta de SandBox para pagar (las normales no funcionan en SandBox), ¡así que el dinero que ha pagado tampoco es real! Si el sitio web está abierto al público mientras haces pruebas, no pongas en tu tienda productos reales a la venta mientras haces pruebas, usa siempre artículos ficticios en los que se vea claramente que no son reales. Incluso deberías poner un aviso indicándolo.

Verificando la identidad del mensajero

¿Seguro que el mensaje viene de PayPal?Hasta ahora sabemos que PayPal nos enviará un mensaje $_POST con todos los datos que necesitamos. Pero pensemos por un momento. Cualquier persona con conocimientos mínimos de programación PHP nos puede colar un pago falso a nuestra web, que se guarde en nuestra base de datos y que nosotros piquemos. Hombre, podemos comprobar que el pago se ha hecho mirando en nuestra cuenta de PayPal, cosa recomendable incluso para pagos bien hechos, pero lo suyo es que esto se compruebe automáticamente.

Así que lo que vamos a hacer es lo siguiente:

  1. PayPal nos va a enviar un mensaje con información.
  2. Antes de tratar esa información, vamos a reenviarsela a PayPal y a preguntarle “Oye, ¿Esta información es tuya? ¿Me la has enviado tú?”.
  3. Si PayPal responde que sí, tendremos la confirmación de que es un pago auténtico, y procederemos a tratar la información. Si responde que no, ignoraremos el mensaje.

Mediante su API, PayPal ofrece los medios para que podamos hacer esto que acabamos de explicar. Así que manos a la obra.

Como ya hemos dicho, PayPal nos enviará la información por medio de $_POST. Así que, primer filtro, si no existe $_POST, no continuaremos. Después de eso, la información que nos llega directamente la convertiremos en un string de valores GET, comenzando por ‘cmd=_notify-validate’.

    // Primera comprobación. Cerraremos este if más adelante
    if($_POST){
        // 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]);
        }

        // Nuestro string debe comenzar con cmd=_notify-validate
        $req = 'cmd=_notify-validate';
        if(function_exists('get_magic_quotes_gpc')){
            $get_magic_quotes_exists = true;
        }
        foreach($myPost as $key => $value){
            // Cada valor se trata con urlencode para poder pasarlo por GET
            if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
                $value = urlencode(stripslashes($value));
            } else {
                $value = urlencode($value);
            }

            //Añadimos cada variable y cada valor
            $req .= "&$key=$value";
        }

Ahora que ya tenemos nuestro string, configuremos el envío de la información a PayPal, para posteriormente, enviarla.

        $ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');   // Esta URL debe variar dependiendo si usamos SandBox o no. Si lo usamos, se queda así.
        //$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');         // Si no usamos SandBox, debemos usar esta otra linea en su lugar.
        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'));

        if( !($res = curl_exec($ch)) ) {
            // Ooops, error. Deberiamos guardarlo en algún log o base de datos para examinarlo después.
            curl_close($ch);
            exit;
        }
        curl_close($ch);

Bien, en este punto, hemos recibido la información, y tal como ha llegado le hemos solicitado a PayPal una confirmación de que el envío es suyo. PayPal nos va a enviar nuevos datos con los que podemos comprobar si nos confirma su veracidad o no. Si en $res encontramos VERIFIED, entonces el pago es correcto. De lo contrario, encontraremos INVALID.

        if (strcmp ($res, "VERIFIED") == 0) {
            /**
             * A partir de aqui, deberiamos hacer otras comprobaciones rutinarias antes de continuar. Son opcionales, pero recomiendo al menos las dos primeras. Por ejemplo:
             *
             * * Comprobar que $_POST["payment_status"] tenga el valor "Completed", que nos confirma el pago como completado.
             * * Comprobar que no hemos tratado antes la misma id de transacción (txd_id)
             * * Comprobar que el email al que va dirigido el pago sea nuestro email principal de PayPal
             * * Comprobar que la cantidad y la divisa son correctas
             */

            // Después de las comprobaciones, toca el procesamiento de los datos.

            /**
             * En este punto tratamos la información.
             * Podemos hacer con ella muchas cosas:
             *
             * * Guardarla en una base de datos.
             * * Guardar cada linea del pedido en una linea diferente en la base de datos.
             * * Guardar un log.
             * * Restar las cantidades de los artículos del stock.
             * * Enviar un mensaje de confirmcaión al cliente.
             * * Enviar un mensaje al encargado de pedidos para que lo prepare.
             * * Comprobar mediante complejas operaciones matemáticas si el cliente es el número un millon y notificarle de que ha ganado dos noches de hotel en Torrevieja.
             * * ¡Imaginación!
             */
        } else if (strcmp ($res, "INVALID") == 0) {
            // El estado que devuelve es INVALIDO, la información no ha sido enviada por PayPal. Deberías guardarla en un log para comprobarlo después
        }
    } else {    // Si no hay datos $_POST
        // Podemos guardar la incidencia en un log, redirigir a una URL...
    }

Tras estas comprobaciones, tratamos por fin los datos de PayPal. Ahora es cuando debemos guardarlos en una base de datos, enviar un email a nuestro comprador… eso es cosa vuestra. Por nuestra parte, lo que sí haremos será detallar los valores POST más interesantes que nos envía PayPal. Recordad que al ser valores POST hay que recuperarlos con $_POST[“campo”]. Podeis consultar la lista completa, así como obtener más información, aquí: IPN and PDT Variables.

  • payment_status: Estado del pago. Si el valor es “Completed”, significa que el pago se ha completado correctamente. Si no, es que hay algún problema o incidencia, que viene explicado por el valor de esta variable.
  • receiver_email: email principal del vendedor PayPal. Aunque el pago se realice a una cuenta secundaria, este valor siempre será el email principal del vendedor.
  • test_ipn: Devuelve 1 siempre que estemos usando SandBox.
  • txn_id: ID de Transacción PayPal.
  • txn_type: Tipo de transacción
  • first_name: Nombre del comprador
  • last_name: Apellidos del comprador
  • payer_email: Email del comprador
  • mc_gross: Cantidad total que ha pagado el comprador.
  • num_cart_items: Si estamos en una transacción con carro de compra, indica el numero de artículos en el carro. Ojo, comprar 2 unidades de un artículo cuenta como un solo artículo. Lo que cuenta son los artículos, no las unidades de estos. Para eso, tenemos quantity.
  • item_nameX: Si estamos en una transacción con carro de compra, item_nameX indica el nombre del item X dentro del carro, siendo X un número entero de 1 a num_cart_items.
  • item_numberX: Indica el número del item X dentro del carro, igual que con item_nameX.
  • quantityX: Indica la cantidad del ítem X dentro del carro.
  • payment_date: Fecha de la compra, según PayPal, en formato HH:MM:SS DD Mmm YY, YYYY PST.

Hay muchas más variables y opciones que podemos consultar y que sería bueno tener en cuenta porque podrían sernos útiles en alguna ocasión. De nuevo, os enlazo a la página con todas ellas: IPN and PDT Variables.

Recibir notificaciones IPN en WordPress, ¿Es posible?

Por supuesto que sí, lo que pasa es que si queremos usar las funciones de WordPress, tales como $wpdb, necesitamos que nuestros datos IPN pasen por el sistema WordPress. ¿Recordáis nuestro post acerca de la reescritura de una URL en WordPress? Nos va a hacer falta.

Simplemente hay que completar el pequeño plugin que creamos en aquel post, añadiendo una función más: “process_paypal_ipn”, por ejemplo. Esta función contiene el código que hemos visto aquí arriba, y debemos llamarla en la función “parse_request”, la que procesaba la información cuando llegabamos a traves de www.miweb.com/mi_plugin/valor.

Suponiendo que creemos “www.miweb.com/paypal/ipn”, entonces debemos modificar el plugin cambiando “mi_plugin” por “paypal” y “valor” por “ipn”. Si vamos a usar la base de datos de WordPress para guardar los datos, recordad instanciar global $wpdb al inicio de la función.

“La función de un buen software es hacer que lo complejo aparente ser simple”
– Grady Booch

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

¡Exprésate! Dejanos tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

60 Comentarios

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!!