Pasarela de pago BBVA España

A continuación trataré de detallar la implementación de una pasarela de pago con una merchand account del BBVA de España.

En primer lugar, realiazaremos la firma con la cual el BBVA chequeará que sea nuestro sitio quien se comunica con el.

Para realizar el pago, se tiene que generar una palabra secreta y clave, esto se genera desde el panel administrador de la cuenta en el BBVA.

Una vez que las tenemos, se las asignamos a una variable.

Ej.:

$_pal_sec_ofuscada = “69;45;5A;5F;46;45;43;5A;76;00;7B;8B;06;05;77;69;0B;1E;1F;69″;
$_clave_xor = “calve”;

En el manual del BBVA nos ofrecen una función, que copio a continuación, para procesar la palabre clave:

function desobfuscate($pal_sec_ofuscada,$clave_xor) {
   $trozos = explode (";", $pal_sec_ofuscada);
   $tope = count($trozos);
   $res="";
   for ($i=0; $i<$tope; $i++) {
      $x1=ord($clave_xor[$i]);
      $x2=hexdec($trozos[$i]);
      $r=$x1 ^ $x2;
      $res.=chr($r);
   }
   return($res);
}

Lugeo, lo que hacemos, es utilizar dicha función de la siguiente forma:

$pal_sec = desobfuscate($_pal_sec_ofuscada,$_clave_xor);

Luego, definimos otras variables que viajarán por el formulario y nos ayudarán a calcular la firma.

$idterminal = “999999″;
$idcomercio = “idcomercio”;
$idtransaccion = <numero_transaccion>;
//Suelo usar el numero de pedido
$importe_formateado = $importe_for;
//importe formateado, sin puntos ni comas, donde los ultimos 2 numeros son los decimales
$moneda = “978″;
//Seleccion de moneda, en esta caso, Euros

Ahora vamos a realizar el calculo de la firma, en primer lugar, lo que hacemos es concatenar los datos preparados anteriormente, en el orden que se ven por las variables.

$datosfirma = $idterminal.$idcomercio.$idtransaccion.$importe_formateado.$moneda.$pal_sec;

Calculamos la firma usando el algoritmo sha1 de php.

$firma = sha1($datosfirma);

Pasamos a mayśculas todo el resultado.

$firma = strtoupper($firma);

Y con esto ya tenemos la firma calculada, luego, armamos un xml de la siguiente forma:

$xml="<tpv>
   <oppago>
   <idterminal>$idterminal</idterminal>
   <idcomercio>$idcomercio</idcomercio>
   <idtransaccion>$idtransaccion</idtransaccion>
   <moneda>$moneda</moneda>
   <importe>$importe_sin</importe>
   <urlcomercio>http://www.susitio.net/notificacion.php</urlcomercio>
   <urlredir>http://www.susitio.net/notificacion_ok.php</urlredir>
   <firma>$firma&</firma>
   </oppago>
   </tpv>";

Y a continuación, realizamos el armado del formulario de la siguiente forma:

<form action="https://w3.grupobbva.com/TLPV/tlpv/TLPV_pub_RecepOpModeloServidor"
method="post" name="envio"/>
   <input type="hidden" name="peticion" value="<?= $xml; ?>" />
   <input type="hidden" name="idterminal" value="<?= $idterminal; ?>" />
   <input type="hidden" name="idcomercio" value="<?= $idcomercio; ?>" />
   <input type="hidden" name="idtransaccion" value="<?= $idtransaccion; ?>" />
   <input type="hidden" name="mediopago" value="4" />
   <input type="hidden" name="soporte" value="1" />
   <input type="hidden" name="canal" value="1" />
   <input type="hidden" name="moneda" value="<?= $moneda; ?>" />
   <input type="hidden" name="urlcomercio" value="http://www.susitio.net/notificacion.php" />
   <input type="hidden" name="urlredir" value="http://www.susitio.net/notificacion_ok.php" />
   <input type="hidden" name="firma" value="<?= $firma; ?>" />
   <input type="submit" value="Procesar" />
</form>

Con esto, ya enviamos la información al banco, el urlredir es la url adonde nos redireccionara el banco una vez terminado el proceso si este fue exitoso. Y la urlcomercio, es la url donde recibimos la información del del banco, para ver si fue exitoso o no el proceso, que a continuación detallamos:


if (isset($_GET['peticion'])) {

Recibimos por Post el xml que nos envía el banco, lo escribimos en un archivo,
y recuperamos sacando los datos necesarios para chequear la comunicacíon
y el resultado de la operación.

   $peticion=$_GET['peticion'];

   $file='file/pasarela.xml';

   $pasarela = fopen($file,"w+");

   fputs($pasarela,$peticion);

   chmod($file,0755);

   fclose($pasarela);

   $resXml = simplexml_load_file($file);

   $firma = $resXml->firma;

   $deserror = $resXml->deserror;

   foreach ($resXml as $res){

       $idtrans = $res->idtransaccion;

       $coderror1 = $res->coderror;

   }

Aclaración: Chequear de forma manual, como viene el xml,
ya que hay veces que hacen algun cambio, he visto
versiones anteriores que vienen diferentes.

Acá tenemos que clacular nuevamente la firma, igual que en
el paso anterior, para chequear la comunicación:

   if ($coderror1 == "000" &&  $firma = $calculo_nuevo_firma) {

Realiazamos el proceso que querramos por el pago con exito,
y luego nos redireccionarán al urlredir

   } else {

   echo "Descripcion del error: $deserror "; // Devolvemos la descripción del
            //código de error que tuvimos, la operación no fue exitosa.

   }

} else {

   echo "Ocurrio un error, por favor, intente nuevamente";
   //Por si no recibimos bien el post, informamos que ocurrio un error.

}

Y listo, con esto tenemos implementada nuestra pasarela de pago con el
banco BBVA. En el panel de administración del banco, tenemos la
oportunidad de generar varias firmas, para ir chequeando paso a paso
si la firma que mandamos en el primer formulario es correcta.

Espero que los ayudes, y cualquier cosa se pueden comunicar conmigo.
En estos días, cuando tenga un poco de tiempo, publicaré la como
implementar la pasarela de pago con La Caixa de España.

Post a Comment

Your email is never shared. Required fields are marked *

*
*