Archivo de la categoría: Sin categorizar

Una clase PHP para la pasarela de pagos redsys / sermepa

La clase sermepa actualmente Redsys sirve para generar el formulario que se comunicará con la pasarela de pagos que usan muchos bancos, como Santander, Sabadell, Lacaixa, etc.

Es una versión que irá creciendo y actualizándose poco a poco y mejorándolo.

https://github.com/ssheduardo/sermepa

Requerimientos mínimos

PHP 5 >= 5.3.0, PHP 7.1, 8.0

Instalación

Si usas composer tienes 2 opciones

1.- Por línea de comandos

composer require sermepa/sermepa

2.- Creas o agregas a tu archivo composer.json la siguiente dependencia:

{
   "require": {
      "sermepa/sermepa": "^1.3.2"
   }
}

Luego ejecutas:

composer update

Si en caso contrario no usas composer, bastará con clonar el repositorio

git clone https://github.com/ssheduardo/sermepa.git

¿Cómo usar la clase?

Ejemplo:

//Si usas composer
//include_once('vendor/autoload.php');

//Si clonaste la clase
//include_once('sermepa/src/Sermepa/Tpv/Tpv.php');

try{
    //Key de ejemplo
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $redsys = new Sermepa\Tpv\Tpv();
    $redsys->setAmount(rand(10,600));
    $redsys->setOrder(time());
    $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
    $redsys->setCurrency('978');
    $redsys->setTransactiontype('0');
    $redsys->setTerminal('1');
    $redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
    $redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
    $redsys->setUrlOk('http://localhost/ok.php'); //Url OK
    $redsys->setUrlKo('http://localhost/ko.php'); //Url KO
    $redsys->setVersion('HMAC_SHA256_V1');
    $redsys->setTradeName('Tienda S.L');
    $redsys->setTitular('Pedro Risco');
    $redsys->setProductDescription('Compras varias');
    $redsys->setEnvironment('test'); //Entorno test

    $signature = $redsys->generateMerchantSignature($key);
    $redsys->setMerchantSignature($signature);

    $form = $redsys->createForm();
} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}
echo $form;

Con esto generamos el form para la comunicación con la pasarela de pagos.

Enviar datos de la tarjeta

Si queremos enviar los datos de la tarjeta para que no nos lo solicite la pasarela de pagos, podemos hacerlo de la siguiente forma.

try{
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $redsys = new Sermepa\Tpv\Tpv();
    $redsys->setAmount(rand(10,600));
    $redsys->setOrder(time());
    $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
    $redsys->setCurrency('978');
    $redsys->setTransactiontype('0');
    $redsys->setTerminal('1');
    $redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
    $redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
    $redsys->setUrlOk('http://localhost/ok.php'); //Url OK
    $redsys->setUrlKo('http://localhost/ko.php'); //Url KO
    $redsys->setVersion('HMAC_SHA256_V1');
    $redsys->setTradeName('Tienda S.L');
    $redsys->setTitular('Juan Risco');

    $redsys->setPan('4548812049400004'); //Número de la tarjeta
    $redsys->setExpiryDate('2012'); //AAMM (año y mes)
    $redsys->setCVV2('123'); //CVV2 de la tarjeta

    $redsys->setEnvironment('test'); //Entorno test

    $signature = $redsys->generateMerchantSignature($key);
    $redsys->setMerchantSignature($signature);

    $form = $redsys->createForm();
} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}
echo $form;

Pago con referencia

Esta operativa nos permite guardar los datos de la tarjeta. SIS almacena la tarjeta y devuelve la referencia que deberá ser almacenada por el comercio.

Imaginemos que en el ejemplo anterior, queremos guardar los datos de la tarjeta, solo bastará con agregar el método setIdentifier(). Cuando se haga el llamado a la url de notificación, éste nos devolverá Ds_Merchant_Identifier y Ds_ExpiryDate.

//Para una nueva referencia agregar este método al ejemplo anterior
$redsys->setIdentifier();

//En la url de notificación nos devolverá algo como esto
Array
(
    [Ds_Date] => 17%2F02%2F2022
    [Ds_Hour] => 23%3A25
    [Ds_SecurePayment] => 1
    [Ds_Card_Number] => 491801******4602
    [Ds_ExpiryDate] => 3212
    [Ds_Merchant_Identifier] => 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c
    [Ds_Card_Country] => 724
    [Ds_Amount] => 0
    [Ds_Currency] => 978
    [Ds_Order] => 1645136683
    [Ds_MerchantCode] => 999008881
    [Ds_Terminal] => 001
    [Ds_Response] => 0000
    [Ds_MerchantData] =>
    [Ds_TransactionType] => 0
    [Ds_ConsumerLanguage] => 1
    [Ds_AuthorisationCode] => 005090
    [Ds_Card_Brand] => 1
    [Ds_Merchant_Cof_Txnid] => 2202172334011
    [Ds_ProcessedPayMethod] => 1
    [Ds_Control_1645136701458] => 1645136701458
)

