Todos los sitios de internet están en la red para vender directa o indirectamente, aunque la compra online, en España no se encuentra tan extendida como en otros paises todavía. El porcentaje en la relación visitas-compra se encuentra alrededor del uno por ciento. Se pueden crear multitud de tiendas online,con distintos gestores de contenido como wordpress mediante su plugin woocommerce,joomla mediante su componente virtuemart,o con cms propios para tiendas tales como son magento o prestashop.
Descargando estos módulos o plugins para estas aplicaciones, y dándonos de alta mediante los tpv de nuestro banco o cajas de ahorro,o mediante el uso de paypal con su adecuada configuración en la aplicación, podemos montar cualquier tienda online.
No obstante si se tiene que desarrollar este tipo de conexiones entre la tiendas y las correspondientes pasarelas de pago desde cero sin ningún tipo de gestor entre medias, conviene entender como funcionan esta pasarelas. En el siguiente tutorial voy a tratar de explicar el flujo de transmisión de datos que hay entre la tienda online, y la web de paypal. Para realizar entre cualquier web y una pasarela de pago de cualquier banco o caja de ahorros sería similar.
Hay multitud de maneras de realizar pagos mediante paypal, para ello lo mejor es acceder a la documentación de paypal y empaparse los código y variables que hay que pasar para que la tienda funcione correctamente. Es en este tutorial vamos a centrarnos en el pago stándar con unos datos supersencillos que se pueden complicar todo lo que queramos.
De manera rápida como se muestra en la imagen el flujo entre la tienda online es un camino de ida y vuelta con la consiguiente comprobación.
Para montar la típica pasarela de pago lo normal es que haya un carrito de la compra con todos los productos que tenemos incluidos con su descripción, titulo, y precio personalizado, para que estos lleguen a la plataforma de paypal y veamos con exactitud lo que estamos comprando. A la hora de mandar los datos a paypal mediante el formulario, en la parte del <form action="..."> se tiene que enviar a la aplicación de paypal con su correspondiente url, los datos de la compra que vamos a pasar desde la tienda. A la hora de programar este paso y realizar las correspondientes comprobaciones para ver que los datos y las transacciones se realizan correctamente, hay que crearse una cuenta de comprador y otra de vendedor, tanto en el entorno de pruebas como en el entorno real.
La url para el entorno de pruebas es https://www.sandbox.paypal.com/cgi-bin/webscr y para el entorno real https://www.paypal.com/cgi-bin/webscr.
El resumen del flujo del tránsito de datos entre cualquier web y el pago de paypal es que mediante un formulario en el que irán los campos ocultos con los valores de por ejemplo nuestro carrito de la compra se envía la notificación correspondiente mediante su protocolo IPN (Instant Payment Notification) y que hay que activar en paypal para que se pueda tener el control sobre como se encuentra el producto pagado. La configuración del ipn en paypal merece otro tutorial a parte en esta parte para tener la certeza que se ha pagado lo normal es mandar un correo,habiendose realizado el pago o insertar los pagos en una base datos para llegar un control de quien nos va comprando.
Un ejemplo de formulario para mandar datos a paypal sería el siguiente.
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_cart" />
<input name="upload" type="hidden" value="1" />
<input name="business" type="hidden" value="tucodigodevendedor" />
<input name="shopping_url" type="hidden" value="ladirecciondetuweb" />
<input name="currency_code" type="hidden" value="EUR" />
<input name="return" type="hidden" value="http://mipagina.com/mensaje_compra_exitosa.php" />
<input name="notify_url" type="hidden" value="http://mipagina.com/paypal_ipn.php" />
<input name="rm" type="hidden" value="2" />
#LECHUGAS ; Nombre: Lechugas ; Valor : 15.00 , Cantidad : 2
<input name="item_number_1" type="hidden" value="LECHUGAS2" />
<input name="item_name_1" type="hidden" value="LECHUGAS" />
<input name="amount_1" type="hidden" value="15.00" />
<input name="quantity_1" type="hidden" value="2" />
#PLÁTANOS ; Nombre: Piruletas ; Valor : 3.00 , Cantidad :15
<input name="item_number_2" type="hidden" value="PLÁTANOS15" />
<input name="item_name_2" type="hidden" value="PLÁTANOS" />
<input name="amount_2" type="hidden" value="3.00" />
<input name="quantity_2" type="hidden" value="5" />
<input type="submit" value="PayPal SandBox" />
</form>
En el action como se ha comentado anteriormente va la dirección de paypal ya sea la del entorno de pruebas como la del entorno real. El resto de valor del formulario con los campos ocultos que piden paypal son los siguientes.
cmd-Tipo de fichero que se manda a paypal
_cart : varios productos mediante carrito de la compra.
_donations:donaciones.
_xclick:comprar directo de un producto.
business-Identificador de la cuenta de paypal de comprador.buyer_1265883185_biz@gmail.com
shopping_url ;-La dirección de nuestra tienda online.
currency_code- Tipo e moneda (USD , EUR ...)
return-Será el enlace de vuelta a nuestro negocio que ofrece paypal después de pagar
notify_url ;-En esta pagina es donde recogeremos el estado del pago y todas las variables para llevar el control del pago.
rm-Método a usar para enviar la información desde paypal a nuestra web 1 sería GET y 2 POST
item_number_X-Identificador del producto
item_name_X ;Nnombre del producto
amount_X ;-Precio del producto
quantity_X ;-Cantidad del producto
A continuación se detalle la estructura del archivo que lleva el control de los datos ipn en este caso vamos a llamarlo ipn.php.
<?php
//Leer POST del sistema de PayPal y añadir 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
//header para el sistema de paypal
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
//header para el correo
$headers = 'From: webmaster@ejemplo.com' . "\r\n" .
'Reply-To: webmaster@ejemplo.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
//Si estamos usando el testeo de paypal:
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
//En caso de querer usar PayPal oficialmente:
//$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
// ERROR DE HTTP
echo "no se ha aiberto el socket<br/>";
}else{ echo "si se ha abierto el socket<br/>";
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {//Almacenamos todos los valores recibidos por $_POST.
foreach($_POST as $key => $value){
$recibido.= $key." = ". $value."\r\n";
}//Enviamos por correo todos los datos , esto es solo para que veáis como funciona
//En un caso real accederíamos a una BBDD y almacenaríamos los datos.
// > Comprobando que payment_status es Completed
// > Comprobando que txn_id no ha sido previamente procesado
// > Comprobando que receiver_email es tu email primario de paypal
// > Comprobando que payment_amount/payment_currency son procesos de pago correctos
mail("correo", "NOTIFICACION DE PAGO", $recibido , $headers);
} else if (strcmp ($res, "INVALID") == 0) {
mail("correo", "NOTIFICACION DE PAGO INVALIDA", "invalido",$headers);}
}fclose ($fp);
}
?>
Este script está oculto y solo se ejecuta en el momento que se ha hecho la compra por paypal de manera corrrecta, estando la trasacción finalizada en nuestra cuenta, pero como se ha comentado anteriormente para ello en nuestra cuenta de paypal hay que configurar el ipn correspodiente con la dirección en donde se va ejecutar por ejemplo http://midominio.com/ipn.php y en esta parte se ejecutaría las altas en la base de datos envío de correo entre otros. Activar el ipn en paypal es un tarea sencilla pero puede resultar en algunos momentos engorrosa por los cambios en la interfaz de la web.
A continuación os dejo la documentación para pagos standar y un ejemplo de como funciona el script y os los podais descargar.
Documentación paypal pagos standar: