DevopensourceTeam / Devopensource_Redsys

Método de pago para Redsys para Magento compatible con SHA-256 y parche SUPEE-6788
https://devopensource.com/blog/devopensource-y-redsys
27 stars 11 forks source link

RedSys rechaza servidores con SNI. Cómo redirigirlo por http (no-seguro)? #53

Open jan1980 opened 7 years ago

jan1980 commented 7 years ago

Saludos chicos,

Sorprendentemente, RedSys no concluye el pedido si la notificación va por httpS en un servidor que use SNI (IP colectiva). Como consecuencia, el pago se produce, pero el pedido se queda Pendiente, y los mails transaccionales no salen.

Es decir, RedSys quieren que tengamos una IP dedicada.

Mientras RedSys se pone al día, y nos permite tener SSL con servidores que usen SNI, estamos obligados a usar algún tipo de redirección para que la web se mantenga por httpS, pero el callback se produzca por http, y pueda notificar a la tienda que el pago se ha completado (y lanzar los mails transaccionales).

Posible solución

Si no me equivoco, una solución es decirle al módulo que nos devuelva el callback por http (no-segura) en la casilla específica para eso en Métodos de Pago.

Pero luego deberíamos crear una redirección en .htaccess, para que el resto de la web use httpS (conexión segura).

Cómo sería la regla a poner en .htaccess para lograrlo?

Aquí hay un ejemplo, pero no sé qué convendría poner en lugar del "ALGO_ESPECÍFICO_DE_LA_URL_DE_CALLBACK":

RewriteEngine On
# Si la cadena de consulta no contiene "ALGO_ESPECÍFICO_DE_LA_URL_DE_CALLBACK"
RewriteCond %{QUERY_STRING} !ALGO_ESPECÍFICO_DE_LA_URL_DE_CALLBACK [NC]
# Y la conexión no es HTTPS
RewriteCond %{HTTPS} off
# Redirigimos a la versión con HTTPS
RewriteRule (.*) https://%{SERVER_NAME}/%$1 [R,L]

Muchas gracias por cualquier idea o sugerencia. Saludos,

Edito:

Podría tratarse de "redsys/index/callback" (según la pantalla de configuración, dónde se menciona lo de {{secure_base_url}}redsys/index/callback) o de "payment/redsys/callback"?

Lo segundo lo encontré en un foro de OpenCart, y lo he buscado en el Módulo de Magento, dónde figura aquí, junto a otra URL parecida:

\app\code\community\Devopensource\Redsys\Helper\Data.php

Line 30: $url = Mage::getStoreConfig('payment/redsys/callback', Mage::app()->getStore());
Line 37: return Mage::getStoreConfig('payment/redsys/callbackurl', Mage::app()->getStore());
mbernabeu commented 7 years ago

Con esta te debería valer redsys/index/callback otra opción que puedes aplicar es extraer la logica del controlador en un fichero php externo de Magento y indicar en htaccess que excluya esa ruta esto en caso de que tengas en Magento el forzado de https

jan1980 commented 7 years ago

Gracias @mbernabeu lo he intentado pero no lo logré, no recibo la notificación de RedSys de vuelta, utilicé este código:

<IfModule mod_rewrite.c>
RewriteEngine On
# Si la cadena de consulta no contiene "redsys/index/callback"
RewriteCond %{QUERY_STRING} !redsys/index/callback [NC]
# Y la conexión no es HTTPS
RewriteCond %{HTTPS} off
# Redirigimos a la versión con HTTPS
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

La redirección funciona y el site se pone en modo seguro, pero para RedSys hay algo que falla porque si la lógica es correcta debería funcionar... ¿algún fallo en la sintaxis, o la cadena no es la correcta? He probado con redsys/index/callback y con /redsys/index/callback, también con checkout/onepage/success, pero nada funcionó.

Mil gracias por cualquier sugerencia.

mbernabeu commented 7 years ago

prueba a poner tu la url en el navegador a ver si funciona, quiza Magento te este redireccionando a https

jan1980 commented 7 years ago

Efectivamente, en el panel del TPV me sale que algo está aplicando una redirección 302:

HTTP || Síncrona || 0000 || Error || http://nuestraweb.com/redsys/index/callback || 302

RedSys está entrando por http (por lo que entiendo que mi excepción en .htaccess funciona), pero me queda la duda de cuándo y porqué se produce este 302? De dónde puede salir? Es el mismo .htaccess quién lo produce, y RedSys no admite redirecciones?

Pero tenía entendido que esta solución funcionaba, de hecho en otros sites usando WooCommerce la hemos utilizado...

Tenéis alguna idea de que podría ser? Gracias mil!

PD: sin la excepción de .htaccess, yendo por http normal en todo el site, me daba:

HTTP || Síncrona || 0104 || Correcto || http://nuestraweb.com/redsys/index/callback || 200

olivermontes commented 7 years ago

@jan1980 realiza un debug de que datos envias a redsys en el momento de la redireción, puede que le envies que funcione por seguro y luego el .htaccess lo cambie y por lo tanto tengas 302