Ahora bien, si queremos realizar otro cobro sin que nos pidan los datos de la tarjeta para ese mismo usuario, bastará con pasar el Ds_Merchant_Identifier anterior en el método setIdentifier().

Cada banco tiene un sistema de seguridad a través de un código de SMS, tarjeta de coordenadas, etc. que se mostrará para completar la transacción.

$redsys->setIdentifier(2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c);

//En la url de notificación nos devolverá algo como esto
Array
(
    [Ds_Date] => 17%2F02%2F2022
    [Ds_Hour] => 23%3A28
    [Ds_SecurePayment] => 1
    [Ds_Card_Number] => 491801******4602
    [Ds_Merchant_Identifier] => 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c
    [Ds_Card_Country] => 724
    [Ds_Amount] => 12000
    [Ds_Currency] => 978
    [Ds_Order] => 1645136909
    [Ds_MerchantCode] => 999008881
    [Ds_Terminal] => 001
    [Ds_Response] => 0000
    [Ds_MerchantData] =>
    [Ds_TransactionType] => 0
    [Ds_ConsumerLanguage] => 1
    [Ds_AuthorisationCode] => 078737
    [Ds_Card_Brand] => 1
    [Ds_Merchant_Cof_Txnid] => 2202172334011
    [Ds_ProcessedPayMethod] => 1
    [Ds_Control_1645136925978] => 1645136925978
)

Si no queremos que nos muestre ninguna pantalla y directamente realice el pago debemos hacer uso del método setMerchantDirectPayment():

$redsys->setMerchantDirectPayment(true);

También podemos hacer los cobros recurrentes a traves de Rest.

try{
    //Key de ejemplo
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $redsys = new Sermepa\Tpv\Tpv();
    $redsys->setAmount(rand(20,80));
    $redsys->setOrder(time());
    $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco

    $redsys->setCurrency('978');
    $redsys->setTransactiontype('0');
    $redsys->setTerminal('1');
    $redsys->setIdentifier('2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c');
    $redsys->setVersion('HMAC_SHA256_V1');
    $redsys->setEnvironment('restTest'); //Rest entorno test
    $redsys->setMerchantCofIni('N');
    $redsys->setMerchantDirectPayment(true);

    $redsys->setMerchantCofTxnid(2202172334011);

    $signature = $redsys->generateMerchantSignature($key);
    $redsys->setMerchantSignature($signature);

    $response = json_decode($redsys->send(), true);

    $parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
    $DsResponse = $parameters["Ds_Response"];
    $DsResponse += 0;
    if ($redsys->check($key, $response) && $DsResponse <= 99) {
        //Si es todo correcto ya podemos hacer lo que necesitamos, para este ejemplo solo mostramos los datos.
        print_r($parameters);
    } else {
        //acciones a realizar si ha sido erroneo
    }

} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}

Comprobación de Pago

Podemos comprobar si se ha realizado el pago correctamente. Para ello necesitamos setear la clave del banco y pasar la variable $_POST que nos devuelve en la URL de notificación o de retorno. Tener en cuenta que debemos realizar esta comprobación en la url de notificación. Por ejemplo, en el fichero que es llamado por la URL de retorno:

try{
    $redsys = new Sermepa\Tpv\Tpv();
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $parameters = $redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);
    $DsResponse = $parameters["Ds_Response"];
    $DsResponse += 0;
    if ($redsys->check($key, $_POST) && $DsResponse <= 99) {
        //acciones a realizar si es correcto, por ejemplo validar una reserva, mandar un mail de OK, guardar en bbdd o contactar con mensajería para preparar un pedido
    } else {
        //acciones a realizar si ha sido erroneo
    }
} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}

https://github.com/ssheduardo/sermepa

Como descargar e instalar Remix OS 2

1. Prepara todos los archivos

En Windows, hazte tanto con la herramienta USB de Remix como con la ISO de Remix OS. La herramienta ocupa poco más de 4 MB, mientras que la ISO son 2 Gb, que la persona que lo filtró ha comprimido en algo más de 600 MB.

