Ricard Catalan
Hola ♥, soy Ricard Catalan Díaz. Soy diseñador y programador web , quieres conocerme?

3 de diciembre de 2008

Es la primera parte de una serie de artículos relacionados con la creación de una pasarela de pago.
En concreto pondré un ejemplo con el TPV virtual del BBVA.

Todo el código siguiente esta comentado y es a modo de ejemplo, para poder implementar la pasarela de pago con nuestro comercio.
En este ejemplo no trataré el servicio web SOAP y la implementación se llevará a cabo pasando los datos al TPV virtual y redirigiendo al usuario al mismo.

Esta parte del código lo pondré dentro de un archivo (por ejemplo: confirmacion.php) y será el paso final del comercio, donde el cliente confirmará la compra:
//************************************************************************//
// INTEGRACIÓN PASARELA BBVA con PHP5 (parcialmente orientado a objetos)
// @Author: Ricard Catalan
// Licencia: GNU
// NOTA: Esto es un ejemplo y sigue los pasos de la documentación descargada desde
// el TPV virtual del BBVA para su implementación en PHP ,y en ningún caso substituye
// a la documentación.
//************************************************************************//

require_once('includes/admin/Connect_db.php'); //Incluimos la clase conexión
require_once('includes/admin/Select_db.php'); //Incluimos una clase con métodos SELECT a MySQL
require_once('includes/admin/info_db.php'); //Incluimos datos de la conexión
require_once('pasarela/IdTransaccion.php'); //Clase que genera la ID de la transacción
require_once('pasarela/Desofuscar.php'); //Clase para Desofuscar la palabra secreta

$conexion = new Connect_db($hostname,$dbname,$username,$password); //Creamos instancia del objeto Connect DB
$conexion->getConnect(); //Nos conectamos a la base de datos

// IDCOMERCIO: es el número del comercio que tendrá el cliente (aparece en el panel de control del TPV del BBVA)
//TERMINAL: el número de terminal (aparece en el panel de control del TPV del BBVA)
//PALABRA: Esta es la palabra clave que se pone en el TPV del BBVA y que posteriormente generará la clave Ofuscada
//OFUSCADA: El el contenido del .TXT descargado una vez puesta la "palabra clave", tiene la estructra siguiente XX;XX;...etc.
$sql="SELECT idcomercio, terminal, palabra, ofuscada FROM rpreferencias;"; //Extraemos los datos necesarios
$res=mysql_query($sql); //recojemos la consulta. NOTA: Hay que tener en cuenta que no hago comprobación de errores
$dades=mysql_fetch_array($res);
$idcomercio=$dades['idcomercio'];
$terminal=$dades['terminal'];
$clave=$dades['palabra'];
$ofuscada=$dades['ofuscada'];

$clave_xor=$clave.substr($idcomercio,0,9).'***'; //Creamos la CLAVE_XOR según el manual
$trans=new IdTransaccion; //Creamos instancia de la clase IdTransaccion
$idTrans=$trans->getIdTrans(); //recojemos la ID de transacción para petición
//Obtenemos Palabra desofuscada
$desofuscar=new Desofuscar($ofuscada,$clave,$idcomercio); //Instancia de la clase Desofuscar
$clave=$desofuscar->getDesofuscar(); //recojemos la clave Desofuscada

//El paso siguiente es convertir el formato del precio XXX.XX por XXXX (quitando la coma) -> para calcular la firma
$explo_preu=explode(".",$preuTotal);// formatear el importe de 87,5 a 875
$preuTemp=$explo_preu[1];
if(strlen($preuTemp)==1) $preuTemp=$preuTemp.'0'; //En el caso de tener: XX.5 pasamo a XX.50
elseif(strlen($preuTemp)==0) $preuTemp='00'; //En el caso de tener: XX pasamo a XX00 (añadiendo dos ceros finales)
$importe_formateado=$explo_preu[0].$preuTemp; //Guardamos el importe formateado para el calculo de la firma
$precio=$explo_preu[0].'.'.$preuTemp; //Guardamos el importe con el formato correcto, que usaremos en el envio del XML
$moneda='978'; //Euro

//Creación de la FIRMA
$datosfirma=$terminal.$idcomercio.$idTrans.$importe_formateado.$moneda.$clave;
$firma=strtoupper(sha1($datosfirma)); //Generación SHA-1 por PHP5


