Este es el código que utilizo
Cita:
Un saludo <?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);
}
?>
// 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);
}
?>