El Windows Defender de Windows 10 se empeña en detectar la herramienta de grabación USB como malware, así que la borrará una y otra vez nada más que termines de descargarla, a no ser que desactives la protección en tiempo real (bajo tu propia responsabilidad, claro).

Si tienes la ISO en formato comprimido, descomprímela en alguna carpeta de tu disco duro.

2. Formatea tu pendrive en FAT32

Necesitarás un pendrive de gran capacidad para grabar Remix OS. Si ya está formateado en FAT32, no necesitas hacer nada más (salta al paso 3), pero si no es así, debes formatearlo primero.

Para comprobar el formato de tu memoria USB, ve al Administrador de archivos, haz clic derecho y elige Propiedades. En la carpeta General aparece el sistema de archivos, que generalmente será FAT32 o NTFS.

Si tu memoria está formateada en NTFS, haz clic derecho sobre ella en el Administrador de archivos y elige Formatear. En sistema de archivos, elige FAT32. Si está activado el Formateo rápido (recomendado) el proceso toma apenas un par de segundos.

3. Graba la ISO en la memoria

De vuelta a los archivos que descargaste antes, inicia la utilidad USB de Remix (remix-usb-tool.exe). En el apartado ISO File, pulsa Browse para seleccionar la imagen ISO que descomprimiste en alguna carpeta de tu disco duro.

En USB Disk, elige la letra de la unidad de la memoria USB. Asegúrate de que es la correcta, si bien la aplicación parece detectarla automáticamente por ti. Cuando estés listo, pulsa OK para que comience la copia de los archivos.

Aquí es el momento de que tu puerto USB 3.0 y memoria USB se luzcan. El proceso tarda unos cuantos minutos en completarse. Paciencia.

4. Inicia tu PC desde la memoria USB

Reinicia tu PC y asegúrate de que se inicia desde la memoria USB. La mayoría de las BIOS te permiten seleccionar el orden de los dispositivos de arranque, pero además es cada vez más común que el sistema te permita cambiarlo fácilmente pulsando alguna tecla durante el arranque (por ejemplo, F2). Si tienes dudas, consulta el manual de tu PC o placa base.

En Windows 10 a veces cuesta un poco más hacer un reinicio completo, pero lo puedes forzar desde las Opciones > Actualizaciones y Seguridad > Recuperación > Inicio avanzado.

5. Inicia la instalación

Si todo ha ido bien, una ventana te dará la bienvenida a la instalación de Remix OS, dándote la opción de elegir entre un modo invitado o residente.

El modo invitado te permite probar el sistema operativo sin compromiso, pero no guardará tu información y aplicaciones cuando termines de usarlo. El modo residente sí guarda esta información.

Yo he elegido modo Residente, lo cual inicia la instalación que, una vez más, tomará unos cuantos minutos. Ten paciencia, ya estás muy cerca de poder probar esta curiosa versión de Android.

6. Configura Remix OS

Enhorabuena, ya tienes Remix OS listo para usar, pero antes de nada, al igual que cuando inicias Android por primera vez en un teléfono, tienes que establecer unos cuantos ajustes.

Lo primero es el idioma (inglés o chino), después tendrás el acuerdo de licencia de rigor y, por último, pulsando el botón Start ya podrás empezar a usar Remix OS 2.0 en tu PC.

Como eliminar las pestañas en productos en Woocommerce

Uno de los más habituales requerimientos de clientes a la hora de diseñar la página de producto de su tienda online en Woocommerce suele ser la eliminación de las pestañas de comentarios y características, principalmente por un motivo de usabilidad.

Para eliminar las pestañas podemos utilizar el siguiente código en el functions.php de tu plantilla:

/**
 * Eliminar pestañas de productos
 */
add_filter( 'woocommerce_product_tabs', 'woo_remove_product_tabs', 98 );

function woo_remove_product_tabs( $tabs ) {

    unset( $tabs['description'] );      	// Remove the description tab
    unset( $tabs['reviews'] ); 			// Remove the reviews tab
    unset( $tabs['additional_information'] );  	// Remove the additional information tab

    return $tabs;
}

El problema es que nos falta la descripción larga del producto. Para afinar aún más la plantilla se puede usar el siguiente código para mostrar la descripción. El número indica la posición entre los elementos

//** Mostrar la descripción del producto sin pestañas **//

function woocommerce_template_product_description() {
  wc_get_template( 'single-product/tabs/description.php' );
}
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_product_description', 30 );
tag manager

Que es y para que sirve Google Tag Manager

A estas alturas, casi todos habréis oído hablar alguna vez del administrador de etiquetas de Google  (o Google Tag Manager). Quizá tengáis claro en qué consiste… o quizá no.

