lunes, 17 de septiembre de 2012

IPN, Notificación de Pago Instantánea de Paypal

Valencia, 17/09/2012 Gatsu


Todo el mundo conoce Paypal hoy en día, y si no lo conoce, que le eche un vistazo a su página oficial.
Cuando una persona efectua una compra, una suscripción, una cancelación... una acción con su cuenta paypal hacia una cuenta empresarial que vende un producto o servicio, los encargados de gestionar esa cuenta empresarial pueden habilitar la opción de IPN, que consiste en ejecutar una página alojada en su hosting que se ejecutará en cada acción que haga un usuario para un producto empresarial. Su uso más común es el de registrar en una base de datos los movimientos para no estar pendiente del histórico de paypal.
Aunque suena complejo, Paypal ofrece ejemplos para distintos lenguajes de programación en servidor del código necesario para que la ejecución del archivo IPN sea correcta, después ya es cuestión de añadir las funcionalidades que sean necesarias.

Vamos por partes, comencemos por registrarnos una cuenta en sandbox de paypal (https://developer.paypal.com/), después nos creamos dos cuentas preconfiguradas, una personal y otra business, ésto ahorra todo el tiempo de poner los datos de cuenta, además es importante mencionar que, mientras trabajemos bajo sandbox, el dinero es virtual, con lo que podemos experimentar todo lo que queramos sin preocuparnos.
Una vez creadas las cuentas, entramos a la cuenta business, y en perfil, pulsamos sobre "Preferencias de Notificación de Pago Instantánea", editamos la configuración colocando una URL (ojo, enlace activo y sin puertos, por ejemplo www.dominio.es/ipn.jsp). Ahora vamos a crear el archivo ipn, por mi experiencia lo voy a mencionar para el lenguaje jsp, pero como he mencionado anteriormente, paypal ofrece ejemplos para varios lenguajes web.

En función del lenguaje que utilice nuestro servidor, accediendo a la página de ejemplos ipn de paypal, seleccionamos el archivo de texto con el lenguaje que utilizamos. Para jsp tengo que mencionar que hay una frase literal que debería ser un comentario pero por error no lo es, me refiero a "check notification validation".
Lo primero a modificar del archivo que descarguemos es la línea que hace la conexión a la URL de paypal, ya que si estamos trabajando con sandbox, esa URL es incorrecta, y la tenemos que cambiar por "https://www.sandbox.paypal.com/cgi-bin/webscr". Cuando dejemos el archivo ipn de forma oficial entonces pondremos la URL que venía originalmente en el archivo.
Lo siguiente a tener en cuenta es la parte de los parámetros que recibe el archivo, no están todos los necesarios escritos, para saber exactamente todos los parámetros que hay, y sus posibles valores, podéis acceder a la página de variables de IPN.

Una vez visto y comprendido todo lo anterior, solo queda añadir el código que necesitemos ejecutar. Yo me he basado en filtrar con condiciones en función de si el usuario realiza una suscripción, o se realiza el pago automático de la suscripción, y si el usuario cancela o se termina la suscripción. A continuación pongo un fragmento de código para que se entienda mejor:

if(res.equals("VERIFIED")) { if (paymentStatus != null && paymentStatus.equals("Completed") && txnType.equals("subscr_payment")){ //pago completado y periódico //conexión a la base de datos y notificación correspondiente } else if (txnType.equals("subscr_eot") || txnType.equals("subscr_cancel")){//suscripcion cancelada //conexión a la base de datos y notificación correspondiente } } else if(res.equals("INVALID")) { // log for investigation } else { // error }

Aspectos a tener en cuenta de la IPN:

  • Como hay varias formas de invocar al archivo, es posible que las variables que sirven para un uso, no funcionen para otro, por lo que hay que hacer todas las comprobaciones necesarias para que no falle la ejecución de código.
  • Si se produce un error con la ejecución de código. paypal seguramente reitere la petición en cuestión de segundos (incluso minutos), hasta 8 veces, por lo que si se encuentran registros duplicados es muy posible que sea por eso.
  • Desde el entorno de sandbox se puede testear la funcionalidad del archivo ipn enviando una petición e insertando todos los valores que creamos oportunos. Esta prueba puede dar falsos positivos, por ejemplo para crear una suscripción podemos pasar variables a través del formulario de botón de paypal, pero a la hora de que el usuario realice una cancelación, no podemos añadir información adicional, y es posible que alguna variable sea nula y produzca fallos.
Espero que os sea de utilidad.
Un saludo.

2 comentarios:

  1. Hola!!
    gracias por la información, actualmente ya configuré mi entorno de pruebas en sandbox, en la cuenta paypal normal hay una opción que permite colocar la url de la dirección que quiero que procese mi servidor, pero en sandbox no lo encuentro :( y no se como guardar la información de los usuarios que hacen la transacciòn con php, podrías darme una mano con esto. gracias.

    ResponderEliminar
  2. Buenas noches Miguel.

    Lo primero que tengo que decir es que hace tiempo que no me meto en sandbox, y han cambiado toda la página, ahora está todo lioso pero bueno. Lo primero de todo, el código para trabajar con la IPN en PHP lo puedes copiar de este enlace: https://cms.paypal.com/cms_content/ES/es_ES/files/developer/IPN_PHP_41.txt (encontrado en google buscando php ipn paypal).

    Lo segundo, para usar la ipn desde sandbox tienes que loguearte, aplicaciones, simulador IPN, o directamente pincha aquí: https://developer.paypal.com/webapps/developer/applications/ipn_simulator
    Introduce la URL donde tienes alojado el archivo PHP (recuerda que tiene que ser público ese archivo, si requiere login o vpn para acceder, no te va a dejar) y el tipo de transacción elige echeck complete, a partir de ahí introduce los valores que estimas que va a enviar un usuario en tu web a la IPN y si no te devuelve un error 400 o 500 casi seguro que estará bien.

    Un saludo.

    ResponderEliminar