https://canales.sermepa.es/canales/lacaixa/ayuda/migracionSHA256.html
Esto implica dos cosas:
- Cambiar o renovar el plugin (en el caso de que el TPV virtual se utilice en un CMS tipo Prestashop, Woocommerce, Magento, etc…) o la programación (en el caso que sea una programación a medida) para dar soporte a la nueva codificación SHA-256.
- Configurar una nueva firma, que se puede obtener en el admin de la TPV, como indica el enlace anterior.
El límite para realizar esto es el 23/11/2015, quien para esa fecha no haya hecho el cambio, dejarán de funcionarle los pagos mediante la TPV virtual.
Todos los clientes que tengan este problema y no sepan como solucionarlo, se lo puedo revisar sin coste.
Si se tiene en un CMS, la solución es facil, solo hay que actualizar el plugin de Redsys a la última versión. Si es una programación a medida, hay que realizar estos pasos:
Lo primero obtener el script de funciones de Redsys, "apiRedsys.php", que se puede obtener aquí:
http://www.redsys.es/wps/portal/redsys/publica/areadeserviciosweb/descargaDeDocumentacionYEjecutables
donde pone "API PHP". Una vez lo tenemos, lo subimos por FTP a la misma ubicación donde tengamos el script con el formulario que llama al TPV de Redsys. Ese formulario suele tener este aspecto:
<?php
$url_tpvv='https://sis.redsys.es/sis/realizarPago';
$clave='XXXXX';
$name='XXXXX';
$code='XXXXX';
$terminal='1';
$order=$orderid;
$amount=$totalpedido*100;
$currency='978';
$consumerlng='001';
$transactionType='0';
$urlMerchant='XXXXX';
$message = $amount.$order.$code.$currency.$transactionType.$urlMerchant.$clave;
$signature = strtoupper(sha1($message));
$urlweb_ok='XXXXX';
$urlweb_ko='XXXXX';
?>
<form action="<?php echo $url_tpvv; ?>" method="post" target="_self">
<input type="hidden" name="Ds_Merchant_Amount" value="<?php echo $amount; ?>" />
<input type="hidden" name="Ds_Merchant_Currency" value="<?php echo $currency; ?>" />
<input type="hidden" name="Ds_Merchant_Order" value="<?php echo $order; ?>" />
<input type="hidden" name="Ds_Merchant_MerchantCode" value="<?php echo $code; ?>" />
<input type="hidden" name="Ds_Merchant_MerchantURL" value="<?php echo $urlMerchant; ?>" />
<input type="hidden" name="Ds_Merchant_MerchantName" value="<?php echo $name; ?>" />
<input type="hidden" name="Ds_Merchant_ConsumerLanguage" value="<?php echo $consumerlng; ?>" />
<input type="hidden" name="Ds_Merchant_MerchantSignature" value="<?php echo $signature; ?>" />
<input type="hidden" name="Ds_Merchant_Terminal" value="<?php echo $terminal; ?>" />
<input type="hidden" name="Ds_Merchant_TransactionType" value="<?php echo $transactionType; ?>" />
<input type="hidden" name="Ds_Merchant_UrlOK" value="<?php echo $urlweb_ok; ?>" />
<input type="hidden" name="Ds_Merchant_UrlKO" value="<?php echo $urlweb_ko; ?>" />
<input type="submit" value="Pulse para acceder al pago con tarjeta" />
</form>
y ahora tendrá este:
<?php
include "apiRedsys.php";
$url_tpvv='https://sis.redsys.es/sis/realizarPago';
$miObj = new RedsysAPI;
$version="HMAC_SHA256_V1";
$clave='XXXXX'; //poner la clave SHA-256
$name='XXXXX';
$code='XXXXX';
$terminal='1';
$order=$orderid;
$amount=$totalpedido*100;
$currency='978';
$consumerlng='001';
$transactionType='0';
$urlMerchant='XXXXX';
$urlweb_ok='XXXXX';
$urlweb_ko='XXXXX';
$miObj->setParameter("DS_MERCHANT_AMOUNT",$amount);
$miObj->setParameter("DS_MERCHANT_CURRENCY",$currency);
$miObj->setParameter("DS_MERCHANT_ORDER",$order);
$miObj->setParameter("DS_MERCHANT_MERCHANTCODE",$code);
$miObj->setParameter("DS_MERCHANT_TERMINAL",$terminal);
$miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE",$transactionType);
$miObj->setParameter("DS_MERCHANT_MERCHANTURL",$urlMerchant);
$miObj->setParameter("DS_MERCHANT_URLOK",$urlweb_ok);
$miObj->setParameter("DS_MERCHANT_URLKO",$urlweb_ko);
$miObj->setParameter("DS_MERCHANT_MERCHANTNAME",$name);
$miObj->setParameter("DS_MERCHANT_CONSUMERLANGUAGE",$consumerlng);
$params = $miObj->createMerchantParameters();
$signature = $miObj->createMerchantSignature($clave);
?>
<form action="<?php echo $url_tpvv; ?>" method="post" target="_self">
<input type='hidden' name='Ds_SignatureVersion' value='<?php echo $version; ?>'>
<input type='hidden' name='Ds_MerchantParameters' value='<?php echo $params; ?>'>
<input type='hidden' name='Ds_Signature' value='<?php echo $signature; ?>'>
<input type="submit" value="Pulse para acceder al pago con tarjeta" />
</form>
Como se ve, el cambio no es muy grande, solo hay que poner la nueva clave SHA-256 y la mayoría de parámetros del antiguo formulario ahora van como parametros de un objeto. Otros parámetros que no salen en este ejemplo como "DS_MERCHANT_PRODUCTDESCRIPTION", "DS_MERCHANT_TITULAR", etc... también se pueden poner en el objeto.Luego en "la página de vuelta", la página de vuestra web a donde va el TPV una vez realizado el pago, también habría que hacer un pequeño cambio, como se ve en el fichero "ejemploRecepcionaPet.php" del "API PHP" que mencionamos antes, pero solo si quereis comprobar que la firma que llega por POST es la correcta, como medida de seguridad, o bien necesitais recuperar la lista de parámetros que antes venían por POST, y que ahora llegan también en una cadena codificada.
¿por qué es insegura la codificación SHA-1?
La codificación SHA-1 se ha utilizado para codificar cosas tan importantes como el SSL, pero se está retirando paulatinamente por insegura. Se trata de una codificación de “un solo sentido”, o sea, que si una cadena de texto se codifica con SHA-1, crea otra cadena de texto única que no puede volver a descodificarse para ver la cadena original.Se pensaba que era imposible que dos cadenas de texto diferentes pudieran producir la misma cadena una vez codificadas con SHA-1, pero se demostró que era posible, lo cual daba a los hackers una vía de ataque por fuerza bruta. Esto ya se sabía hace 10 años, pero no se hizo nada porque los ataques por fuerza bruta llevarían demasiado tiempo.
El problema es que como los ordenadores son cada vez más rápidos, y los algoritmos de ataque más eficientes, se podría tardar cada vez menos en realizar esos ataques, por lo que se ha empezado a retirar este algoritmo de codificación de todas partes, para sustituirlo por otro mas seguro como el SHA-256.
Thanks
Gustavo
Enrique Gonzalez
Gonzalo
Raul
Marta
Raul
Enrique Gonzalez
will
Jonathan
Ulises Trejo Trejo
Miguel
Raul
beto
beer73
Gonzalo
Marta
FIRMA OK"; } else { echo "
FIRMA KO"; } Espero os ayude.
Enrique Gonzalez
Jose
Sara
Alfredo
Mariano
Leandro
Néstor
Néstor
Gonzalo
Néstor
Javier
Max
zaida
Néstor
Alberto
max
beux
Isaac
Pixel
Pixel
Carlos
Ness
rafa
Jon
Marcos
José
Pedro
Brakus
Zafghxc
kolo
fikri
Ugeltroglodita
Eduard
Javier
Alex
Virginia
Gema
Javier
Guadalupe Muñoz García
Kikilocuras