El proceso de pago funciona correctamente pero el pedido no se registra en la tienda

Esta incidencia nos está empezando a llegar cada vez más a menudo referida a los módulos de OsCommerce y ZenCart.

La causa más común es un problema con la configuración de php, que a partir de la versión 5.3.3 ha cambiado el valor por defecto del parámetro «session.use_only_cookies» antes estaba desactivado por defecto y ahora viene activado.

Para que nuestros módulos puedan funcionar en osCommerce y ZenCart es necesario que este parámetro esté desactivado.

¿Cómo lo comprobamos?

Podemos ver el valor que tiene ese parámetro en nuestro servidor accediendo en la administración de la tienda a «Herramientas -> información del Servidor» o subiendo un archivo php con la instrucción <?php phpinfo(); ?> y llamándolo desde nuestro navegador.

¿Como podemos cambiar el valor de este parámetro?

Para cambiar el valor de este parámetro y de otros que pueden afectar al funcionamiento de nuestros módulos (como algunos referentes al Suhosin Patch), procederíamos de la siguiente forma dependiendo del caso:

  • Si es un servidor dedicado o virtual que podemos configurar a nuestro antojo bastaría con cambiar el valor del parámetro en el fichero php.ini
  • Suele ser más común tener la tienda alojada en un servidor compartido, en cuyo caso en función de como lo haya configurado el proveedor de hosting tendremos diferentes opciones:
    • Php configurado como módulo de apache: En este caso en la información del servidor veremos, en la opción «Server API» el valor «Apache 2.0 Handler» o algo similar. En este caso tendríamos que añadir al fichero .htacces las siguientes líneas (y si no existe el fichero crearlo):
php_flag session.use_only_cookies 0
php_flag suhosin.cookie.cryptua 0
php_flag suhosin.cookie.cryptdocroot 0
php_flag suhosin.session.cryptdocroot 0
php_flag suhosin.session.encrypt 0
    • Php configurado como CGI o FastCGI: en este caso en la opción «Server Api» veremos algo como «FastCGI» o «CGI». Para cambiar los parámetro añadiríamos un fichero php.ini con las siguiente líneas:
session.use_only_cookies=Off
suhosin.cookie.cryptua=Off
suhosin.cookie.cryptdocroot=Off
suhosin.session.cryptdocroot=Off
suhosin.session.encrypt=Off

Normalmente esto es suficiente para solucionar el problema pero hay algunos proveedores de hosting que no permiten el cambio de estas configuraciones usando estos métodos por lo que la única solución que nos quedaría sería abrir un ticket y solicitar que nos hagan ellos el cambio.

Otras causas

El problema que da título al post puede tener también otras causas, no relacionas con la configuración de php.

  • Que la tienda sea accesible desde internet. Esto es para que el pedido se procese el banco tendrá que conectarse a nuestra tienda por lo que no podemos tenerla en local o en una intranet. Tampoco podemos tener la tienda en modo mantenimiento restringiendo el acceso sólo a las ips de los administradores.  Tampoco podremos tener la tienda protegida por contraseña vía .htaccess o sistemas similares.
  • Configuración de sesiones en la tienda: Si accedemos en la administración de la tienda a configuración -> sesiones, deberíamos tener todos los valores a «False» salvo «prevent spider sessions», que podríamos dejarlo a «True»
  • Asegurarnos de que tanto el cookie domain como el cookie path estén bien configurados en el fichero configure.php. Es recomendable que sea lo menos restrictivo posible.

¡Esperamos que os sirva!

8 comentarios sobre “El proceso de pago funciona correctamente pero el pedido no se registra en la tienda”

    1. ¿Has probado a activar la notificación HTTP?

      Para poder recibir la notificación HTTP y que el pedido se procese es necesario que la tienda esté en línea. No puede estar en local, protegida por contraseña ni en modo mantenimiento, ya que de ser así la notificación proviniente del banco no puede llegar a la tienda.

      1. Hola

        Era en la configuración de la pasarela «Notificación Online» lo tenia por parámetros y tenia que ser por HTTP.

        Muchas gracias por responder tan rapido.

        Un saludo

    1. No es necesario desactivar las cookies en osCommerce para que funcione, y de hecho si las activas va a mejorar bastante tu indexación ya que te quitas de enmedio el molesto parámetro osCsid de la sesión. Ya que el modulo usa dicho parámetro para recuperar los datos de la transaccion y realizar la inserción del pedido en la base de datos, solamente es necesario permitirle a tu pasarela de pago no usar de cookies, mientras para el resto de los usuarios puedes mantenerlo activado.

      Para ello, en el application_top, donde pone:

      if (SESSION_FORCE_COOKIE_USE == ‘True’) {

      simplemente añade la condicion de «y no seas la plataforma de pago»:

      if (SESSION_FORCE_COOKIE_USE == ‘True’ && $_SESSION[‘HTTP_USER_AGENT’]!=»el user agent que utilice la plataforma») {

      Puedes restringir por el user agent, por la IP de la misma (si es estática), o por cualquier otro parámetro que te apetezca. Al entrar la petición desde la plataforma, se saltará esa línea, y realizará el inicio de sesión como si las cookies estuvieran desactivadas, pero solamente en dicho caso.

      Espero q te sirva.

      1. ¡¡Gracias por el comentario Javi!!

        Seguro que a más de uno le ayuda. Si no me equivoco el user-agent que usa Redsýs es Java/1.5.0

        En cualquier caso el problema que se trata en este artículo es más a raíz de la configuración hecha en php (session.use_only_cookies) que al SESSION_FORCE_COOKIE_USE, que se puede configurar en oscommerce, y el problema que supone que en las versión de php mayores que 5.3 venga activado por defecto.

  1. Hola tengo una tienda oscommerce 2.3.3 y mi proveedor de hosting me dice que el vps usa suPHP ¿como configuro esos parametros?

    LOs clientes cuando hace la compra y pagan con tarjeta en la pasarela del banco, al regresar a la tienda, el pedido no se guarda ni reciben email de confirmación.

Responder a Javier Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *