Autor Tema: Como integrar un sistema de pagos Paypal IPN en tu web  (Leído 8040 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nabetse

  • Recién llegado
  • *
  • Mensajes: 2
  • Karma: +1/-0
    • Ver Perfil
Como integrar un sistema de pagos Paypal IPN en tu web
« : febrero 11, 2010, 09:24:01 pm »
<p>Que tal en esta ocasión les explicare como integrar un sistema de pago
automatizado utilizando Paypal.</p>
<p>Primero para los que no lo sepan ¿que es IPN?</p>
<p>IPN viene de sus siglas en ingles <strong>Instant Payment Notificatio</strong>n
y significa <strong>Notificación de Pago Instantánea</strong>, sirve para
automatizar una pasarela de pago electrónica.</p>
<p>Es decir: El cliente hace su pedido en nuestro sitio Web y en cuanto el pago
sea procesado con éxito podemos entregarle dicho pedido o servicio de forma
instantánea sin tener que realizar intervención humana. La gran ventaja de este
sistema a mi parecer es que es bastante confiable y que podremos ofrecer un
verdadero servicio de calidad a nuestros clientes.</p>
<p>Ventajas que tenemos que tener en cuenta:</p>
<ul>
   <li>No necesitamos invertir en un certificado de seguridad SSL ( opcional )</li>
   <li>No tenemos que invertir en fianzas costosas que nos imponen los bancos
   para integrar un sistema de pago electrónico.</li>
   <li>Las comisiones de Paypal son bastante bajas en comparación de cualquier
   banco.</li>
   <li>Paypal se encarga por nosotros en gran medida de ser un filtro
   antifraudes.</li>
   <li>Nuestra tienda podrá realizar sus ventas sin necesidad de que nosotros
   la tengamos que operar.</li>
</ul>
<p>Si bien no todo en esta vida es perfecto ahora citare las desventajas de
nuestro sistema:</p>
<ul>
   <li>Los clientes tienen que estar registrados en Paypal o registrarse al
   momento de comprar.</li>
   <li>En algunos países no es posible retirar las ganancias en una cuenta
   bancaria. ( Afortunadamente México si esta disponible )</li>
</ul>
<p>Como podemos ver son más las ventajas que Paypal nos ofrece que las
desventajas, y debido al gran auge que esta teniendo y la forma en la que este
servicio crece mundialmente es una gran opción que debemos considerar para
integrar como sistema de pago.</p>
<p><strong>Como funciona IPN?</strong></p>
<ol>
   <li>El cliente realiza una compra utilizando un botón debidamente generado</li>
   <li>Paypal responde a una URL de nuestro sitio Web informando de la compra.</li>
   <li>Nosotros respondemos las variables de Paypal de vuelta, de esta forma
   paypal sabe que las recibimos.</li>
   <li>Paypal responde nuevamente informando el estado de la operación.</li>
   <li>Nosotros almacenamos el log y procesamos el pedido al cliente</li>
</ol>
<p>Bien ahora que entendemos el concepto podemos proceder a leernos toda la
documentación de paypal y crear nuestra API.</p>
<p>Pero no te preocupes que yo ya programe una class para hacer todo el proceso
de compra de una forma rápida y sencilla.</p>
<p>CLASS PAYPAL.</p>

Código: php [Seleccionar]
<?php
/*
/***********************************************************/
/* ____   ____ __   ________  _   __
/* / __ \____ ___  __/ __ \____ _/ /  /  _/ __ \/ | / /
/*   / /_/ / __ `/ / / / /_/ / __ `/ /   / // /_/ /  |/ /
/*  / ____/ /_/ / /_/ / ____/ /_/ / /  _/ // ____/ /|  /
/* /_/ \__,_/\__, /_/ \__,_/_/  /___/_/   /_/ |_/
/* /____/
/***********************************************************/
/*    [+] PASARELA PAYPAL IPN V 1.0 [+]
/* Por Esteban Vaquero Cruz
/* esteban.xfce@gmail.com http://estebanvc.drawcoders.net/
/*   - Sistema de Pagos / IPN por PayPal -
*/
class EVCpaypal{
   var $url = 'https://www.paypal.com/cgi-bin/webscr';
   var $urlipn;
   var $urlok;
   var $urlerror;
   var $emailoid;
   var $divisa;
   var $lenguaje;
   var $pruebas;
   function config_general($mail, $divisa = 'USD',$lenguaje = 'ES',
  $urlipn = false,$urlok = false,
  $urlerror = false,$pruebas = false){
  $this->emailoid = $mail;
  $this->divisa = $divisa;
  $this->lenguaje = $lenguaje;
  if( $pruebas ){
$this->url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
  }
  $this->urlipn = $urlipn;
  $this->urlok = $urlok;
  $this->urlerror = $urlerror;
   }
   function crear_boton($imgboton,$array_datos){
  if( empty( $array_datos ) ){ return false; }
  $boton = '<form action="'.$this->url.'" method="POST">'
  .'<input type="image" src="'.$imgboton.'" border="0" name="submit">'."\n"
  .'<input type="hidden" name="cmd" value="_xclick">'."\n"
  .'<input type="hidden" name="business" value="'.$this->emailoid.'">'."\n"
  .'<input type="hidden" name="currency_code" value="'.$this->divisa.'">'."\n"
  .'<input type="hidden" name="lc" value="'.$this->lenguaje.'">'."\n";
  if( $this->urlipn ){ $boton .= '<input type="hidden" '
  .'name="notify_url" value="'.$this->urlipn.'">'."\n"; }
  if( $this->urlok ){ $boton .= '<input type="hidden" '
.'name="return" value="'.$this->urlok.'">'."\n"; }
  if( $this->urlerror ){ $boton .= '<input type="hidden" '
.'name="cancel_return" value="'.$this->urlerror.'">'."\n"; }
  foreach( $array_datos as $key => $valor ){
$boton .= '<input type="hidden" name="'.$key.'" value="'.$valor.'">'."\n";
  }
  $boton .='</form>'."\n";
  return $boton;
   }
   function IPN( $urlt = false ){
  if ( !function_exists ( 'curl_init' ) ){ return false; }
  $url_paypal = 'cmd=_notify-validate';
  if( $urlt ){
$this->url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
  }
  foreach ($_POST as $key => $valor) {
$valor = urlencode( stripslashes($valor) );
$url_paypal .= "&".$key."=".$valor;
  }
  $SALIDA[ 'estado_pago' ]    = htmlspecialchars($_POST[ 'payment_status' ], ENT_QUOTES);
  $SALIDA[ 'tipo_pago' ] = htmlspecialchars($_POST[ 'payment_type' ], ENT_QUOTES);
  $SALIDA[ 'email_comprador' ]   = htmlspecialchars($_POST[ 'payer_email' ], ENT_QUOTES);
  $SALIDA[ 'nombre_comprador' ]  = htmlspecialchars($_POST[ 'first_name' ].' '.$_POST[ 'last_name' ], ENT_QUOTES);
  $SALIDA[ 'id_comprador' ]   = htmlspecialchars($_POST[ 'payer_id' ], ENT_QUOTES);
  $SALIDA[ 'email_vendedor' ] = htmlspecialchars($_POST[ 'business' ], ENT_QUOTES);
  $SALIDA[ 'id_vendedor' ]    = htmlspecialchars($_POST[ 'receiver_id' ], ENT_QUOTES);
  $SALIDA[ 'id_producto' ]    = htmlspecialchars($_POST[ 'item_number' ], ENT_QUOTES);
  $SALIDA[ 'id_transaccion'] = htmlspecialchars($_POST[ 'txn_id' ], ENT_QUOTES);
  $SALIDA[ 'nombre_producto' ]   = htmlspecialchars($_POST[ 'item_name' ], ENT_QUOTES);
  $SALIDA[ 'cantidad_producto' ] = htmlspecialchars($_POST[ 'quantity' ], ENT_QUOTES);
  $SALIDA[ 'costo_producto' ] = htmlspecialchars($_POST[ 'mc_gross' ], ENT_QUOTES);
  $SALIDA[ 'infoextra' ] = htmlspecialchars($_POST[ 'custom' ], ENT_QUOTES);
  $SALIDA[ 'fecha' ] = date('d-m-Y H:i',time());
  $ch = curl_init ( );
  curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt ( $ch, CURLOPT_URL, $this->url );
  curl_setopt ( $ch, CURLOPT_POST, 1);
  curl_setopt ( $ch, CURLOPT_POSTFIELDS, $url_paypal);
  curl_setopt ( $ch, CURLOPT_TIMEOUT, 90);
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1);
  $buffer = curl_exec ( $ch );
  curl_close ( $ch);
  $SALIDA['respuesta'] = $buffer;
  if (strcmp ($buffer, "INVALID") == 0) {
return false;
  }
  if (strcmp ($buffer, "VERIFIED") == 0) {
return $SALIDA;
  }
  return false;
   }
   function DB_PaypalMYSQL(){
$numargs = func_num_args(); $arg_list = func_get_args();
if( $numargs != 4 ){ return false; }
$link = mysql_connect($arg_list[0],$arg_list[1],$arg_list[2]) or die(mysql_error());
mysql_select_db($arg_list[3], $link) or die(mysql_error());
return true;
   }
   function MYSQL_log( $array,$tabla = "paypal_logs" ){
  foreach( $array as $datos => $valor ){
$campos .= $datos .',';
$valores .= "'".mysql_real_escape_string( $valor )."',";
  }
  $campos  = substr ( $campos , 0, - 1 );
  $valores = substr ( $valores, 0, - 1 );
  $sql ="INSERT INTO ".$tabla." (".$campos.") VALUES (".$valores.")";
  if ( !$res = mysql_query( $sql ) ){
return false;
  }
  return true;
   }
}
?>


