Curso de WooCommerce presencial en Barcelona de 42h
O llama al
630 316 570
Próximo curso noviembre – No hay fechas
Plazas limitadas
150€
Antes de nada, un poco de historia y teoría, ya que creo que es importante para entenderlo todo.
Últimamente muchos clientes del plugin de modulosdepago.es en su versión PRO, la que en si acepta la tokenización de tarjetas y los pagos recurrentes con WooCommerce Subscriptions, están migrando a mi plugin de WooCommerce.com
El problema que tienen básicamente es que las suscripciones creadas con anterioridad no se cargan, es decir, no pueden cobrarse. Hasta aquí todo normal, ya que cuando WooCommerce guarda las tarjetas tokenizadas, las guarda para un Gateway ID en particular, y mi plugin de pasarela no debería tener acceso a esos tokens si el ID es diferente.
Básicamente, cuando WooCommerce guarda mediante su API las tarjetas, las guarda en dos tablas
En la tabla woocommerce_payment_tokens

Aquí es dónde guarda los tokens en si.
y la tabla woocommerce_payments_tokensmeta

es donde guarda todos los datos relacionados con esas tarjetas.
Bien, podéis ver que en la tabla woocommerce_payment_tokens que hay una columna que pone gateway_id, En esta columna WooCommerce guarda el ID del Gateway. Si el plugin de modulosdepago.es se hubiera desarrollado utilizando la API de WooCommerce, aquí se encontrarían todos los tokens de los usuarios y no habría que hacer nada más, ya que por suerte, tanto el gateway_id de modulosdepago.es como el de WooCommerce.com son iguales. Así que sería una migración totalmente transparente.
Como comento, la extensión de modulosdepago.es no se ha desarrollado siguiendo los estándares de WooCommerce, y no se ha utilizando la API de Tokenización. Esto me ha obligado a crear un script para que todos los usuarios que quieran empezar a disfrutar de todas las ventajas del plugin oficial de WooCommerce.com para Redsys, lo puedan hacer sin problemas.
¿Qué es lo que hace la extensión de modulosdepago.es? pues es bien sencillo, en vez de utilizar la API de tokenización, guarda el token con los metadatos de los usuarios.
Exactamente lo que hace es guardarlo en los metas _ds_merchant_identifier y redsys_card de los usuarios en la table {prefijo_}usermeta

Esta forma «funciona», pero tiene consecuencias, cómo que la tarjetas no las pueda gestionar el usuario desde su cuenta de WooCommerce, o que WooCommerce no sepa cosas tan básicas como la fecha de caducidad. Cómo veréis, no es la forma mas idónea de hacerlo, sobre todo cuando existe una API específica para ello.
En qué consiste mi script, pues simplemente lo que hace es ir por todos los usuarios buscando estos dos datos, y añadirlos de forma correcta a WooCommerce mediante su API de Tokenización. De esta forma, los usuarios ya pueden gestionar por ejemplo sus tarjetas desde sus cuentas.

