Controlar los pagos por PayPal mediante Notificación de Pago Instantánea

Tras ver como realizar pagos por PayPal en una tienda virtual en tu web, el siguiente paso sería saber si finalmente el usuario realizó el pago o no, ya que podría haber cerrado la ventana, no tener la tarjeta de crédito a mano o simplemente haberse arrepentido.

Verificando el pago de las compras en un comercio electrónico mediante PayPal

Como no sabemos si el cliente va a realmente a pagar tras ir a la pantalla de pago de PayPal, lo ideal es tratar cada compra como no pagada hasta que recibamos la confirmación por parte de PayPal de que así ha sido.

Para recibir la notificación por parte de PayPal, deberemos activar la opción del Instant Payment Notification o Notificación de Pago Instantánea en el panel de control de tu cuenta y especificar la ruta de donde tiene que avisar con unos datos relativos a la compra que se ha realizado satisfactoriamente.

Este archivo al que PayPal avisa lo alojaremos en nuestro servidor y deberá ser programado a medida para realizar la acción que corresponda. En nuestro caso programaremos en PHP y la ruta de aviso por ejemplo podría ser http://www.mi-host-de-pruebas.com/paypal_ipn.php

La programación del archivo paypal_ipn.php hará actualizar el estado en base de datos de ese pedido de no pagado a pagado.

Configurando Instant Payment Notification en nuestra cuenta de PayPal

Lo primero deberemos crear una cuenta Premier o Business de PayPal y acceder a ella. En la pantalla principal, deberemos estar en la pestaña "Mi cuenta", ir al submenú "Perfil" y elegir "Más opciones".