<p>&nbsp;</p>
<p>Una ves que descargamos la class vamos a ver como integrarla a nuestro codigo
fuente.</p>
<p><strong>IPN PAYPAL</strong></p>
<p>Lo primero que vamos a hacer es crear el archivo receptor de IPN, a esta URL
será donde Paypal nos envié las notificaciones instantáneas en variables POST</p>
<p>Para eso creamos el archivo ipn.php y dentro colocamos lo siguiente:</p>

Código: php [Seleccionar]
<?php
require('class_EVCPaypal.php');
$paypal_obj = new EVCpaypal(); // Creamos el Objeto
if ( !empty( $_POST ) ){
   $notificacion = $paypal_obj ->IPN(); //Recibimos un array con información de la compra
   if( $notificacion ){
//En caso de no tener una conexion a la base de datos conectamos
$paypal_obj -> DB_PaypalMYSQL('localhost','usuario','password','db');
//Ahora debemos almacenar el array en nuestra base de datos MYSQL
$paypal_obj -> MYSQL_log($notificacion);
   }
}
?>


<p>Es importante que antes de procesar el pedido verifiquemos que la respuesta
concuerde con los datos enviados.<br>
Existen muchas personas que tratarán de alterar las peticiones POST, por ejemplo
tratando de cambiar el precio, es por esa razón que debemos comparar que todos
los datos sean iguales a los que se encuentran en nuestra base datos.</p>
<p><strong>MYSQL</strong></p>
<p>La class que hice puede incluso almacenar directamente el log en la base de
datos, te dejo también el archivo SQL que deberás importar a tu DB.</p>