En este caso, el script debe añadir datos falsos, como es por ejemplo la fecha de caducidad, que la fija en diciembre de 2022, o el tipo de tarjeta que la pone como unknown, por el mero hecho que estos datos no son guardados por el plugin de modulosdeoago.es. y por lo tanto no se pueden añadir a la API de WooCommerce (el de WooCommerce.com los guarda todos).
Una vez que el proceso acaba, ya todo funciona con normalidad, todos los usuarios tienen acceso a sus tarjetas, y WooCommerce es capaz de gestionarlas (cosa muy importante como es lógico).
Antes de continuar NO utilicéis este script si vais a continuar con el plugin de modulosdepago.es. No os servirá de nada ya que el plugin seguirá guardando los datos y utilizándolo de su forma. Este script solo vale la pena utilizarlo si queréis empezar a utilizar el plugin oficial de WooCommerce.com para Redsys que utiliza la API de WooCommerce.
¿Cómo se utliza el script?
Es muy sencillo, solo debéis subir un archivo con el nombre que deseéis, por ejemplo update-tokens.php al directorio raíz de vuestra instalación. Una vez subido, solo debéis visitar la dirección https://tusitio.tld/update-tokens.php y el script se pondrá en marcha. Si cuando acaba no sale el mensaje «¡Felicidades! Todos los Tokens de los usuarios migrados», recarga la página hasta que salga. Esto puede ser debido a que por ejemplo tengas muchos usuarios y se produzcan timeouts.
Por favor, realiza una copia de seguridad antes de proceder con el script. Por el tipo de funcionamiento que tiene, no debería pasar absolutamente nada, pero cuando se juega con la base de datos, siempre es bueno hacer una copia de seguridad antes de comenzar.
El código que debe tener el archivo a subir es:
<?php | |
/* | |
* Script para migrar los Token creado por el plugin Redsys PRO de modulosdepago.es a la forma correcta de guardarlos | |
* utilizando la API para Tokens de WooCommerce, y de esta forma poder utilizar el plugin oficial de WooCommerce.com para Redsys | |
* sin problemas y guardar los datos tal y como se debe hacer en WooCommerce. | |
* Solo necesitas tener activado WooCommerce, no hace falta que esté activo ningún otro plugin ya que este script solo utiliza | |
* la API de WordPress y de WooCommerce. | |
* Plugin oficial de WooCommerce.com para Redsys: https://woocommerce.com/products/redsys-gateway/ | |
*/ | |
/* | |
* Para utilizar este script, solo debes subirlo a la raiz de tu instalación y visitar mediante el navegador el archivo. | |
* Por ejemplo, si lo subes como update-tokens.php, deberás visitar la dirección https://tuweb.tld/update-tokens.php y esperar | |
* a que finalice. Si no sale el mensaje de que ha finalizado por un timeout, vuelve a ejecutarlo hasta que salga. | |
*/ | |
/* | |
* Autor: José Conti | |
* Versión: 1.0.1 | |
* Fecha: 15/09/2019 | |
*/ | |
require_once 'wp-load.php'; | |
$plugins_path = WP_PLUGIN_DIR; | |
$woocommerce = $plugins_path . '/woocommerce/'; | |
echo $plugins_path . '<br />'; | |
// La siguiente línea es por si por lo que fuera, no se cargar la Clase WC_Payment_Token_CC() | |
//include_once $woocommerce . 'includes/payment-tokens/class-wc-payment-token-cc.php'; | |
$users = get_users(); | |
if ( $users ) { | |
foreach( $users as $user ) { | |
$id = $user->ID; | |
echo $id . '<br />'; | |
$dsmerchantidenti = get_user_meta( $id, '_ds_merchant_identifier', true ); | |
echo $dsmerchantidenti . '<br />'; | |
$cart = get_user_meta( $id, 'redsys_card', true ); | |
echo $cart . '<br />'; | |
if ( ! empty( $id ) ) { | |
$updated = get_user_meta( $id, '_redsys_actualizado_token', true ); | |
if ( $updated !== 'yes' ) { | |
echo 'Hay usuario' . '<br />'; | |
if ( ! empty( $dsmerchantidenti ) ) { | |
echo 'hay token' . '<br />'; | |
if ( class_exists( 'WC_Payment_Token_CC' ) ) { | |
$token = new WC_Payment_Token_CC(); | |
$token->set_token( $dsmerchantidenti ); | |
$token->set_gateway_id( 'redsys' ); | |
$token->set_user_id( $id ); | |
$token->set_card_type( 'unknown' ); | |
if ( $cart ) { | |
$dscardnumber4 = substr( $cart, –4 ); | |
$token->set_last4( $dscardnumber4 ); | |
} else { | |
$dscardnumber4 = '0000'; | |
$token->set_last4( $dscardnumber4 ); | |
} | |
$dsexpirymonth = '12'; | |
$dsexpiryyear = '2222'; | |
$token->set_expiry_month( $dsexpirymonth ); | |
$token->set_expiry_year( $dsexpiryyear ); | |
$token->set_default( true ); | |
$token->save(); | |
echo 'Token de Usuario con ID: ' . $id . ' migrado. <br />'; | |
update_user_meta( $id, '_redsys_actualizado_token', 'yes' ); | |
continue; | |
} else { | |
echo 'La clase WC_Payment_Token_CC() no existe'; | |
} | |
} | |
echo 'No tiene token' . '<br />'; | |
continue; | |
} else { | |
echo 'El token del usuario ' . $id . ' ya ha sido actualizado <br />'; | |
continue; | |
} | |
} | |
} | |
echo '/*****************************************************/ <br />'; | |
echo '¡Felicidades! Todos los Tokens de los usuarios migrados <br />'; | |
echo '/*****************************************************/ <br />'; | |
} else { | |
echo 'sin usuarios'; | |
} |
Recuerda que si estás realizando esta migración, y tienes un problema, puedes abrir un ticket para que te ayude en WooCommerce.com
También recuerda que mi plugin está auditado constantemente por Automattic (desarrolladores de WooCommerce) y sigue estrictamente todos los estándares de WordPress, WooCommerce y utiliza siempre la API de WooCommerce. Nunca tendrás problemas de compatibilidad y todo el código sigue los Coding Standards de WordPress VIP, los más exigentes en cuanto a calidad de código en el mundo de WordPress.