En este post pretendemos asentar algunas ideas básicas sobre qué es y para qué se utiliza esta estupenda herramienta que, a la larga, cambiará nuestra forma de implementar, por ejemplo, los seguimientos de Google Analytics, píxeles de conversión de Google AdWords, o de trackear todo tipo de campañas de publicidad online.

De este modo, se modificará para siempre la relación entre departamentos de IT y Marketing de grandes empresas (agilizando procesos como el lanzamiento de nuevas campañas publicitarias); y se simplificará la vida de agencias de Marketing Online a la hora de realizar el mantenimiento de códigos de seguimiento y píxeles variados en numerosos sitios webs.

¿En qué consiste Tag Manager?

Se trata de un código <script> que genera un iframe contenedor que, al ser colocado justo tras la apertura del <body> en una página web, reemplazará la mayoría de las etiquetas de seguimiento de campañas y herramientas que antes solíamos instalar una a una. Por ejemplo, para realizar una correcta medición de campañas SEM, para instalar herramientas de analítica web o para A/B testing.

Para configurar el contenedor e indicar qué etiquetas queremos que se activen y en qué páginas, hemos de acceder a la herramienta online Google Tag Manager . Su interfaz ha mejorado bastante con los cambios sucesivos, asemejándose a otras herramientas de Google. Aún así, si tenemos en cuenta la complejidad de la materia que estamos tratando y los enormes beneficios que aportará su comprensión, resulta lógico tener que formarse un poco para llegar a manejarla y exprimirla del todo.

¿Para qué sirve el Administrador de Etiquetas de Google?

¿Nunca os ha pasado que queréis lanzar una campaña de anuncios patrocinados o remarketing y desde vuestro departamento de programación os comunican que no es posible hasta tal día que se sube la web a producción? O, en el caso de las agencias, ¿no sentís que tenéis dependencia de vuestros proveedores de desarrollo web para implementar ciertas tags en el código fuente? ¿No os gustaría poder tener el control, un contenedor para gobernarlos a todos? Si la respuesta a alguna de esas preguntas es que sí, estáis de enhorabuena.

Con Google Tag Manager, en lugar de tener que andar modificando código en diferentes páginas o includes, para insertar una nueva tag, o tener que estar revisando una lista interminable de archivos para ver dónde están puestas ciertas etiquetas que toca eliminar, bastará con consultar un panel de administración y trabajar con etiquetas, activadores y variables.

En la imagen anterior se muestran algunas de las plantillas de etiqueta disponibles en Google Tag Manager, como ejemplo, pero existen otras muchas utilidades de Tag Manager que ayudarán a simplificar y automatizar procesos de marketing. Estos son algunos ejemplos de etiquetas aceptadas actualmente, que te pueden sacar de un apuro:

  • Seguimiento de conversiones de Google AdWords (¡también sin thank you page!) y configuración de conversiones de llamada (número de reenvío de AdWords).
  • Etiquetas de Remarketing de AdWords y Remarketing Dinámico: hace mucho tiempo había que ir página a página —o por grupos de contenido— introduciendo manualmente las diferentes etiquetas de remarketing de Google para las diferentes listas de usuarios (¡increíble pero cierto!). Nuestra teoría es que el desarrollo de Google Tag Manager, aparte de la utilidad que nos aporta a todas las agencias y departamentos de marketing, fue en parte respuesta de Google a la necesidad de tener una etiqueta de remarketing dinámica (otros ya la tenían antes que él).
  • Seguimiento de Google Analytics, con todo tipo de implementaciones avanzadas al alcance de la mano, minimizando la utilización de código al mínimo y necesario —la dataLayer—. Podrás utilizar GTM para generar de eventos automáticos de clic, formulario, temporizador, etc., páginas virtuales, seguimiento de e-commerce, seguimiento de subdominios y multidominio, user ID, agrupaciones de contenido, dimensiones y métricas personalizadas…
  • ¡Traffickers! Etiquetas de conversión y de contador de DoubleClick, Marin Software, ClickTale, comScore
  • Etiquetas de imagen y HTML personalizadas: este último punto abre un mundo de posibilidades casi infinito, a excepción de unas pocas etiquetas (síncronas, en dos partes, etc.) que no se pueden utilizar y que tienden a desaparecer…

Eliminar correo antiguo de tu servidor con Cpanel

En ocasiones querremos eliminar correos antiguos porque ocupan espacio y no los necesitamos, de una cuenta determinada, desde una fecha determinada en adelante o simplemente porque necesitamos espacio libre en nuestro hosting.