Código: [Seleccionar]
--
-- Estructura de tabla para la tabla `paypal_logs`
--
CREATE TABLE IF NOT EXISTS `paypal_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `estado_pago` text COLLATE utf8_unicode_ci NOT NULL,
  `tipo_pago` text COLLATE utf8_unicode_ci NOT NULL,
  `email_comprador` text COLLATE utf8_unicode_ci NOT NULL,
  `nombre_comprador` text COLLATE utf8_unicode_ci NOT NULL,
  `id_comprador` text COLLATE utf8_unicode_ci NOT NULL,
  `email_vendedor` text COLLATE utf8_unicode_ci NOT NULL,
  `id_vendedor` text COLLATE utf8_unicode_ci NOT NULL,
  `id_producto` text COLLATE utf8_unicode_ci NOT NULL,
  `id_transaccion` text COLLATE utf8_unicode_ci NOT NULL,
  `nombre_producto` text COLLATE utf8_unicode_ci NOT NULL,
  `cantidad_producto` text COLLATE utf8_unicode_ci NOT NULL,
  `costo_producto` text COLLATE utf8_unicode_ci NOT NULL,
  `infoextra` text COLLATE utf8_unicode_ci NOT NULL,
  `fecha` text COLLATE utf8_unicode_ci NOT NULL,
  `respuesta` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
--
-- Volcar la base de datos para la tabla `paypal_logs`
--

<p>&nbsp;</p>
<p>Una vez terminado el código para recibir las instrucciones de Paypal
procedemos a crear nuestros botones de compra</p>

Código: php [Seleccionar]
<?php
require('class_EVCPaypal.php');
 
 $paypal_obj = new EVCpaypal();
 $paypal_obj -> config_general('vendedor_paypal@mail.com' // Email vendedor
                              ,'USD' // Moneda
                              ,'ES'  // Lenguaje
                              ,'http://mi_web/paypal_ipn.php' // URL IPN
                              ,'http://mi_web/pago_autorizado.php' // URL Pago autorizado
                              ,'http://mi_web/pago_denegado.php' // URL Pago denegado
                              ,false // MODO PRUEBA ( Sandbox )
                              );
 
 $PRODUCTO = array('item_name' => 'Laptop', //Nombre
                   'item_number' => '34575', // ID
                   'amount' => '500', // Precio
                   'quantity' => 1, // Cantidad
                   'no_shipping' => 1, // No pedir Direccion
                   'custom' => '34575_USUARIO' // HASH
                  );
 
 $imgboton = 'pagar_ahora.gif'; //Imagen del boton
 $boton = $paypal_obj -> crear_boton($imgboton,$PRODUCTO); // Generamos boton
 echo($boton); //Mostramos boton de compra
?>


<p>Ahora explicare el código que acabo de mostrarles.</p>
<p><strong>Email vendedor</strong>: Este será el Email donde se recibirán los
pagos de nuestra tienda</p>
<p><strong>Moneda</strong>: Es la divisa que utilizamos para hacer nuestras
ventas, en el ejemplo se utilizaron dolares ( USD ), para pesos mexicanos se
utilizará MXN. Es importante que en nuestra cuenta de Paypal tengamos
configurada la recepción de pagos para aceptarlos en cualquier tipo de divisa y
convertirlos a nuestra moneda nacional, de lo contrario cuando un cliente nos
haga una compra en una moneda diferente esta se quedara como pendiente hasta que
nosotros la aceptemos desde nuestra cuenta Paypal. Para configurar esas opciones
lo haremos desde la opción Perfil de nuestra cuenta paypal y posteriormente en
la opcion Preferencias de recepción de pago.</p>
<p><strong>Lenguaje</strong>: Este solo es el lenguaje en el que queremos
trabajar, en nuestro caso ES ( Español )</p>
<p><strong>URL IPN</strong>: Esta es la dirección de nuestro archivo de IPN que
hicimos previamente, será la URL donde paypal nos enviara las notificaciones
instantáneas. Es importante que esta URL también se especifique en nuestra
configuración de Paypal. Para eso nos vamos nuevamente a la opción Perfil y
colocamos la URL en la opción Preferencias de Notificación de pago instantánea.</p>
<p><strong>URL Pago autorizado</strong>: Esta será la dirección a la que el
cliente será redireccionado en caso de que el pago halla sido autorizado.</p>
<p><strong>URL Pago denegado</strong>: Direccion a donde el cliente será
redireccionado en caso de un pago no autorizado.</p>
<p><strong>MODO PRUEBA</strong> ( Sandbox ): Este último esta por defecto en
false, esta opción si se pone en true sirve para trabajar en modo prueba
utilizando dinero ficticio de Sandbox.</p>
<p><strong>FINAL</strong><br>
Si ya terminaste todos los pasos anteriores ahora tu sitio Web debe ser capaz de
generar botones de compra de tus productos y así mismo almacenar los registros
de compras realizadas por tus clientes.</p>
<p>A partir de ahora lo único que tenemos que hacer para que el cliente acceda a
su producto o servicio es verificar que en el log de paypal el campo estado_pago
se encuentre Completed</p>
<p>Como pueden ver es bastante sencillo de implementar, espero que les sea de
ayuda, próximamente implementare a la class funcionalidad con certificados de
seguridad SSL</p>
<p>Saludos.</p>
Si has encontrado útil este articulo recuerda que puedes ayudarnos con tu donación voluntaria la cual ayudará al staff y a la mantención del foro.

Alberto

  • Visitante
Re:Como integrar un sistema de pagos Paypal IPN en tu web
« Respuesta #1 : agosto 11, 2015, 12:57:58 pm »
Buenas tardes,
Cómo consigo los archivos: pago_autorizado.php y pago_denegado.php
Saludos,
Alberto

<?php
require('class_EVCPaypal.php');
 
 $paypal_obj = new EVCpaypal();
 $paypal_obj -> config_general('vendedor_paypal@mail.com' // Email vendedor
                              ,'USD' // Moneda
                              ,'ES'  // Lenguaje
                              ,'http://mi_web/paypal_ipn.php' // URL IPN
                              ,'http://mi_web/pago_autorizado.php' // URL Pago autorizado
                              ,'http://mi_web/pago_denegado.php' // URL Pago denegado
                              ,false // MODO PRUEBA ( Sandbox )
                              );
 
 $PRODUCTO = array('item_name' => 'Laptop', //Nombre
                   'item_number' => '34575', // ID
                   'amount' => '500', // Precio
                   'quantity' => 1, // Cantidad
                   'no_shipping' => 1, // No pedir Direccion
                   'custom' => '34575_USUARIO' // HASH
                  );
 
 $imgboton = 'pagar_ahora.gif'; //Imagen del boton
 $boton = $paypal_obj -> crear_boton($imgboton,$PRODUCTO); // Generamos boton
 echo($boton); //Mostramos boton de compra
?>


. . . . . . . .