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

3 de diciembre de 2008

Este es el segundo artículo de la creacion de una pasarela de pago con BBVA
Trataremos los archivos incluidos Desofuscar.php y IdTransaccion.php

IdTransaccion.php sirve para crear un número de reserva (id de la transacción), es un número identificativo único para cada compra/reserva que realiza el usuario en nuestro comercio, a continuación os pongo el código y luego lo comento, veréis que es muy sencillo:

<?php
/*****************************************************
/** @Author: Ricard Catalan
/** @return: IDTransaccion
/** Clase usada para devolver un identificador de la transacción único
/****************************************************/

class IdTransaccion{
private $y;
private $ddd;
private $hh;
private $mm;
private $ss;
private $an;
private $id;
public function __construct(){
$this->setIdTrans();
}
private function setIdTrans(){
$this->y=substr(date('y'),strlen(date('y'))-1,strlen(date('y')));
$this->ddd=date('z'); //Devuelve el día del año desde 0 a 365
if($this->ddd < 10) $this->ddd= '00'.$this->ddd; //añadimos 2 ceros en el caso de ser menos de 10
else if($this->ddd > 9 && $this->ddd < 100) $this->ddd= '0'.$this->ddd; //añadimos un 0 en el caso de ser mayor de 9 y menor de 100
$this->hh=date('H'); //Devuelve la hora en formato 00 a 24
$this->mm=date('i'); //Devuelve los minutos desde 00 a 59
$this->ss=date('s'); //Devueve los segundos en 00 a 59
$this->an=rand('11','99'); //Devuelve un valor aleatorio ente 10-99
}
public function getIdTrans(){
return $this->id=$this->y.$this->ddd.$this->hh.$this->mm.$this->ss.$this->an;
}
}
?>

He creado una pequeña clase con PHP5, en la que creo un número único de 12 dígitos con date() desde la hora del servidor:

  • - Primero recojo el último digito del año
  • - Los días del año de 001 a 365, es muy importante que tenga 3 dígitos porque sino date('z') nos puede devolver por ejemplo 32 y el número generado será de 11 dígitos y el TPV virtual del BBV le añadirá un 0 delante, puesto que siempre debe ser un número de 12 dígitos, y al ser diferente nunca podremos recorger los datos del cliente guardados en XML.
  • - El resto de valores son la hora, los minutos y segundos con 2 dígitos cada uno
  • - Por último el número aleatorio de 2 dígitos. Hay que tener en cuenta que dependiendo de la versión de PHP que tengamos en el servidor podrémos usar milisegundos que siempre será mejor que 2 dígitos aleatorios.

Desofuscar.php es un script que nos facilitará BBVA en la documentación que encontraremos en el TPV virtual del BBVA.
Sin embargo, es bastante "tosco" como esta realizado y yo lo he adaptado a PHP5 orientado a objetos por lo que el código es más elegante y más fácil de hacer la "llamada".
Os pongo la clase como quedaría, pero sin poner todo el código, puesto que ya lo facilita BBVA:

<?php
/*****************************************************
/** @Author: Ricard Catalan
/** @return: pal_sec
/** Clase usada para devolver la palabra desofuscada
/****************************************************/
class Desofuscar{
private $pal_sec_ofuscada;
private $clave_xor;
private $cad1_0="0";
private $cad2_0="00";
private $cad3_0="000";
private $cad4_0="0000";
private $cad5_0="00000";
private $cad6_0="000000";
private $cad7_0="0000000";
private $cad8_0="00000000";
private $pal_sec="";
public function __construct($ofuscada,$clave,$idcomercio){
$this->pal_sec_ofuscada=$ofuscada;
$this->clave_xor=$clave.substr($idcomercio,0,9).'***';
$this->Desofuscar(); //Desofuscamos
}
private function Desofuscar(){
$trozos=explode (";", $this->pal_sec_ofuscada);
$tope=count($trozos);
for ($i=0; $i<$tope ; $i++){
$res = "";
$pal_sec_ofus_bytes[$i] = decbin(hexdec($trozos[$i]));
if (strlen($pal_sec_ofus_bytes[$i]) == 7){ $pal_sec_ofus_bytes[$i] = $this->cad1_0.$pal_sec_ofus_bytes[$i]; }
if (strlen($pal_sec_ofus_bytes[$i]) == 6){ $pal_sec_ofus_bytes[$i] = $this->cad2_0.$pal_sec_ofus_bytes[$i]; }
... /* aquí va el código restante del manual */
}
}
public function getDesofuscar(){
return $this->pal_sec;
}
}
?>

Simplemtente con crear una instancia de la clase Desofuscar y hacer una llamada al método getIdTrans() obtendremos la palabra desofuscada.
Podéis ver como se realiza la instancia de la dos clases (Desofuscar y IdTransaccion) en la primera parte del artículo aquí.

Hasta aqui el segundo artículo, en el tercer artículo veremos el archivo pasarela.php para que sirve y las múltiples opciones que tendremos en él.

Etiquetas: , , , ,


3 comentarios:

Anonymous Anónimo ha dicho...
A las 23 de marzo de 2010, 18:26

Hola,

No entiendo porque usas esa idtransaccion, con los días del año..
No es más fácil usar añomesdia?

$idtransaccion = date('ymdHis');

saludos

 
Blogger Unknown ha dicho...
A las 23 de marzo de 2010, 23:38

entiendo que lo hace asi para evitar duplicados... si usase date('ymdHis') podría darse el caso de que tuvieses dos peticiones en el mismo segundo y por tanto mismo id...

 
Blogger Katan ha dicho...
A las 26 de abril de 2010, 18:40

Gracias Carlos,
Es exactamente eso, en el supuesto caso de haber 2 o más transaciones en el mismo segundo, creé en su dia 2 números aleatorios entre 00-99, con lo que la probabilidad de repetirse se reduce, y como digo en el comentario del código, dependiendo la versión de PHP lo recomendable siempre será usar milisegundos.
Nunca se sabe que puede hacer el random :-)

Espero, poder arreglar los problemas de links, y dedicarle un tiempo al blog, que esta muy dejado.

Gracias a todos por los comentarios.
Un saludo.

 

Añadir un comentario Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

◄ Inicio