Para ello el hosting cPanel prevé una opción muy útil en la sección de «Correo Electrónico» denominada «Email Disk Usage» para no llegar al límite de espacio que tenemos en el disco duro.

Accediendo a la opción de cPanel – Email Disk Usage

Accedemos al panel de control cpanel y buscamos la opción:

Selección de cuentas de correo

Al acceder observamos un desplegable «Account» que contiene todas las cuentas de correo electrónico que hemos creado y desde seleccionaremos cuenta por cuenta para eliminar los emails que deseamos desechar.

Menú de Acciones

Nada más seleccionar una de las cuentas nos encontraremos con una pantalla similar a la siguiente:

Cada carpeta, ya sea la del INBOX (Bandeja de entrada), TRASH (Papelera), SENT (Enviados) o DRAFTS (Borradores), etc. dispondrán de un enlace «Manage» en la columna «Acciones» siempre y cuando haya correos en ellas.

Haz clic en «Manage» para hacer visible un nuevo desplegable desde el que seleccionar la acción deseada:

Eliminación de mensajes de email

Si queremos eliminar todos los correos, simplemente usaremos la opción «All messages» y pulsaremos sobre el botón «Delete Permanently» (Borrar permanentemente).
Por el contrario si deseamos usar un filtro concreto para eliminar correos seleccionaremos la opción «Custom query» (Consulta personalizada) y se abrirá un nuevo campo para introducir la consulta como se muestra en la captura de abajo:

http2

HTPP/2 y WordPress

¿Por qué es mejor HTTP/2?

Esta nueva versión del protocolo de comunicación web implementa ciertos cambios que permiten que la comunicación sea más rápida. Por ejemplo, en vez de crear una conexión distinta para enviar cada componente de un sitio (como se hace con HTTP/1.1), en el nuevo modelo se crea una sola conexión para enviar toda la información. Esto es importante porque cada página puede incluir objetos HTML, CSS, JavaScript, imágenes, video, animaciones o aplicaciones enteras, y requiere más trabajo administrar más conexiones.

Otro cambio importante en HTTP/2 es el uso de compresión, que simplemente evita enviar datos repetidos durante la conexión, para así, enviar menos datos en total. Es importante además mencionar que en HTTP/2 la información se envía en binario, que es el lenguaje nativo de los ordenadores, al contrario de en texto, que usamos los humanos. Al tener que «traducir» menos, el ordenador puede funcionar más rápido.

¿Cómo saber si tu sitio web usa HTTP/2?

Hay decenas de páginas en internet para comprobarlo. Puedes recurrir por ejemplo a http2.pro. Sólo tienes que introducir el nombre de dominio de tu sitio web y te dirá el resultado.

Si tu página usa HTTP/2, felicidades, estás contribuyendo a una internet más rápida y eficiente. Si tu servidor aún usa HTTP/1.1 podrías tener una página más rápida, e incluso mejor posicionada en Google.

¿Cómo habilitar HTTP/2 en tu sitio web?

Es una cuestión de software, del tipo y versión de aplicación usada para servir las páginas web. Lo primero es consultarlo con tu proveedor y solicitar la actualización de tu hosting o servidor para emplear HTTP/2.

En ocasiones será posible hacerlo y tu proveedor se encargará de ello. En otras ocasiones, debido a las características del producto contratado o de la máquina en sí, no será posible. La solución pasará por trasladar tu sitio web a otro servidor más actualizado con soporte HTTP/2.

¿Qué pasa con HTTP/2 para WordPress?

En pocas palabras, HTTP/2 es independiente de WordPress o cualquier otro CMS que esté utilizando. Dado que esto es algo que se implementa a nivel del servidor web, es algo que está «más bajo» en la pila que su sitio web de WordPress.

Por otra parte, hay cosas específicas que puedes hacer para WordPress.

Una de las mejoras que mencionamos sobre HTTP2 es la implementación de un mecanismo llamado Server Push. Esto requiere sugerencias u orientación por parte del CMS que se está utilizando.

Para WordPress, el plugin HTTP/2 Server Push WordPress permite a los administradores del sitio sugerir qué recursos pueden ser «empujados por el servidor». Lo que esto hace es agregar el soporte necesario para enviar cada secuencia de comandos y archivo de estilo en cola.

Esto significa que los archivos JS y CSS que utilizan el mecanismo de puesta en cola de WordPress pueden enviarse del servidor web al navegador, aprovechando al máximo las técnicas de optimización HTTP/2.