Enrique J. Ros

Procesar pagos offline con tarjeta con WooCommerce

A veces te piden cosas muy raras, pero cada uno conoce su negocio mejor que nadie y realiza sus procesos de la forma que mejor le viene, así que la obligación del desarrollador es hacer que la web se adapte a las necesidades del negocio, y no viceversa.

Esto viene por una petición bastante rara que me hizo un cliente: quería habilitar en su web los pagos con tarjeta pero para procesarlos offline, es decir, el cliente realiza el checkout dando los datos de la tarjeta de crédito y después él realiza el cargo a través de un TPV físico. A ver cómo narices hacemos esto en WooCommerce.

Pedir y almacenar los datos de la tarjeta

Ya sé que no es muy eficiente en términos de tiempo pero, cuando un cliente me pide una funcionalidad fuera de lo habitual, normalmente prefiero programarla a medida para su web. Al fin y al cabo es difícil encontrar una solución comercial (gratuita o de pago) que se adapte bien a necesidades especiales, y la experiencia me ha enseñado que a menudo tardo menos en programarla que en ponerme a buscar una solución “enlatada”, que al final será poco eficiente porque requerirá de varios plugins trabajando en conjunción.

Así que cuando este cliente me hizo esta petición mi primer pensamiento fue programar una pasarela de pago para WooCommerce que se limitara a recoger los datos de la tarjeta de crédito o débito (titular, número de tarjeta, caducidad, código de seguridad), a almacenarlos y a dejar el pedido como pendiente. Fácil, fácil.

Estándar de Seguridad de Datos para la Industria de Tarjeta de Pago

Pero la cosa es diferente cuando, después, uno se sienta a escribir código. Dejando a un lado el tema de las comprobaciones de números y tipos de tarjeta (tedioso pero sencillo de programar) lo primero que viene a la mente es… ¡la seguridad!

Porque imagina que alguien consigue acceso a la web o al servidor. Todos esos pedidos con los datos de los clientes (nombre, dirección, teléfono) asociados a los de una tarjeta bancaria… ¡Eso no puede ser!

Y claro, efectivamente no puede ser. De hecho los requisitos para almacenar datos de tarjetas bancarias están regulados por una normativa llamada PCI DSS (Payment Card Industry Data Security Standard, es decir, Estándar de Seguridad de Datos para la Industria de Tarjeta de Pago).

Como ya te imaginas, los requisitos son bastante duros y las multas por saltárselos a la torera bastante altas. Así que, ¿qué toca? Encriptación asimétrica, múltiples factores de autenticación… Espera, espera, ¿no nos estamos complicando la vida demasiado?

Pedir los datos de la tarjeta en el checkout, pero no realizar el cargo

Pues toca lo que quería evitar hacer: buscar una solución comercial a una necesidad tan específica. Y resulta que me encuentro con que no es tan específica, y que hay soluciones realmente ingeniosas por ahí para evitar (de forma legal, legítima y fiable) todos esos requisitos de seguridad.

De hecho hay varios, pero te mostraré dos por ser los más representativos. Y, por cierto, uno de ellos se adaptaba realmente bien a la necesidad de este cliente, así que opté por no invertir horas de programación cuando el trabajo ya estaba (bien) hecho.

WooCommerce Offline Credit Card Payment Method

El primero de ellos es WooCommerce Offline Credit Card Payment Method (plugin retirado). No te puedo dar referencias sobre cómo funciona, porque no lo he utilizado: no me termina de convencer el procedimiento que utiliza.

Básicamente el plugin encripta los datos de la tarjeta utilizando una clave que el cliente establece en el checkout y que luego debe hacer llegar al gestor de la tienda por algún otro método (email, teléfono), de forma que éste pueda utilizarla para desencriptar dichos datos.

WooCommerce Offline Credit Card Processing

Finalmente opté por este otro plugin, WooCommerce Offline Credit Card Processing, que utiliza un método mucho más ingenioso.

Básicamente el plugin recoge todos los datos de la tarjeta de crédito, pero guarda sólo una parte (los cuatro primeros y los cuatro últimos números) junto con los datos del pedido en WooCommerce. El resto (los doce números centrales) los envía por email al administrador, con la indicación de eliminar el correo una vez se haya procesado el pago.

Como ves no hay encriptación, con lo que se obvia el paso de establecer (y transmitir) una clave, pero igualmente se cumplen los estándares PCI ya que no se almacenan los datos de la tarjeta en el servidor. Obviamente hay que evitar utilizar plugins como Email Log, que guardan copia de todos los emails enviados por WordPress.

Por otro lado, las opciones del plugin permiten un grado de libertad suficiente a la hora de configurarlo:

En fin, como ves, una solución muy ingeniosa a un problema que, en principio, parecía bastante engorroso. Se agradece.

Salir de la versión móvil