En la nueva pantalla elegir la opción "Preferencias de Notificación de pago instantánea". Ahora rellenaremos el campo "URL de notificación" con la dirección que nos interese (por ejemplo http://www.mi-host-de-pruebas.com/paypal_ipn.php), marcaremos la opción de "Recibir mensajes de IPN (activado)" y guardaremos los cambios.

Programando la actualizado de la compra electrónica con PHP

Cuando se realiza un pago satisfactoriamente, PayPal nos envía una serie de variables mediante POST con la que podemos identificar qué pago se ha pagado satisfactoriamente, pero sólo nos harán falta dos:

  • payment_status: puede tener varios valores, pero los que nos interesan son sólo dos, Completed, que significa que la transacción de dinero se ha completado, y Processed, indica que el pago ha sido aceptado pero no se ha completado aún la transacción de dinero por que el banco del cliente aún no ha hecho la transferencia de dinero (este caso también lo contemplamos como pago válido).
  • item_number: esta variable es una de las que nuestra página web envío al redirigirnos a PayPal (lo podemos ver en la primera parte de como utilizar PayPal en nuestra página web) y contiene un valor que identifique la compra que se ha pagado.

Lo primero es comprobar que payment_status nos indica que se ha realizado un pago, a partir de ahí deberemos jugar con la variable item_number que puede tener múltiples usos. Si por ejemplo al llamar a PayPal indicamos que item_number es "VENTA-512", en la notificación sabremos que la venta de identificador 512 se ha pagado satisfactoriamente.

También podríamos realizar distintos tipos de pago en nuestra web que no sólo sea de venta, si no transacción, alquiler, etc. y siempre podríamos identificarla mediante la variable item_number.

Ejemplo de como procesar una Notificación de Pago Instantánea mediante PHP

<?php

// Poner aquí código de inicialización en base de datos //

if($_POST['payment_status']=='Completed' || $_POST['payment_status']=='Processed') {
	// Suponemos que el item_number que nosotros enviamos es del formato: XXXXX-YYYY
	// Donde XXXXX es el tipo de pago e YYYY es el identificador único del pago
	$tipo_venta_aux = explode('-',$_POST['item_number']);
	$tipo_venta = $tipo_venta_aux[0];
	$item_pagado = $tipo_venta_aux[1];

	$pago_valido = false;

        // Verificamos en base de datos
	switch($tipo_venta) {
		case 'VENTA':
			// Verificamos que es una venta existente y pendiente de pago
			$pago_valido = true;
			break;
		case 'ALQUILER':
			// Verificamos que es un alquiler existente y pendiente de pago
			$pago_valido = true;
			break;
		case 'PAGO_MENSUAL':
			// Verificamos que es un pago mensual existente y pendiente de pago
			$pago_valido = true;
			break;
	}

	if($pago_valido == true) {
		// Actualizamos el estado a pagado y hacemos lo que nos interese.
		// Como por ejemplo notificar al cliente de que el pago ha sido registrado.
	}
}

// Poner aquí código de finalización en base de datos //

?>

Páginas y artículos relacionados

Comentarios

Comentario de vic - 11 de Julio de 2011 - 02:10
Hola un código muy sencillo y claro pero lamento comunicarte que no es para nada seguro. Basta con que un usuario sepa que el pago se hace a la dirección paypal_ipn.php y que envíe un formulario desde cualquier sitio con el post $_POST['payment_status']=='Completed' $_POST['payment_status']=='Processed' Con eso si es una empresa que vende algún tipo de servicio de descargas al instante el usuario se saldría con la suya sin pagar un duro. De todas formas me has dado una idea y es que si a tu código le añadimos la opción de que valide que el post [mc_gross] (es el precio del producto) es el correcto y le añadimos varios GET a la URL del tipo paypal_ipn.php?pass1=12345678&pass2=abcdef&pass3=987654. Ya sería mucho más segura y aunque el usuario se entere de cuál es el fichero que tramita el IPN (no tiene porque puesto que solo está reflejado en mi cuenta de Paypal.com) debería de averiguar las contraseñas correspondientes para poder validar el pago. Si se me hubiese ocurrido esto antes me hubiera ahorrado un montón de horas que me tire creando el sistema que recomiendan los de Paypal con doble retroalimentación que es un coñazo. Un saludo.
Comentario de Imaginanet - 11 de Julio de 2011 - 11:55
Hola vic, este ejemplo es muy básico y bastante efectivo y seguro cuando se trata de un comercio online que recibe notificaciones via email de PayPal cuando se realiza el pago, por lo que realmente la notificación IPN es auxiliar y es siempre a modo orientativo, no como algo definitivo. La solución que propones es bastante útil para automatizar el proceso, aunque el uso de unas contraseñas estáticas sería igual de inseguro si se hiciera un sniffing de red y se capturase dicha URL y contraseñas, pero se solucionaría con el uso de certificados SSL y una URL HTTPS donde colocar el archivo IPN.
Comentario de marlon - 20 de Octubre de 2011 - 23:53
Así cualquiera aprende, gracias a todos !! (y)
Comentario de Kharen - 14 de Noviembre de 2011 - 16:40
Hola: Quisiera hacer lo mismo que comentan aquì, pero en ASP.NET... cómo serìa el código???
Comentario de gon - 22 de Noviembre de 2011 - 00:07
y para probarlo en localhost?
Comentario de Imaginanet - Carlos - 24 de Febrero de 2012 - 06:56
Hola gon, para probarlo en localhost, dependerá de si tienes router o modem en casa. En caso de tener router deberás poner la IP pública de tu router en la configuración de IPN y dentro de la configuración de tu router hacer Port Forwarding del puerto 80 hacia tu IP local. En caso de tener modem, simplemente poniendo la dirección IP pública. Saludos.
Comentario de Fernando - 21 de Mayo de 2012 - 20:19
Hola, mi pregunta es ¿el servicio IPN de Paypal funciona tambien con clientes que realizan el pago sin ser usuarios de Paypal...?, tengo entendido que solamente funciona cuando el que paga tiene cuenta en Paypal. Gracias y saludos Fernando
Comentario de Imaginanet - Carlos - 22 de Mayo de 2012 - 05:51
Hola Fernando, no es exáctamente así. En PayPal podemos hacer pagos tanto con cuenta de PayPal como con una tarjeta de crédito MasterCard, VISA, American Express, etc. Tras realizar el pago, es cuando PayPal realiza la llamada IPN, pero es independiente al método de pago. Básicamente es un chivato de cuando ha entrado dinero a una cuenta. Saludos.
Comentario de Daniel - 30 de Julio de 2012 - 23:42
Hola, muy interesante tu artículo, te hago una consulta, estoy probando con la sandbox de paypal y un script php en una web, ahí mi pregunta: cuando toco el botón comprar me redirige a la pagina de paypal para realizar el pago , luego cuando se completa el pago, hay que tocar el link que dice "volver a email del vendedor" una vez que clickeo ahi va a la página del IPN recien ahi se activa la descarga de un archivo, hay forma que se haga esto sin tocar ese link de retroceso? Un abrazo, gracias
Comentario de Imaginanet - Carlos - 21 de Agosto de 2012 - 09:06
Hola Daniel, si has seguido el proceso, la funcionalidad IPN se activa automáticamente en cuanto el cliente hace click en el botón de pagar y se verifica el pago por parte de PayPal. El botón que te refieres es "Volver a la tienda del vendedor" (o algo por el estilo) y es configurable mediante el parámetro del formulario de llamada
Comentario de jose - 22 de Enero de 2013 - 19:21
hola, que diferencia hay en activar el servicio IPN a poner una pagina en el return del formulario del boton de paypal y leer la variable $_POST ?
Comentario de Migueledo - 17 de Febrero de 2013 - 17:51
Hola amigos de Imaginanet, tambien me pasa como a Daniel (el del comentario aqui arriba) que luego de pagar sale un enlace de "Volver a ..." donde ... representa el nombre de la empresa definida en Sandbox. No se si es por estar en Sandbox o por estar en localhost. Me gustaria que me dieran una luz al respecto. Gracias por el articulo.
Comentario de Imaginanet - Carlos - 27 de Febrero de 2013 - 07:51
Hola Migueledo, si estás en localhost deberás redirigir adecuadamente tu router y la dirección de vuelta de IPN para que funcione.
Comentario de elda saavedra - 29 de Mayo de 2014 - 19:56
La cuenta bancaria debe ser abierta en USA o en un banco de Bolivia sirve?? y para los retisrso de dinero ya no interviene la tarjeta de crédito??
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: