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 // ?>
Comentarios