La TPV virtual Redsys se pasa a SHA-256

logo-tpv_redsysTodos los usuarios de tiendas online y cualquier otro tipo de página web que tuviera pagos mediante TPV utilizando la TPV virtual de Redsys / Sermepa, que son la gran mayoría, han recibido un mensaje comunicándoles que deben renovar todos sus plugins o programaciones de ese TPV virtual para cambiar la codificación SHA-1 por SHA-256 con el pretexto de aumentar la seguridad. La página donde lo explica es esta:

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.
57 comments
  • Thanks
    16-11-2015 11:47
    Muchas gracias, un resumen con ejemplos MUY práctico. Te ahorra leer el "chorrazo" de documentación que manda Redsys, que no hay por donde cogerlo... Muchas gracias!
  • Gustavo
    18-11-2015 11:53
    Hola Enrique, muchas gracias por tu post. Me ha servido de mucho. Ahora mismo me encuentro con un error SIS0019 "Error de formato en Ds_Merchant_Amount" y te explico: En la anterior versión del tpv (la que aún funciona) tengo puesto como valor (en el input formulario) del Ds_Merchant_Amount = En el nuevo, donde me da el error SIS0019 lo tengo así pero me temo que no lo estoy haciendo bien: $ds_amount=""; $miObj->setParameter("DS_MERCHANT_AMOUNT",$ds_amount); ¿Podrías echarme una mano?
  • Enrique Gonzalez
    18-11-2015 11:58
    $ds_amount es el importe * 100, en esa linea lo estás dejando en blanco
  • Gonzalo
    18-11-2015 12:09
    Hola Enrique. Buenas instrucciones. Pero, faltaría comentar la parte de la notificación, con la cual estoy teniendo problemas personalmente ><. Yo uso el ejemplo que Redsys proporciona: $version = $_POST["Ds_SignatureVersion"]; $datos = $_POST["Ds_MerchantParameters"]; $signatureRecibida = $_POST["Ds_Signature"]; //$datos = $miObj->base64_url_encode($datos); $decodec = $miObj->decodeMerchantParameters($datos); $kc = 'xxxxx';//Clave secreta $firma = $miObj->createMerchantSignatureNotif($kc,$datos); //Recepcion de todos los parametros por el METODO NUEVO JSON $fecha = $miObj->getParameter("Ds_Date"); $hora = $miObj->getParameter("Ds_Hour"); Pues bien, ni la firma generada coincide con la recibida, ni obtengo nada con "getParameter". ¿Alguna idea? Muchas gracias!
  • Raul
    18-11-2015 17:50
    A mi me pasa lo mismo que gonzalo. La firma si que consigo que funcione en el archivo de notificacion, pero cuando intento recuperar las variables: $order= $miObj->getParameter("Ds_Order"); $response= $miObj->getParameter("Ds_Response"); FAlla todo, la firma deja de funcionar y esos parametros no me sacan nada. Si comento las lineas de arriba la firma funciona pero claro no saco los parametros que necesito. Alguna idea?, he llamado a Redsys 30 veces y ni caso... Gracias por la ayuda.
  • Marta
    19-11-2015 13:58
    Buenas, alguno sabéis los datos de la versión de prueba de SHA-256, los que en SHA-1 eran: Código comercio = 285779526 Clave secreta = qwertyasdf0123456789 Me estoy volviendo loca y no los encuentro por ningún sitio.
  • Raul
    19-11-2015 16:59
    Marta los tienes en el panel de control de la TPV en el menú comercio, dale a consultar y ahí aparece todo. La contraseña esta en la opción mostrar clave dentro de ese mismo menú. Un saludo A ver si Enrique nos puede ayudar con el tema del getParameter. gracias
  • Enrique Gonzalez
    19-11-2015 17:39
    En la página que se especifica como DS_MERCHANT_MERCHANTURL, o sea la de la notificación, se reciben los parámetros Ds_SignatureVersion, Ds_MerchantParameters y Ds_Signature; lo que no está claro es si es por GET o por POST, pero para asegurarse se pone algo como: $datos = $_POST["Ds_MerchantParameters"]; if (!$datos) $datos = $_GET["Ds_MerchantParameters"]; Se crea el objeto como en el otro código, con el include apiRedsys.php y el $miObj = new RedsysAPI; Luego hay una cosa que no está clara; en la guía de migración de Redsys se dice que se debe llamar a $decodec = $miObj->decodeMerchantParameters($datos); y que una vez hecho ya se pueden obtener los parámetros de la forma: $Ds_Order=$miObj->getParameter('Ds_Order'); (ver página 27 de la Guía de migración) lo que no entiendo es para que vale entonces $decodec.
  • will
    19-11-2015 19:53
    Marta la clave de prueba está en https://sis-t.redsys.es:25443/canales/ y la real en https://sis.redsys.es/canales/ tienes que loguearte con tus credenciales. Yo intentaba usar la firma real en pruebas y claro, fallaba. No es la misma. Yo estoy igual con el get parameter :-(
  • Jonathan
    20-11-2015 02:03
    Yo pude solucionar lo del getParameter con una tienda de un cliente añadiendo en el fichero apiRedsys.php en la línea 163: ... $decodec = $this->base64_url_decode($datos); $this->stringToArray($decodec); ... Así ya me devolvían todos los valores. Sin embargo, con otro cliente, que está con ING, me da error en los datos en su plataforma de test. ¿Alguien ha tenido el mismo caso? Saludos
  • Ulises Trejo Trejo
    20-11-2015 04:20
    Alguien pudo solucionar lo del recibir los parametros, yo lo tengo asi y no he podido recibir nada. include 'apiRedsys.php'; // Respuesta de TPV $miObj = new RedsysAPI; $version = $_POST["Ds_SignatureVersion"]; if (!$version) $version = $_GET["Ds_SignatureVersion"]; $signaturerecibida=$_POST['Ds_Signature']; $params=$_POST['Ds_MerchantParameters']; // Respuesta de TPV $ds_date=$_POST['Ds_Date']; $ds_hour=$_POST['Ds_Hour']; $ds_amount=$_POST['Ds_Amount']; $ds_currency=$_POST['Ds_Currency']; $ds_order=$_POST['Ds_Order']; $ds_merchantcode=$_POST['Ds_MerchantCode']; $ds_terminal=$_POST['Ds_Terminal']; $ds_response=$_POST['Ds_Response']; $ds_transactiontype=$_POST['Ds_TransactionType']; $ds_securepayment=$_POST['Ds_SecurePayment']; $ds_merchantdata=$_POST['Ds_MerchantData']; $ds_authorisationcode=$_POST['Ds_AuthorisationCode']; $decodec = $miObj->decodeMerchantParameters($params); $clavemoduloadmin ='xxxxxx'; $signaturecalculada = $miObj-> createMerchantSignatureNotif($clavemoduloadmin,$params);
  • Miguel
    20-11-2015 08:26
    Hola Ulises Según entiendo en la documentación, deberías hacer lo siguiente: include 'apiRedsys.php'; $miObj = new RedsysAPI; $version = $_POST["Ds_SignatureVersion"]; $signaturerecibida=$_POST['Ds_Signature']; $params=$_POST['Ds_MerchantParameters']; $clavemoduloadmin ='xxxxxx'; $signaturecalculada = $miObj->createMerchantSignatureNotif($clavemoduloadmin,$params); $decodec = $miObj->decodeMerchantParameters($params); $ds_amount=$miObj->getParameter('Ds_Amount'); $ds_amount=$miObj->getParameter('Ds_Currency'); [...] ------------ En otro orden de cosas, ¿alguien sabe como se envia Ds_Response? En la documentación tienen una captura con el siguiente fragmento de código: $codigoRespuesta = $miObj->getParameter("Ds_Response"); Pero eso vuelve en blanco, ahora estoy probando a usar $_GET y $_POST para intentar recoger Ds_Response...
  • Raul
    20-11-2015 12:58
    El error del getParameter parece que es culpa de la API de redsys, conseguí contactar con los técnicos-desarrolladores y están revisándolo. Cuando me contesten os digo algo porque estamos todo el mundo igual de colgados en el mismo sitio. Si alguien sabe la solución que lo ponga porfavor, yo haré lo mismo cuando lo consiga. Gracias PD: Lo que pone Jonhatan ya esta incluido en el archivo de la API y no funciona, por lo menos a mi.
  • beto
    21-11-2015 16:02
    Esta clase me funcionó mejor, y tuve menos problemas, instalación más directa: https://github.com/ssheduardo/sermepa Es una clase muy facil de utilizar, y con perfecta documentación para instalarlo. Saludos
  • beer73
    21-11-2015 20:54
    Hola muy buenas, sobre el error del getParameter (que no es ningún error sino falta de explicarlo bien en la documentacion) los parámetros se rellenan al llamar a la función createMerchantSignatureNotif() que hay que llamar para poder validar la firma. Una vez has llamado a esa función ya tendrás todos los parámetros para poder leerlos. Osea, si ves el punto 5 de la documentación, puedes leer los valores de los parametros dentro del if si la "FIRMA OK" antes no.
  • Gonzalo
    22-11-2015 12:12
    Hola beer73, Yo tengo "getParameter" después de la creación de firma, pero el problema es que no crea la firma bien. La firma recibida es distinta a la generada... Una vez que adapté mi página, realicé un cobro (en el servidor real) y se completó correctamente, pero falló al llamar a la notificación. Entonces, estoy haciendo pruebas volviendo a llamar a mi fichero de recepción con los 3 parámetros que se supone que enviaron en aquel momento (los he conseguido del menú de administración de redsys). Yo he llamado varias veces. La última (se me cortó cuando me estaba explicando), me dijeron que antes de llamar a la función de decodificar parámetros tenía que codificarlos con "base_64_safe", así tal cual. Por lo que he buscado en internet es lo que se supone que hace la función decodeMerchantParameters dentro... Visto que han ampliado el plazo, entiendo que se han dado cuenta de que hay un problema real con la api. Saludos
  • Marta
    23-11-2015 12:58
    Buenas espero ayudaros con el código de respuesta. cuando la compra es corresta nos devuelve la URL que le hayamos pasado como "DS_MERCHANT_URLOK", con tres valores GET Ds_SignatureVersion, Ds_MerchantParameters, Ds_Signature. y con el codigo que os pego aquí: require_once $_SERVER['DOCUMENT_ROOT'].'/includes/comprar/apiRedsys.php'; $miObj = new RedsysAPI; $version = $_GET["Ds_SignatureVersion"]; $datos = $_GET["Ds_MerchantParameters"]; $signatureRecibida = $_GET["Ds_Signature"]; $decodec = $miObj->decodeMerchantParameters($datos); Conseguimos que $decodec, nos devuelva un JSON, con todos los parametros originales que le dimos en la llamada. Yo por ejemplo necesito el 'Ds_Order', y lo consigo así: $obj = json_decode($decodec); $obj->{'Ds_Order'}; Además para comprobar que la firma coincide se añade este código: $kc = '********************************'; //Clave recuperada de CANALES $firma = $miObj->createMerchantSignatureNotif($kc,$datos); if ($firma === $signatureRecibida){ echo "
    FIRMA OK"; } else { echo "
    FIRMA KO"; } Espero os ayude.
  • Enrique Gonzalez
    23-11-2015 13:29
    Gracias a todos por los comentarios. Marta tiene razón, la idea es que en la guía de migración está mal explicado, en la variable $decodec se recibe un JSON con todos los parámetros, por lo que solo hay que hacer un json_decode y ya los tenemos disponibles como propiedades de un objeto: $obj = json_decode($decodec); $order=$obj->Ds_Order;
  • Jose
    23-11-2015 18:59
    Estupendo aporte y gracias especialmente a Marta, porque me estaba volviendo majara pensando que era yo el que estaba haciendo las cosas mal y resulta que es que el getParameter es "una maravilla". Cada vez que tengo que lidiar con algo de Redsys, algo que llevaría minutos se convierte en una tarea de horas o días. Ole por ellos.
  • Sara
    25-11-2015 15:43
    Muchísimas gracias! Estaba volviéndome loca! La atención de Redsys una auténtica vergüenza.
  • Alfredo
    26-11-2015 11:03
    Buenas: A ver si me podeis echar una mano porque estoy bastante atascado. 1) A la hora de recibir los parametros en la página de recepción veo que en el manual de redys usan POST para recoger estos parametros: if (!empty( $_POST ) ) {//URL DE RESP. ONLINE $version = $_POST["Ds_SignatureVersion"]; $datos = $_POST["Ds_MerchantParameters"]; Pero a mi en ese if nunca me entra porque NO ME LLEGA NADA POR POST, por lo que veo en la solución de Marta usa GET para recogerlos y así me funciona , pero por que no llega nada por POST ¿a vosotros os pasa igual? 2) Este es el tema que más me preocupa, con los datos de los ficheros de redsys (fuc y clave de prueba) la TPV me funciona bien, pero cuando uso los propios de mi tpv (mi fuc y mi clave 256 codiga tal cual dice la documentación) No me funciona, entro en la TPV, en la columna de la izquierda me salen los datos de mi tienda y de la operación pero donde tengo que meter la tarjeta me dice en un recuadro gris No se puede realizar la operación Error en datos enviados. Contacte con su comercio. El codigo de error es el 260 (que casualmente no aperece la guía) ¿a que puede ser debido? La URL que usaba con el viejo SHA1 era https://tpv01.cajarural.com/nuevo_tpv/tpv/jsp/tpvjp_validaComercio.jsp Ahora por lo que veo en tu codigo estas usando https://sis.redsys.es/sis/realizarPago ¿alguien em puede ayudar?
  • Mariano
    27-11-2015 18:20
    A mi no me funciona nada de lo que habéis escrito, lo único que me funciona es esto: $pos = strpos($decodec, 'Ds_Order')+11; $id_order= substr ( $decodec , $pos , 11 ); Si a alguien le sirve....
  • Leandro
    28-11-2015 20:01
    Hola, aquí hay una implementación funcional y que va bien con ejemplos: https://github.com/Ligrila/ligrila_redsys
  • Néstor
    29-11-2015 14:59
    Hola, lo que a mi me está ocurriendo es lo siguiente: la respuesta de redsys al ser decodificada no devuelve un json correcto: comienza bien : {"Ds_Date":"... pero no cierra la cadena correctamente (,"Ds_TransactionType": <---- aquí debería cerrar con valor y un fin de paréntesis) con lo que falla json_decode y no obtengo las variables. Si le añado manualmente al string json lo que falta , json_decode si funciona y me obtiene los valores, pero obviamente falla el cálculo de la firma al estar incompleta creo.
  • Néstor
    01-12-2015 20:23
    Hola, me autorespondo al anterior comentario, al parecer la cadena que pone en el apartado de notificaciones está incompleta y por eso falla todo el proceso. El problema real era que no estaba comunicandose con la web porque le había indicado https (SSL) en la url de notificación lo que provocaba el error '-1 Received fatal alert: handshake_failure'. ¡Una vez corregido todo ok!
  • Gonzalo
    02-12-2015 12:12
    Hola Néstor, Yo sigo igual que al principio, no valida la firma (es distinta la recibida a la generada), y los parámetros tampoco soy capaz de sacarlos, de ninguna de las formas que han dicho más arriba (bueno, lo de Mariano no lo he probado, pero hasta que no consiga la firma OK, lo he dejado), y al leer tu primer mensaje comprobé que mi parámetro Ds_MerchantParameters está igual que el tuyo: tras decodificarlo, la variable $decodec aparece la cadena json con todas las variables sin terminar. Sigo esperando respuesta de Redsys, pero como veo que ya han quitado el límite del 23 nov, supongo que saben que tienen algo mal y no saben qué es. ¿A qué te refieres con lo de https? Saludos
  • Néstor
    03-12-2015 18:02
    Hola Gonzalo, pues me refería a que como url de respuesta DS_MERCHANT_MERCHANTCODE le daba la dirección correcta de mi pasarela pero en modo https es decir (https://www.dominio.com/pasarela.php en vez de http:// ...), sigo investigando aún el tema de la firma ... :( Saludos
  • Javier
    03-12-2015 19:29
    Hola, He conseguido que funcione en modo prueba. ¿ Alguien sabe como quitar los datos que aparecen en pantalla (Ds_Merchant_SignatureVersion Ds_Merchant_MerchantParameters Ds_Merchant_Signature) [Enviar] antes de entrar en donde pide los datos de tarjetas ? Quisiera que fuera ahí directamente.
  • Max
    06-12-2015 12:04
    Hola, Tengo los mismos problemas desde le cambio de redsys a SHA 256.. He cambiado el código. Puedo aceptar pagos pero tengo problemas con las notificaciones de Redsys. - Notificación HTTP / síncrona, Resultado : Error, Received fatal alert: handshake_failure (https://www.mi_domino.com) - Notificación E-mail asíncrona, Resultado : Error, sun.net.smtp.SmtpProtocolException: 554 5.5.1 Error: no valid recipients - Notificación E-mail asíncrona, Resultado : Correcto (recibo email de notificación a mi dirección de correo indicado micorreo@mi_dominio.com) He contactado con redsys hace 4 días pero aún sin repuesta. Parece claro que algo en el código de redsys falla, a ver cuanto tiempo tardan en arreglarlo.
  • zaida
    07-12-2015 13:12
    Hola, A mí también me da el mismo error que a Max, en concreto: Autorización HTTP Asíncrona 0000 Error https://midominio.com/?wc-api=WC_redsys -1 Server returned HTTP response code: 500 for URL: https://midominio.com/?wc-api=WC_redsys Autorización E-Mail Asíncrona 0000 Error sun.net.smtp.SmtpProtocolException: 554 5.5.1 Error: no valid recipients Autorización E-Mail Asíncrona 0000 Correcto ¿Me podéis ayudar? Muchas gracias de antemano. Un saludo, Zaida
  • Néstor
    07-12-2015 13:15
    Max, Zaida en respuesta a vuestro problema creo que es lo mismo que me pasaba a mí, intentad cambiar la url de respuesta por una url sin https://... Es decir: Max - Notificación HTTP / síncrona, Resultado : Error, Received fatal alert: handshake_failure (https://www.mi_domino.com) <---- cambiar a http://www.mi_dominio.com Zaida: https://midominio.com/?wc-api=WC_redsys <---- cambiar a http://midominio.com/?wc_api=WC_redsys Un saludo
  • Alberto
    15-12-2015 09:43
    Buenos días, lo primero agradeceros vuestra ayuda porque gracias a este blog he configurado mi tpv, ya que el manual y la ayuda de redsys son totalmente inútiles. Necesito vuestra ayuda una vez más y no he visto la consulta por aquí. Os comento mi problema realizo todo el proceso correcto y el pago, la firma me da ok en la url_ok y aquí viene el problema, yo antes en este paso recuperaba las variables Merchant_titular, Merchant_Data. Merchant_producto para crear un justificante de pago , a través de los parámetros en la url pero eso ahora no se como hacerlo. Alguien me podría dar una solución para recoger esas variables en el url_ok? o algún ejemplo o algo. Muchas gracias, un saludo. Alberto.
  • max
    15-12-2015 15:59
    Hola Nestor, la cosa es que mi url de notificación es https (todo el proceso de compra esta con ssl) he probado lo que ha dicho (http en vez de https) y me sale un error 302. Aún sin recibir noticias de redsys. muy frustrante todo !
  • beux
    16-12-2015 18:35
    Hola Buenas tardes! Estoy intentando hacer el tpv virtual a traves del manual y tengo muchas dudas (Ya que soy primeriza en esto) Aparece como 4 ficheros que les menciono ahora. 1 Formulario de envío de petición 2 recepción de la notificación on-line Notificación Síncrona y Asíncrona 3 Notificación SOAP--> 4 Retorno del control de la navegación Lo que no se , es si va todo en el mismo fichero php o va por separado. y si va en distintos, como hago para llamarlos. y Son todos obligatorios? porque te da a entender que no no? Un saludo. Espero haberme explicado bien..
  • Isaac
    17-12-2015 11:05
    Buenas Enrique, me gustaria ponerme en contacto contigo en privado para mostrarte mi código hecho en Symfony2. Con el sha1 me iba perfectamente pero estoy intentando adaptarlo al 256 y no hay manera. Espero poder hablar contigo gracias.
  • Pixel
    19-12-2015 10:11
    Buenas. Estamos con problemas en la Notificación HTTP / asíncrona. La llamada del TPV se produce pero el $_POST viene en blanco. De hecho si pedimos las variables de sistema nos dicen REQUEST_METHOD : GET QUERY_STRING : . Es decir que nos llega la llamada en la URL que hemos parametrizado en DS_MERCHANT_MERCHANTURL pero parece que no contiene nada. ¿Alguien tiene alguna idea?
  • Pixel
    20-12-2015 12:25
    Solucionado. Se trataba de una redirecsión en el htaccess que pasaba las peticiones nombreDominio.com a www.nombreDominio.com y en el salto perdía el $_POST
  • Carlos
    22-12-2015 12:34
    Buenas Enrique, Avanzando en mi desarrollo de la migración a SHA256, ahora ya no me da el SIS0020 que me daba, ahora me da otro que es el SIS0007. Sigo todos tus pasos y me da este error. ¿A qué es debido?
  • Ness
    28-12-2015 11:47
    Hola Carlos, el error SIS0007 corresponde a lo siguiente: SIS0007 Error al desmontar el XML de entrada o error producido al acceder mediante un sistema de firma antiguo teniendo configurado el tipo de clave HMAC SHA256
  • rafa
    03-01-2016 20:13
    Hola a todos, confirmo que la solucion de Marta y Eduardo funciona para recibir los parámetros, y que éstos se reciben sin necesidad de verificar la firma, es totalmente independiente. El dato que quiero recalcar es que por GET no se recibe nada, en cambio en POST funciona perfectamente. Tambien he podido comprobar que si por inercia pones en la url de notificacion las www, por ejemplo http://www.tuurl.php no funciona, y con http://tuurl.php si que se reciben los datos. Es una cosa tonta de esas que te puede hacer dar muchas vueltas.
  • Jon
    15-01-2016 16:24
    Hola a todos, veo que no soy el único atascado aquí, lo cual no se si me preocupa más o o no :) El caso es que he probado todas las soluciones que planteáis pero el $_GET y el $_POST vuelven siempre vacíos. Ya no se si me he liado yo o que es lo que pasa. Puede alguien colgar su código completo por favor? Gracias!
  • Marcos
    25-01-2016 17:49
    Hola. Yo tengo el mismo problema que describe algún otro desdichado xDD Envío los datos correctamente ya que tanto la operación como la redirección es correcta URLOK y URLKO. El problema lo tengo con las variables que devuelve Redsys. Sólo recibo dos: Ds_SignatureVersion y Ds_MerchantParameters y esta segunda está incompleta, por lo que al intentar acceder a las propiedades dentro del json me falla. Además de todo esto he comprobado que el campo Ds_Merchant_MerchanData solo llega a Redsys como cadena vacía. Si le meto algún valor llega null. Nosotros necesitamos ese dato ya que es una implementación sencilla en la que no guardamos datos en DB y en función de la respuesta del tpv enviamos un correo con los datos pasados en ese parámetro. Encima les pones correos y ni puto caso o contestan sin dar una solución y con poca gana, alguien con este mismo problema? Gracias y saludos Gracias
  • José
    19-02-2016 18:10
    Hola Para los que aún utilizan ASP clásico, aquí tenéis la implementación del API de RedSys para ASP: https://github.com/ictmanagement/redsysHMAC256_API_ASP Espero que os sea de utilidad
  • Pedro
    28-02-2016 10:59
    Buenos días amig@s, Yo ya tengo todo implementado y aparentemente funciona bien; sin embargo tengo una duda. Cómo se sabe en la notificación si el pago se ha realizado correctamente ¿? Estoy viendo que cuando la operación no es correcta por algún problema con el pago (tarjeta caducada, datos incorrectos, etc.), el parámetro Ds_AuthorisationCode = ++++++, en cambio cuando el pago se ha realizado correctamente aparece un valor numérico en dicho parámetro. Creéis que es suficiente esta comprobación para saber si el pago se realizó correctamente ¿? qué comprobación estáis haciendo vosotr@s ¿? saludos
  • Brakus
    04-03-2016 17:24
    Hola todo funciona como describe Marta, ahora tengo un nuevo problema y es que nunca redirecciona el retorno de la navegación hacia la url definida en DS_MERCHANT_URLOK o DS_MERCHANT_URLKO, ya sea desde la administración de pruebas o por código. Cualquier colaboración sería de gran ayuda.
  • Zafghxc
    20-03-2016 22:42
    Hola, Después de 6 horas con la migración al nuevo formato y de no poder recibir ningún parametro gracias a vosotros lo he conseguido! Por si alguien tiene el mismo problema, este es el orden de los comandos que a mi me ha funcionado ... version = $_POST["Ds_SignatureVersion"]; $params = $_POST["Ds_MerchantParameters"]; $signatureRecibida = $_POST["Ds_Signature"]; $claveModuloAdmin = "XXXXXXXXXXXXXXXXXXXX"; $signatureCalculada = $myObj->createMerchantSignatureNotif($claveModuloAdmin,$params); $decodec = $myObj->decodeMerchantParameters($params); $Ds_Response = $myObj->getParameter("Ds_Response"); $Ds_Order = $myObj->getParameter("Ds_Order"); ... Saludos
  • kolo
    06-07-2016 10:54
    Buenas a tod@s. Veo que hace meses que no se vuelve a escribir aquí así que me la voy a jugar jajaj. Tengo el mismo problema que todos vosotr@s: el retorno desde la tpv de redsys. He probado con $_post y con $_get y nada de nada me sigue sin funcionar. En mi caso la tpv me redirige a mis urls DS_MERCHANT_URLOK Y URLKO pero una vez llegado a cualquiera de las 2 urls, no hace nada, es decir la pantalla se queda en blanco. No se si estoy haciendo algo mal yo que soy un poco principiante o no se. Llevo ya 2 semanas con el tema y no soy capaz de dar con la tecla para solucionarlo por que llamar a Redsys es una perdida de tiempo. Yo lo tengo así, en concreto mi DS_MERCHANT_URLOK: decodeMerchantParameters($datos); $kc = 'clave de prueba'; $firma = $miObj->createMerchantSignatureNotif($kc, $datos); if($firma === $signatureRecibida){ $variable= $_SESSION['variable']; $query = "UPDATE tabla SET pago= 1 WHERE variable LIKE '$variable'"; mysql_query($query) or die(mysql_error()); unset($variable); echo "alert('PAGO REALIZADO'); document.location=('http://www.miweb.com/es/main.php')"; } } ?>
  • fikri
    06-07-2016 13:49
    Es obligatorio tener en mi https: para realizar el pago via redsys si sin https me he esta tardando mucho de responder agradezco vuestra ayuda
  • Ugeltroglodita
    27-07-2016 17:54
    Buenas a todos, coincido con varios de vuestros problemas. La función getParameter a mí no es que no me devuelva nada, es que directamente me da un casque en la página!! Mirando lo que hace la clase internamente he cambiado el getParameter por $miObj->vars_pay->Ds_Response; Con esto accede de manera correcta al parámetro. Mi problema es otro, y es al generar la petición. Parecía que todo funcionaba bien, y cuando ya estaba en fase de pruebas, resulta que si en el id del pedido le pongo "0011" la página del tpv me da un SIS0042 que significa que la firma digital no es correcta. Si le pongo "0001", "0010", "0012"...va ok, pero con "0011" error. Me pasa también con "000015", y a saber con cuántas combinaciones más pasará. No encuentro ningún sentido a que la firma se genere bien o mal dependiendo del id del pedido, se supone que mientras ponga entre 4 y 12 cifras no hay problema no? En fin, si alguien se ha encontrado con este problema me puede ayudar? Gracias!
  • Eduard
    15-10-2016 01:40
    Hola a tod@s, después de leer todos los comentarios del foro y usar algunas de vuestras aportaciones, seguía sin conseguir visualizar los datos, pero es que el error no está en el código sinó en la configuración del PHP de vuestro alojamiento... al menos a mi me ha pasado. Se me ocurrió modificar los parámetros de seguridad del módulo Suhoshin y sorpresa! Los datos aparecieron sin más. Os copio los datos tal y como los he dejado configurados por si os puede servir de ayuda: suhosin.post.max_vars = 2000 suhosin.request.max_vars = 2000 suhosin.get.max_value_length =10000 suhosin.post.max_value_length = 30000000 suhosin.request.max_value_length = 30000000 Saludos y gracias a tod@s.
  • Javier
    31-10-2016 09:47
    Primerizo con redsys y problema que no encuentro solución al generar la firma, cuando se ejecuta esta linea se detiene el php. $signature = $miObj->createMerchantSignature($clave); Estoy bloqueado y redsys no me aportó ninguna solución
  • Alex
    07-11-2016 18:32
    Hola Enrique, me gustaría saber si es posible que cuando el pago es realizado con éxito, se haga un redireccionamiento automatico a la URL de Ds_Merchant_UrlOK en vez de que el usuario deba clicar en el botón de "continuar" o "volver" de la página del tpv. Muchos usuarios cierran la ventana del tpv después de pagar en vez de volver a la web. Muchas gracias por tu ayuda.
  • Virginia
    10-11-2016 17:01
    Hola, alguien me puede decir como hago para que el tpv responda a http en lugar de https. Me dicen en redsys que es tan simple como quitar la s de la dirección de respuesta...
  • Gema
    11-11-2016 12:53
    Buenos días, muchas gracias Enrique por compartir tus conocimientos. A ver comento... la llamada a la pasarela me funciona perfectamente pero a la vuelta no consigo acceder a los parámetros que devuelve la pasarela, hago un recorrido de $_POST, $_GET pero no me llega nada. También he probado la solución de Marta y al no llegarme nada pues me da FIRMA KO. Comento que estoy probando con la URL de pruebas o esto hay que hacerlo con la URL real?. Gracias de antemano a todos y buen finde!.
  • Javier
    16-11-2016 21:04
    Buenas tardes a mi me pasa lo mismo que ha Alex tengo clientes que cierran el navegador o le dan a volver cuando el pago se ha realizado con éxito y no me lo notifica como OK me lo notifica como KO ¿saben como solucionar este problema??
  • Guadalupe Muñoz García
    16-03-2017 17:59
    Buenas... Mil gracias por el aporte. Pero de donde sacamos la variable "totalpedido": $totalpedido*100;
  • Kikilocuras
    05-04-2017 21:12
    Tengo la web montada en wordpress, uso ssl really simple para tenerla en https pero con el tpv tengo el mismo problema que zaida, necesito poner solamente el www.midominio.com/?wc-api=WC_redsys en http pero siempre se me redirige al https y no se que regla poner en el .htacess o de que manera hacerlo. ¿Me pueden ayudar? Gracias.
Leave a comment
I have read and accept the Privacy Policy

The comments sent by each user will always be visible in the corresponding post, and will not be used for any other purpose. The user has the right to access, rectify and suppress said comments, as reflected in our Privacy Policy