Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/11/2011, 08:15
tyrula
 
Fecha de Ingreso: mayo-2005
Ubicación: Castellón
Mensajes: 321
Antigüedad: 19 años
Puntos: 0
pasarela que va bien en local pero no en internet

Hola a todos, tengo un problema curioso. Tengo instalada una tienda en local a la cual le he configurado una pasarela de pago y funciona perfectamente, me genera bien la firma y me engancha con el tpv. Pero ahora que he subido la tienda a internet cuando le doy a pagar me dice que la firma no es correcta... Los datos que tengo tanto en local como en internet son los mismos, apuntan al mismo sitio... todo, pero por lo que sea no me genera bien la firma desde internet. el algoritmo sh1 para generar la firma es una función que está también escrita en la configuración de la pasarela (tanto en local como en internet). Si a alguien le ha pasado o sabe como ayudarme se lo agradecería.

Este es el código que utilizo

Cita:
<?PHP
// Valores constantes a modificar segun el comercio

$url_tpvv='https://tpv01.cajarural.com/nuevo_tpv/tpv/jsp/tpvjp_validaComercio.jsp'; // URL para entorno real. Para URL de entorno
$fuc='mi clave de comercio'; // Clave de comercio proporcionada
$nombre='mi nombre de comercio'; // Nombre del comercio que sale en la transaccion.
$cip='mi codigo de comercio'; // Codigo de comercio proporcionado
$idterminal='001'; // Terminal usado.
$moneda='978'; // 978=Euros.
$tipoOperacion='0'; // Tipo de operacion. 0=Autorizacion.


?>

<?PHP
// Calculo del hash para firmar los datos.

$fecha = date("ymdHis");
$numpedido = '000'.$db->f("order_id");
$importe=$db->f("order_total")*100;
$message = $fecha.$cip.$importe.$moneda.$numpedido;// formula sha-1 para caja rural
$firma = sha_1($message);
$url='miurl';
$urlnotification=JURI::base().'index.php?page=acco unt.order_details&order_id='.$db->f("order_id").'&option=com_virtuemart&Itemid=16 ';
?>

<form action="<?php echo $url_tpvv?>" method="post">


<input type="hidden" name="importe" value="<?php echo $importe?>" />
<input type="hidden" name="numpedido" value="<?php echo $numpedido?>" />
<input type="hidden" name="moneda" value="<?php echo $moneda?>" />
<input type="hidden" name="fuc" value="<?php echo $fuc?>" />
<input type="hidden" name="idioma" value="0" />
<input type="hidden" name="idterminal" value="<?php echo $idterminal?>" />
<input type="hidden" name="fecha" value="<?php echo $fecha?> " />
<input type="hidden" name="firma" value="<?php echo $firma ?>" />
<input type="image" name="imageField" src="/images/stories/logo_caixa.jpg" value="PAGAR AHORA">
</form>

<?php



function sha1_str2blks_SHA1($str)
{
$strlen_str = strlen($str);

$nblk = (($strlen_str + 8) >> 6) + 1;

for ($i=0; $i < $nblk * 16; $i++) $blks[$i] = 0;

for ($i=0; $i < $strlen_str; $i++)
{
$blks[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8);
}

$blks[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8);
$blks[$nblk * 16 - 1] = $strlen_str * 8;

return $blks;
}

function sha1_safe_add($x, $y)
{
$lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);

return ($msw << 16) | ($lsw & 0xFFFF);
}

function sha1_rol($num, $cnt)
{
return ($num << $cnt) | sha1_zeroFill($num, 32 - $cnt);
}

function sha1_zeroFill($a, $b)
{
$bin = decbin($a);

$strlen_bin = strlen($bin);

$bin = $strlen_bin < $b ? 0 : substr($bin, 0, $strlen_bin - $b);

for ($i=0; $i < $b; $i++) $bin = '0'.$bin;

return bindec($bin);
}

function sha1_ft($t, $b, $c, $d)
{
if ($t < 20) return ($b & $c) | ((~$b) & $d);
if ($t < 40) return $b ^ $c ^ $d;
if ($t < 60) return ($b & $c) | ($b & $d) | ($c & $d);

return $b ^ $c ^ $d;
}

function sha1_kt($t)
{
if ($t < 20) return 1518500249;
if ($t < 40) return 1859775393;
if ($t < 60) return -1894007588;

return -899497514;
}

function sha_1($str, $raw_output=FALSE)
{
if ( $raw_output === TRUE ) return pack('H*', sha_1($str, FALSE));

$x = sha1_str2blks_SHA1($str);
$a = 1732584193;
$b = -271733879;
$c = -1732584194;
$d = 271733878;
$e = -1009589776;

$x_count = count($x);

for ($i = 0; $i < $x_count; $i += 16)
{
$olda = $a;
$oldb = $b;
$oldc = $c;
$oldd = $d;
$olde = $e;

for ($j = 0; $j < 80; $j++)
{
$w[$j] = ($j < 16) ? $x[$i + $j] : sha1_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1);

$t = sha1_safe_add(sha1_safe_add(sha1_rol($a, 5), sha1_ft($j, $b, $c, $d)), sha1_safe_add(sha1_safe_add($e, $w[$j]), sha1_kt($j)));
$e = $d;
$d = $c;
$c = sha1_rol($b, 30);
$b = $a;
$a = $t;
}

$a = sha1_safe_add($a, $olda);
$b = sha1_safe_add($b, $oldb);
$c = sha1_safe_add($c, $oldc);
$d = sha1_safe_add($d, $oldd);
$e = sha1_safe_add($e, $olde);
}

return sprintf('%08x%08x%08x%08x%08x', $a, $b, $c, $d, $e);
}
?>
Un saludo