Integración de pagos en línea usando PayPal con PHP

Compartir

paypal_integracion

Demostración

Integración de pagos en línea

En tutoriales anteriores, ya hemos visto, ¿cómo podemos utilizar PayPal para hacer un Sistema de Pedidos de Pizza con Paypal usando PHP, también ¿cómo hacer un sistema de cupones de descuento con PHP & PayPal? Bien esta vez se nos ocurrió hacer un pequeño tutorial agregando unos cambios para crear una integración de pagos en línea usando PayPal con PHP. A continuación, vamos a ir a ver cómo podemos integrar PayPal como pasarela de pago usando PHP y PDO. El uso de PDO puede integrar un script para que se conecte a cualquier base de datos que soporta PDO.

El motivo de este tutorial es dar a conocer las bases de implementación de una pasarela de pago como lo es PayPal, para la implementación en sitios web de venta de productos en línea, generalmente solemos llamar e-commerce o comercio, mediante lo cual se puede vender productos, utilizando un método de pago muy seguro y confiable a nivel mundial, es decir, PayPal.

Lo que haremos:

Paso 1: Creación de la base de datos. Abrir phpmyadmin, crear una nueva base de datos y ejecutar la siguiente consulta SQL.

-- phpMyAdmin SQL Dump
-- version 4.4.14
-- http://www.phpmyadmin.net
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 14-09-2016 a las 13:20:56
-- Versión del servidor: 5.6.26
-- Versión de PHP: 5.6.12

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */;

-- -- Base de datos: `paypal` --

-- --------------------------------------------------------

-- -- Estructura de tabla para la tabla `tbl_product_detail` --