Los archivos que se incluyen al principio del código IdTransaccion.php y Desofuscar.php serán tratado en la segunda parte del artículo, el resto se usan para la conexión a la base de datos y no hace parte del artículo, ya que me extendería demasiado.


  • - Primero nos conectamos a nuestra base de datos y recogemos los datos del idcomercio, la terminal, la palabra clave que nosotros habremos puesto, y la palabra ofuscada generada en el TPV del BBVA por la palabra clave.

  • - La clave_xor esta implementada dentro del archivo Desofuscar.php y lo he puesto aquí a modo de ejemplo

  • - El siguiente paso es formatear el precio (ej. 99,50 €) a 9950 para generar la firma y 99.50 para el envio del XML al TPV virtual del BBVA

  • - Los datos que hemos ido recogido, son necesarios para la generación de la firma que se envía mediante POST dentro del XML, y que el BBVA usa para autentificar que el comercio es correcto.


A continuación sigo con el resto del código:
//Creamos  una variable en formato XML
//URLCOMERCIO: es el archivo PHP por el cual BBVA hará una llamada pasandole los datos de la compra (correcta o incorrecta)
//URLREDIR: Una vez realizada la compra y el cliente salga del TPV, será redirigido a esta dirección (OPCIONAL)
$xml="<tpv>
<oppago>
<idterminal>$terminal</idterminal>
<idcomercio>$idcomercio</idcomercio>
<idtransaccion>$idTrans</idtransaccion>
<moneda>$moneda</moneda>
<importe>$precio</importe>
<urlcomercio>http://www.tucomercio.com/pasarela.php</urlcomercio>
<idioma>$lang<<idioma>
<pais>$pais</pais>
<urlredir>http://www.tucomercio.com/estado_transaccion.php</urlredir>
<firma>$firma</firma>
</oppago>
</tpv>";

<form action="https://w3.grupobbva.com/TLPV/tlpv/TLPV_pub_RecepOpModeloServidor" method="POST">
/* AQUI VA EL CÓDIGO HTML del FORMULARIO que queramos */
<input type="hidden" name="peticion" value="<?php echo $xml; //ponemos en un campo oculto la variable que contiene el XML ?>" />
</form>

/****** Guardamos una copia con los datos del cliente en formato XML en el servidor ******/
//Aqui guardaremos los datos de la compra de un cliente, esto puede variar según los datos que queramos guardar
//El siguiente XML es un ejemplo:
$xml2="<?xml version='1.0' encoding='UTF-8'?>
<tpv>
<transid>
<nombre>$nom</nombre>
<apellido>$cognom</apellido>
<email>$email</email>
<telf1>$telf1</telf1>
<telf2>$telf2</telf2>
<nacion>$nacion</nacion>
<fecha>$fecha</fecha>
<pase>$pase</pase>
<servicio>$serv</servicio>
<adults>$adults</adults>
<nens>$nens</nens>
<idioma>$language</idioma>
<precio>$precio</precio>
</transid>
</tpv>";
//NOTA: la primera línea es para guardar texto codificado en UTF-8, podemos quitarla, si no lo queremos

$file="xml/$idTrans.xml";
$transc = fopen($file,"w+"); //Creamos un fichero y por nombre le ponemos la ID TRANSACCÓN
fputs($transc,$xml2); //Añadimos el contenido
chmod($file,0755); //Modificamos los permisos para posteriormente poder hacer un borrado.
fclose($transc); //Cerramos el fichero


Esta parte del código tambien la pondriamos dentro del ejemplo confirmacion.php

El primer XML, se guarda dentro de una variable, y se envía junto con los datos que requiere el BBVA mediante POST a la URL que indica en el manual.
En el formulario que he puesto como ejemplo, la URL es correcta, pero es posible que la modalidad de pago que tenga vuestro comercio sea diferente, este ejemplo usa la modalidad 3D Secure, pero cambiando la url puede servir para cualquier forma de pago, pues los datos que enviaremos (xml) siempre son iguales.