CREATE TABLE IF NOT EXISTS `tbl_product_detail` ( `product_id` int(11) NOT NULL, `item_number` varchar(255) NOT NULL, `product_name` varchar(255) NOT NULL, `product_img` varchar(255) NOT NULL, `product_price` int(11) NOT NULL, `product_currency` varchar(255) NOT NULL, `product_dec` text NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

-- -- Volcado de datos para la tabla `tbl_product_detail` --

INSERT INTO `tbl_product_detail` (`product_id`, `item_number`, `product_name`, `product_img`, `product_price`, `product_currency`, `product_dec`) VALUES (1, 'MQ==', 'HP Pavilion x360', 'img/1.jpg', 399, 'USD', 'Este equipo convertible, repleto de recursos fantásticos, posee una bisagra que gira 360 grados y te permite cambiar fácilmente entre diversas posiciones (notebook, atril, tienda de campaña o tablet), según tus necesidades de trabajo o entretenimiento.'), (2, 'Mg==', 'Nikon D3300', 'img/2.jpg', 550, 'USD', 'Nikon D3300 DSLR Camera with 18 55mm VR lens: Capture photographs with true-to-life details using this DSLR camera, which features a 24.2-megapixel CMOS sensor and comes with an AF-S DX NIKKOR VR II lens, so you can snap clear shots whether you''re a professional or just in it for the memories.'), (3, 'Mw==', 'Keyboard and mouse set - wireless - 2.4 GHz', 'img/3.jpg', 80, 'USD', ' With a comfort wave design keyboard, a contoured laser mouse, and batteries that last, this wireless combo gives you a comfort curve without the learning curve - at home or at the office.');

-- -- Índices para tablas volcadas --

-- -- Indices de la tabla `tbl_product_detail` -- ALTER TABLE `tbl_product_detail` ADD PRIMARY KEY (`product_id`);

-- -- AUTO_INCREMENT de las tablas volcadas --

-- -- AUTO_INCREMENT de la tabla `tbl_product_detail` -- ALTER TABLE `tbl_product_detail` MODIFY `product_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Paso 2: Conectar la base de datos creando el archivo llamado conexion.php

<?php
function abrir_conexion() {
    // Credenciales de la base de datos 
    $servername = "localhost";//Servidor de la base de datos
    $username = "root";//Nombre de usuario
    $password = "";//Contraseña
    //Nombre de la base de datos
    $dbname = "paypal";
    try {
        global $con;
        // Abrir la conexion usando PDO.
        $con = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // Estable el modeo de errores usadndo  excepciones PDO
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        die($e->getMessage());//Imprime el mensaje de error en pantalla
    }
}
function cerrar_conexion() {
    global $con;
    $con = null;
}
?>

Nota: Es necesario ingresar las credenciales de conexión a la base de datos,  según corresponda en tu servidor.

Paso 3: Crear archivo  function.php

Este archivo contiene todas las funciones necesarias para interactuar con nuestra base de datos.

<?php
//Esta funcion es usada para recorrer todos los registros de 1 tabla
function Select_All_Records($table_name) {
    global $con;
    $sql = "select * from $table_name";
    try {
        $stmt = $con->query($sql);
        return $stmt;
    } catch (PDOException $e) {
        print $e->getMessage();
    }
}

//Esta funcion es usada para recorrer los registro de 1 tabla aplicando 1 filtro. function Select_Record_By_One_Filter($data, $table_name) { global $con; $key = array_keys($data); $value = array_values($data); $sql = "select * from $table_name where $key[0] = '$value[0]'"; try { $stmt = $con->query($sql); return $stmt; } catch (PDOException $e) { print $e->getMessage(); } }

//Esta funcion es usada para recorrer los registro de 1 tabla aplicando 2 filtros. function Select_Record_By_Two_Filter($data, $table_name) { global $con; $key = array_keys($data); $value = array_values($data); $sql = "select * from $table_name where $key[0] = '$value[0]' AND $key[1] = '$value[1]'"; try { $stmt = $con->query($sql); return $stmt; } catch (PDOException $e) { print $e->getMessage(); } }

//Esta funcion es usada para obtener 1 registro de forma aleatoria. function Select_One_Random_Record($table_name) { global $con; $sql = "SELECT * FROM $table_name ORDER BY RAND() LIMIT 1"; try { $stmt = $con->query($sql); return $stmt; } catch (PDOException $e) { print $e->getMessage(); } } ?>

Paso 4: Creación  del archivo productos.php. Este es el archivo principal en el que los detalles de los productos se visualizan con el botón para realizar el pago a través de PayPal. 

<?php
include('include/function.php');
include('include/conexion.php');
abrir_conexion();//Abre la conexion a la base de datos
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Integración de pagos en línea usando PayPal con PHP</title>
	<!-- Latest compiled and minified CSS -->
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
	<link rel="stylesheet" href="style.css">
	<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
	</head>
<body>
<div class="row-fluid" id="products-columns">
		<h1 class="text-center">Integración de pagos en línea usando PayPal con PHP</h1>

<?php //Select_All_Records function es usada para obtner todos los registros de la base de datos $query = Select_All_Records('tbl_product_detail'); $query->setFetchMode(PDO::FETCH_ASSOC); while ($result = $query->fetch()) { ?> <div class="col-md-4 col-sm-6 col-xs-12"> <div class="panel"> <div class="panel-body"> <a href="#"><img src="<?php echo $result['product_img'];?>" class="img-responsive"></a> <div class="title-products-columns"> <h4 class="text-center"><a href="#"><strong><?php echo $result['product_name']; ?></strong></a></h4>

<hr> <p > <?php echo $result['product_dec']; ?> </p> </div> <div class="footer-realestates-columns"> <div class="row"> <div class="col-sm-12"> <a href="process.php?id=<?php echo base64_encode($result['product_id']); ?>" class="btn btn-info btn-lg btn-block"><i class="fa fa-paypal"></i> COMPRAR AHORA USD <?php echo $result['product_price']; ?></a> </div> </div> </div> </div> </div> </div> <?php

} ?> </div> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> </body> </html> <?php cerrar_conexion(); ?>

Paso 5: Crear el archivo process.php. Este archivo contiene código para procesar el pago de PayPal.

<?php
include('include/function.php');
include('include/conexion.php');
abrir_conexion();//Abre la conexion a la base de datos
if (isset($_REQUEST['id'])){
	$product_id=base64_decode(($_REQUEST['id']));//Descodifica la variable con base64_decode
	$product_id=intval($product_id);//Convierto el valor recibido en un entero
	//A continuacion realizar una consulta a la base de datos 
	//Para verificar el valor pasado
	$data = array('product_id' => $product_id);
	$query = Select_Record_By_One_Filter($data, 'tbl_product_detail');
	$query->setFetchMode(PDO::FETCH_ASSOC);
	$result = $query->fetch();
	$product_name = $result['product_name'];//Nombre del producto
	$product_price = $result['product_price'];//Precio del producto
	$product_currency = $result['product_currency'];//Moneda del producto 
	cerrar_conexion();//Cierro la conexion a la base de datos

//URL Paypal Modo pruebas. $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; //URL Paypal para Recibir pagos //$paypal_url = 'https://www.paypal.com/cgi-bin/webscr'; //Correo electronico del comercio. $merchant_email = 'joaquinobed123456@gmail.com'; //Pon aqui la URL para redireccionar cuando el pago es completado $cancel_return = "http://localhost/paypal-integracion/productos.php"; //Colocal la URL donde se redicciona cuando el pago fue completado con exito. $success_return = "http://localhost/paypal-integracion/success.php"; ?> <div style="margin-left: 40%"><img src="img/processing_animation.gif"/> <form name="myform" action="<?php echo $paypal_url; ?>" method="post" target="_top"> <input type="hidden" name="cmd" value="_xclick"> <input type="hidden" name="cancel_return" value="<?php echo $cancel_return ?>"> <input type="hidden" name="return" value="<?php echo $success_return; ?>"> <input type="hidden" name="business" value="<?php echo $merchant_email; ?>"> <input type="hidden" name="lc" value="C2"> <input type="hidden" name="item_name" value="<?php echo $product_name; ?>"> <input type="hidden" name="item_number" value="<?php echo $product_id; ?>"> <input type="hidden" name="amount" value="<?php echo $product_price; ?>"> <input type="hidden" name="currency_code" value="<?php echo $product_currency; ?>"> <input type="hidden" name="button_subtype" value="services"> <input type="hidden" name="no_note" value="0"> </form> <script type="text/javascript"> document.myform.submit(); </script> <?php

} else { header("location:productos.php"); exit; } ?>

Nota: Si deseas ejecutar el script  para tus proyectos en vivo simplemente cambia el valor de la varibale $ paypal_url en la página anteior.

Paso 6: Crear archivo success.php

PayPal llama a este archivo cuando el pago se ha completado con éxito y proporciona un arreglo ($array)  $ _REQUEST  que contiene información relacionada al producto que el cliente pago a través de PayPal, dicha información es:  Identificación del producto, Identificación de la transacción de PayPal, El monto que recibió PayPal, El tipo de moneda que PayPal recibió y el estado de la transacción de PayPal.

<?php
include('include/function.php');
include('include/conexion.php');
abrir_conexion();//Abre la conexion a la base de datos

if (!empty($_REQUEST)) { $product_no = $_REQUEST['item_number']; // ID del producto $product_transaction = $_REQUEST['tx']; // ID de transacción Paypal $product_price = $_REQUEST['amt']; // Monto recibido Paypal $product_currency = $_REQUEST['cc']; // Moneda recibida de Paypal $product_status = $_REQUEST['st']; // Estado del producto Paypal

$product_no = intval($product_no); $data = array('product_id' => $product_no); $query = Select_Record_By_One_Filter($data, 'tbl_product_detail'); $query->setFetchMode(PDO::FETCH_ASSOC); $result = $query->fetch(); } else { header("location:productos.php"); exit; }

?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> <title>Integración de pagos en línea usando PayPal con PHP</title> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link rel="stylesheet" href="style.css"> <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"> </head> <body> <div class="row-fluid" id="products-columns"> <h1 class="text-center">Integración de pagos en línea usando PayPal con PHP</h1>

<div class="col-md-4 col-md-offset-4"> <div class="panel panel-info"> <div class="panel-heading"> <h4 class='text-center'> Estado de pago</h4> </div> <div class="panel-body"> <?php if ($product_price == $result['product_price'] && $product_currency == $result['product_currency']) { ?> <h3 class='text-success text-center'>Pago recibido exitosamente</h3> <p>Estado de la transacción: <?php echo $product_status;?></p> <p>Id de transacción: <?php echo $product_transaction;?></p> <p class="text-center"> <a href="productos.php" class="btn btn-primary btn-lg"> << Regresar a los productos</a> </p> <?php } else { ?> <h3 class='text-danger text-center'>Pago falló</h3> <p>Estado de la transacción: Incompleto</p> <p>Id de transacción: <?php echo $product_transaction;?></p> <p class="text-center"> <a href="productos.php" class="btn btn-primary btn-lg"> << Regresar a los productos</a> </p> <?php } ?> </div> </div>

</div>

</div> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> </body> </html> <?php cerrar_conexion(); ?>

Paso 7: Crear archivo style.css

Contiene un estilo CSS basico para los elementos HTML que son mostrados en la página. Cabe mencionar que en el archivo productos.php  y success.php, el  sistema hace una llamada a archivos externos para el diseño CSS, para este tutorial se ha usado el framework css bootstrap

@import url(http://fonts.googleapis.com/css?family=Raleway);
body{
	font-family:raleway;
    margin-top:20px;
    background-color: #f2f2f2;
}

#products-columns .title-products-columns h4 a { color: #1abc9c; font-weight: 300; font-size: 18pt; text-decoration: none; } #products-columns img { border: 2px solid #ecf0f1; width: 100%; height: 300px; margin-bottom: 10px; }

.btn-info:hover{ background-color: #1abc9c; border: 2px solid #1abc9c; }

Descargar archivos

Conclusión:

Luego de haber leído el post anterior, estoy seguro de que  será de mucha utilidad a tus proyectos para procesar pagos en línea, usando como pasarela de pagos PayPal,  eres libre de usar el código tanto para fines educativos como para fines comerciales.

Te invito a que dejes un comentario describiendo que tal te pareció este post,  te lo agradeceré.

Obed Alvarado

Sobre el autor

Artículo redactado por Obed Alvarado. Comparto experiencias prácticas sobre PHP, MySQL, aplicaciones web, instalación en hosting y herramientas para negocios.

Comentarios