En el último XML guardaremos los datos del cliente que necesitemos en el servidor como un archivo XML.
El XML se guardará de la siguiente manera: 826511175711.xml, dentro de la carpeta /XML o la que se quiera.
Este XML se usará después que el cliente acceda a la pasarela de pago del BBVA y realize la compra. Es entonces cuando el BBVA hace una llamada a http://www.tucomercio.com/pasarela.php (o la urlcomercio que nosotros hayamos puesto) y nos pasará una variable mediante GET, en formato XML con los datos de la compra.
En estos datos devueltos por el BBVA se incluye la ID Transacción que concuerda con el nombre del XML guardado en el servidor, así se podrá recoger todos los datos del cliente (nombre, apellidos, dirección, etc.) para guardarlo en nuestra base de datos, enviar e-mails etc.

En la segunda parte, trataremos los archivos IdTransaccion.php y Desofuscar.php

Etiquetas: , , , ,


9 comentarios:

Blogger Unknown ha dicho...
A las 14 de octubre de 2009, 15:26

En el manual de bbva aparece
firma = getSHA1(idterminal+idcomercio+idtransaccion+ importe+moneda+
localizador+PALABRA SECRETA)
me podrias esplicar un poquito esta formula
mucha gracias

 
Blogger Unknown ha dicho...
A las 14 de octubre de 2009, 15:26

En el manual de bbva aparece
firma = getSHA1(idterminal+idcomercio+idtransaccion+ importe+moneda+
localizador+PALABRA SECRETA)
me podrias esplicar un poquito esta formula
mucha gracias

 
Blogger Unknown ha dicho...
A las 17 de febrero de 2010, 16:55

Hola,
yo precisamente busco poder hacer una integración con algún TPV que me permita integrar pidiendo los datos en mi web y yo realizar el proceso de pago contra el TPV por webservices/soap o similar.

Al leer el post me pregunto si conoces si el TPV de BBVA permite interaccionar vía webservices/soap o similar.
Te agradecería si me pudieras dar esta indicación.
Rafa.

 
Anonymous Anónimo ha dicho...
A las 16 de septiembre de 2010, 13:52

Buenas estaba integrando el TPV del BBVKK en una página web y de entrada habían errores tipográficos en la función SHA del manual, para colmo la definición de la clase SHA del manual es un cacao, en fin gracias por el blog me ha sido muy útil.

Menos mal que la función de desofuscación de la clave, estaba bien en el manual, que sino me vuelvo loco, jajaja.

Muchas Gracias de nuevo. Saludos Xavi, Barna.

 
Blogger Sergio ha dicho...
A las 15 de junio de 2011, 12:05

Primero muchas gracias por el post, es impresionante!!

Solo un detalle. He detectado un pequeño error en el campo firma del xml pone:
$firma<
y debería poner:
$firma

 
Blogger Sergio ha dicho...
A las 15 de junio de 2011, 12:07

Primero muchas gracias por el post, me ha sido de mucha ayuda.

Solo comentar un pequeño error el el xml. Donde pone:
$firma<
debería poner:
$firma

 
Blogger Katan ha dicho...
A las 15 de junio de 2011, 16:01

Gracias Sergio,
Ya esta corregido.

Un saludo.

 
Anonymous Miguel ha dicho...
A las 4 de mayo de 2012, 9:32

Hola,
tu post me ha sido de gran ayuda, espero que me puedas ayudar un poco en mi problema. Estoy integrando las devoluciones de los pagos desde la propia web de mi cliente, programo con PHP y en el manual comenta que hay que tener soap y ssl instalado. El caso es que, como sabes, los ejemplos proporcionados son en Java y yo al montar el cliente soap sólo puedo crear el objeto cliente mediante:

$servicio = 'PeticionTPVSoapS';
$url = 'https://w3.grupobbva.com/TLPV/tlpv/TLPV_pub_rpcrouter';

$cliente_soap = new SoapClient(null, array('location' => $url, 'uri' => $servicio, 'trace' => 1));

El problema es que después de tener el objeto creado no puedo acceder a las funciones, no sé como seguir. Espero que puedas ayudarme.
Muchísimas gracias.

 
Anonymous Informatico ha dicho...
A las 26 de junio de 2013, 11:03

Tu ejemplo es magnífico pero no consigo hacer que funcione, me podrías ayudar? lo que necesito es que de introduciendo dos datos un numero de referencia y el precio me enlace directamente con el TPV.

Mi correo es tec_informatico@semesur.com

 

Añadir un comentario Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

◄ Inicio