Coloreando fotos y videos en blanco y negro con inteligencia artificial

Hace unas semanas empecé a experimentar con cargas de trabajo procesadas por GPUs y me encontré un proyecto en Github que te permite colorear y restaurar audio y video.

Tengo unas fotos familiares que me gustaría restaurar; en este post voy a documentar el proceso de configurar una instancia de AWS e instalar DeOldify para restaurarlas.

Decidí utilizar AWS porque estoy esperando que todo el proceso tome un par de horas y el costo por instancia g4dn.xlarge es de $0.63 USD por hora. Tengo un equipo con GPU pero para este experimento prefiero pagar los gastos de AWS que pasar un rato configurándolo.

Voy a usar una instancia g4dn.xlarge que ofrece 4 vCPUs de un procesador Intel Xeon P-8259L a 2.5GHz, 16GB de memoria RAM y un GPU NVIDIA T4. Por simplicidad voy a usar Ubuntu 18.04 LTS.

Instalando los drivers de NVIDIA

Decidí usar la imagen de Ubuntu 18.04 que no tiene los drivers de NVIDIA instalados por defecto para documentar los pasos de instalación, así cuando lo instale en mi equipo de pruebas ya tendré una guía para seguir. Para esto estoy siguiendo los pasos descritos en el sitio oficial de NVIDIA.

Nos podríamos saltar los pasos de esta sección si usamos una de sus imágenes de Deep Learning de AWS al crear la máquina virtual.

Instalamos las cabeceras del kernel y los paquetes de desarrollo.

$ sudo apt-get install linux-headers-$(uname -r)

Nos aseguramos que los paquetes de la red de CUDA tienen prioridad sobre el repositorio de Canonical e instalamos la llave GPG de repositorio.

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
$ wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-$distribution.pin
$ sudo mv cuda-$distribution.pin /etc/apt/preferences.d/cuda-repository-pin-600

Configuramos el repositorio de CUDA.

$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub
$ echo "deb http://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list

Instalamos los drivers de CUDA.

$ sudo apt-get update
$ sudo apt-get -y install cuda-drivers

Reiniciamos y validamos que el driver esté cargado.

$ sudo reboot
# Después de reiniciar
$ cat /proc/driver/nvidia/version

# La salida se verá algo así
NVRM version: NVIDIA UNIX x86_64 Kernel Module  450.36.06  Mon Jun  1 23:19:54 UTC 2020
GCC version:  gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

Instalando docker y nvidia-docker

El proyecto de DeOldify corre en Docker y requiere de nvidia-docker que es un toolkit para usar y correr contenedores Docker acelerados por GPU.

Instalamos docker.

$ sudo apt install docker.io

# Habilitamos el servicio y lo configuramos para que corra en el arranque de sistema
$ sudo systemctl start docker
$ sudo systemctl enable docker

Instalamos nvidia-docker.

# Instalamos el repositorio para nvidia-docker
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \ 
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update

# Instalamos el paquete
$ sudo apt-get install nvidia-docker2
# Matamos el proceso actual de docker para forzar a que se reinicie
$ sudo pkill -SIGHUP dockerd

Instalar DeOldify

Ahora que tenemos las dependencias necesarias podemos pasar a instalar DeOldify con las instrucciones de su repositorio.

# Clonamos el repositorio
$ git clone https://github.com/jantic/DeOldify.git DeOldify

# Hacemos build con docker (este paso genera una imagen de ~8GB)
$ cd DeOldify && sudo docker build -t deoldify_api -f Dockerfile-api .

# Inicamos el contenedor para exponer un endpoint
$ echo "http://$(curl ifconfig.io):5000" && nvidia-docker run --ipc=host -p 5000:5000 -d deoldify_api

NOTA: Al correr el contenedor en modo API no hace uso del GPU por defecto, hay que agregar las siguientes líneas en los imports de `api.py` para que haga uso del GPU.

from deoldify import device
from deoldify.device_id import DeviceId
device.set(device=DeviceId.GPU0)

¡A colorear fotos!

Ya que todo está corriendo como lo esperamos, podemos usar la URL regresada por el último comando de la instalación de DeOldify para procesar las fotos.

Desde la terminal puedo llamar con curl la API que expone el contenedor de DeOldify.

$ curl -X POST "http:/{IP_SERVIDOR}:5000/process" -H "accept: image/png" -H "Content-Type: application/json" -d "{\"source_url\":\"https://{IMAGEN_A_PROCESAR}\", \"render_factor\":35}" --output output.png 

Convertí 29 fotos y el tiempo de respuesta fue entre 1 y 7 segundos por foto (entre 10 y 38 segundos en CPU). En algunos casos tuve que ajustar el valor de `render_factor` para mejorar los resultados; conforme se incrementa este valor el uso de memoria y tiempo de procesamiento aumenta.

Original

Coloreada

Coloreando videos

Es posible también utilizar el mismo paquete para colorear videos, en este caso, aunque no es requerido, es importante utilizar el GPU, de lo contrario tomaría bastante tiempo en completar.

Es necesario hacer los siguientes cambios menores al paquete y generar una nueva imagen para docker (ambos contenedores pueden estar corriendo al mismo tiempo).

Primero vamos a agregar las siguientes cabeceras al archivo api-video.py.

from deoldify import device
from deoldify.device_id import DeviceId
device.set(device=DeviceId.GPU0)

Hacemos una copia del archivo Dockerfile-api en Dockerfile-apivideo y cambiamos la última línea de CMD ["app.py"] a CMD ["app-video.py"].

Después dentro del directorio DeOldify corremos el siguiente comando para generar la imagen nueva.

$ sudo docker build -t deoldify_api_video -f Dockerfile-apivideo .

Y una vez que termine iniciamos otro contenedor, esta vez utilizando el puerto 5001 en caso de que queramos tener ambos corriendo al mismo tiempo.

$ echo "http://$(curl ifconfig.io):5001" && nvidia-docker run --ipc=host -p 5001:5000 -d deoldify_api_video

Ahora sí, podemos llamar la API.

$ curl -X POST "http:/{IP_SERVIDOR}:5001/process" -H "accept: application/octet-stream" -H "Content-Type: application/json" -d "{\"source_url\":\"https://{VIDEO_A_PROCESAR}\", \"render_factor\":35}" --output output.mp4 

Hice una prueba con un video que publicaron en Reddit de 10:09 minutos de duración y tomó 1:41 horas en procesar. Si hubiera decidido procesar esto con el CPU, según mis cuentas de servilleta, hubiera tomado 76:13 horas. Este fue el resultado:

 

 

Los resultados de las fotos y video son mucho mejor de lo que esperaba y una vez configurado el contenedor no es necesario hacer ningún ajuste. Voy a instalarlo en mi equipo de pruebas local para implementar un par de mejoras a la API, y probablemente luego me aventure a entrenar un modelo con otros videos.

Jugando en la nube con AWS

Ahora que se acerca la fecha de lanzamiento de Microsoft Flight Simulator 2020 le he estado dando vueltas a la idea de armar una PC gamer. Me hubiera encantado la idea que hubieran lanzado el juego durante el distanciamiento social por COVID-19, así solamente me tendría que aislar una vez este año.

Antes de armar la nueva PC me gustaría poder evaluar los juegos que me interesan para ver si vale la pena la inversión y no hacer un gasto en algo que no voy a usar.

Tengo una Macbook Pro con características muy decentes pero la mayoría de los juegos que me interesan son para Windows (y no quiero tener dual boot) y me interesa tener un GPU NVIDIA para poder correr aplicaciones aceleradas por CUDA (actualmente uso máquinas virtuales en AWS para eso).

Aprovechando que tengo una conexión estable a internet y con buena velocidad (200 Mbps simétricos) quiero experimentar configurando una máquina virtual con GPU en AWS e intentar jugar desde ahí.

Voy a crear la máquina virtual en la región US-West-1 que se encuentra al norte de California porque es la que tengo más cerca físicamente (estoy viviendo en el área de la bahía de San Francisco) y la latencia de la conexión de mi departamento a esa región es bastante decente.

Captura tomada de https://www.cloudping.info/

Para esta prueba voy a crear una instancia con g4dn.2xlarge usando la imagen oficial de Windows Server 2019 Base. Esta configuración tiene un costo de $1.27 dólares por hora de uso con estas características:

  • 8 vCPUS de Intel Xeon P-8259L 2.5 GHz
  • 32 GB de RAM
  • 225 GB SSD NVME (efímero, cada vez que se detiene la máquina virtual se pierde)
  • Tarjeta de video NVIDIA T4 (2,560 cores y 16 GB DDR6 RAM)

Lo único que cambiaría de esa configuración sería la velocidad del procesador, si bien el que utiliza esta instancia tiene la capacidad de incrementar la velocidad del core hasta 3.9 GHz, Amazon lo tiene limitado a 2.5Ghz.

Una vez que está lista la máquina, me voy a conectar por RDP usando Microsoft Remote Desktop e instalar Google Chrome usando este snippet en PowerShell:

$Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "http://dl.google.com/chrome/install/latest/chrome_installer.exe" -OutFile $Path\$Installer; Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path\$Installer

Después es necesario descargar los drivers de gaming de NVIDIA corriendo el siguiente comando en PowerShell:

$Bucket = "nvidia-gaming"
$KeyPrefix = "windows/latest"
$LocalPath = "$home\Desktop\NVIDIA"
$Objects = Get-S3Object -BucketName $Bucket -KeyPrefix $KeyPrefix -Region us-east-1
foreach ($Object in $Objects) {
    $LocalFileName = $Object.Key
    if ($LocalFileName -ne '' -and $Object.Size -ne 0) {
        $LocalFilePath = Join-Path $LocalPath $LocalFileName
        Copy-S3Object -BucketName $Bucket -Key $Object.Key -LocalFile $LocalFilePath -Region us-east-1
    }
}

Para que funcione correctamente es necesario tener configuradas las herramientas de AWS para PowerShell.

Una vez que se completa la ejecución del comando, estará una carpeta llamada NVIDIA en el escritorio y contiene los drivers a instalar. Hay que seleccionar la versión correcta de acuerdo a la versión de Windows que esté corriendo la máquina virtual e instalarlo.

Después hay que correr este comando en PowerShell para crear la configuración requerida:

New-ItemProperty -Path "HKLM:\SOFTWARE\NVIDIA Corporation\Global" -Name "vGamingMarketplace" -PropertyType "DWord" -Value "2"

Finalmente hay que descargar la licencia de NVIDIA y reiniciar para que los cambios tomen efecto.

Invoke-WebRequest -Uri "https://nvidia-gaming.s3.amazonaws.com/GridSwCert-Archive/GridSwCert-Windows_2020_04.cert" -OutFile "$Env:PUBLIC\Documents\GridSwCert.txt"

Para poder utilizar el disco efímero (si no te importa perder los datos que estén ahí cada vez que detengas la máquina virtual) es necesario formatearlo utilizando la herramienta Disk Management de Windows.

Ahora que está todo listo puedo instalar Steam y descargar algun juego para hacer pruebas.

Una de las ventajas de usar la infraestructura de Amazon es la velocidad de internet, esta instancia en particular tiene una conexión de hasta 25 Gbps.

Descargando a ~600 Mbps

Instalé Shadow of the Tomb Raider para tenerlo como punto de referencia y al correr el benchmark con gráficos en configuración alta da entre 70 y 90 fps a 2560×1440.

Noté en el uso de recursos que mientras se está jugando utiliza aproximadamente 30 Mbps de la conexión. El uso de GPU y procesadores (en general) es relativamente bajo pero se podría beneficiar de una velocidad más alta del procesador (uno de los núcleos se utiliza al 100%), mi próxima prueba será con la instancia g3.4xlarge que usa un procesador E5-2686 v4 a 2.7 GHz, si bien es una generación anterior es probable que la velocidad del reloj haga diferencia.

En cuanto a la experiencia de juego, no noté ningún retraso significativo (a pesar de estar conectado por un cliente RDP), después de jugar un rato hice una prueba para ver la latencia de la conexión entre mi equipo y el servidor virtual.

? ~ ping 18.144.55.16
PING 18.144.55.16 (18.144.55.16): 56 data bytes
64 bytes from 18.144.55.16: icmp_seq=0 ttl=114 time=4.311 ms
64 bytes from 18.144.55.16: icmp_seq=1 ttl=114 time=4.679 ms
64 bytes from 18.144.55.16: icmp_seq=2 ttl=114 time=4.307 ms
64 bytes from 18.144.55.16: icmp_seq=3 ttl=114 time=6.639 ms
^C
--- 18.144.55.16 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.307/4.984/6.639/0.967 ms

El costo total por hora de juego llega a $2.485, de los cuales $1.215 es por la transferencia de datos (13.5 GB/hora) y $1.27 por la maquina virtual.

Por el costo por hora, experiencia de juego y facilidad de uso creo que es una solución bastante aceptable para probar un juego antes de hacer una inversión considerable en un PC gamer.

Definitivamente esta es la opción que voy a usar para probar Microsoft Flight Simulator 2020 una vez que esté disponible.

Utilizando unraid para almacenamiento en red

Necesitaba una forma para guardar respaldos de seguridad de mis sitios web y NAS (que a su vez lo utilizo como respaldo de mi equipo de cómputo, correo, código, etc.). La idea es para seguir la estrategia 3-2-1: tres copias de seguridad, dos en diferentes dispositivos y una en diferente ubicación. Debe tener capacidad de crecimiento para reducir el monto de inversión inicial y poder acomodar aproximadamente 2 TB mensuales de información nueva.

La velocidad y desempeño no son puntos importantes ya que muy rara vez necesito consultar la información almacenada y estará conectado a otros equipos por medio de Gigabit Ethernet.

No necesito que el sistema sea de alta disponibilidad ya que tengo flexibilidad para realizar respaldos y puedo manejar sin ningún problema periodos offline para reemplazar hardware o mantenimiento en caso de ser necesario.

El hardware

Hace unos meses conseguí un Storage Pod 3.0 de Backblaze con capacidad de 45 discos duros y por fin me di el tiempo de darle uso.

El pod venía con un procesador Core i3-2100 que no tiene soporte para RAM ECC ni viene con las instrucciones AES que necesito para mantener integridad de datos y cifrar los datos en reposo. Para esto lo reemplacé por un procesador E3-1220 v2 y cambié la memoria por 16GB ECC.

Una vez que esté utilizando la capacidad total del procesador y/o RAM cambiaré por algo más moderno, de mayor capacidad y conectaré los discos directamente a la tarjeta madre porque la configuración actual utiliza multiplicadores de puertos que dividen el ancho de banda de cada puerto SATA en cinco.

El software

Mi plan inicial era utilizar Freenas que utiliza ZFS pero desafortunadamente aún no se puede extender un zpool y uno de mis requerimientos principales es poder crecer el espacio conforme lo vaya necesitando.

Por ahora voy a utilizar Unraid por la habilidad de expandir el almacenamiento conforme lo necesite (solo agregas el disco duro nuevo y listo) y porque no necesito el rendimiento que puedo obtener en otras soluciones (como RAID 5/10 o ZFS.)

Las funcionalidades disponibles en unraid son inferiores a las de freenas pero esto lo voy a mitigar usando contenedores Docker o máquinas virtuales con las aplicaciones que necesite correr.

Los discos duros

Debido a que por ahora necesito 12 TB de almacenamiento voy a utilizar 3 discos duros IronWolf 6 TB y uno de 4 TB que tenía de sobra de un proyecto reciente. Uno de ellos será utilizado como disco de paridad dejando un espacio total utilizable de 16 TB.

Para el caché pedí un SSD Samsung de 500GB que soporta 300 TBW pero utilizaré un SSD Intel de 240 GB en lo que llega.

Una vez que agregue más discos voy a agregar un disco de paridad adicional, de esa forma podrán fallar hasta dos discos duros de forma simultánea sin perder información.

La configuración actual me permite expandir a ~200 TB. Con la fuente de poder actual no podría llenar las 45 ranuras porque los discos que estoy utilizando consumen más recursos que para los que fue diseñado inicialmente.

La instalación

La instalación es bastante sencilla y solo es necesario seguir los pasos de la documentación de unraid. Algo que me parece excelente es que no requiere un disco de arranque, basta con usar una memoria USB.

Además de aislar el dispositivo en la red seguí una lista de recomendaciones de seguridad que encontré en internet.

El pod tiene dos puertos Gigabit Ethernet disponibles y están configurados en modo agregación de enlaces para maximizar el tráfico simultáneo que puede haber entre varios dispositivos y este servidor.

Después de instalar los discos, tardó 13 horas y 16 minutos en hacer la sincronización con el disco de paridad a una velocidad promedio de 125.6 MB/s.

Instalé contenedores docker para utilizarlos como servidores rsync y programadores de tareas de respaldo.

Configuré un share para cada uno de los diferentes sistemas que necesito respaldar y en su mayoría configuré que no utilizaran el disco caché para evitar que el SSD se degrade pronto y sobre todo porque la velocidad de escritura directa al disco sigue siendo mayor que la cantidad de información que puedo enviar por el enlace de red.

Por ahora voy a empezar a configurar los clientes para que empiecen a enviar la información al pod y veré cómo progresa.

Cobrar con Banorte Payworks en OpenCart

OpenCart es una plataforma de comercio open source desarrollada en PHP; es relativamente sencillo de operar comparado con otras plataformas más complejas.

A petición de un cliente, desarrollé el módulo para recibir pagos por medio de Banorte Payworks 2. Al igual que mis otros módulos, lo ofreceré bajo el esquema de licenciamiento.

El módulo funciona con la versión de Payworks Hosted y Tradicional; próximamente publicaré las diferencias de estas dos versiones para los que no estén familiarizados con los conceptos.

Si te interesa adquirirlo puedes utilizar este enlace o puedes escribirme desde la sección de contacto si tienes más dudas.

Cobrar con Banorte Payworks en WooCommerce

Debido al incremento de la popularidad de WooCommerce –de acuerdo a BuiltWith el 42% de los sitios de comercio electrónico utilizan esta plataforma– decidí desarrollar un módulo que permita cobrar desde esta plataforma usando Banorte Payworks.

Banorte Payworks es una muy buena alternativa para cobrar por internet pero no hay mucha información para implementarlo y los costos de desarrollarlo in-house suelen ser altos.

El módulo para WordPress habilita el método de pago de Banorte Payworks 2.0 en WooCommerce;  cuenta con soporte para 3D Secure y pagos en parcialidades (mensualidades sin intereses).

El módulo se puede adquirir en linea utilizando este enlace.

Agregar estados de México a Magento

Magento por defecto solo tiene los estados de un par de países. En el caso de México al seleccionar el país nos muestra un campo de texto libre en lugar de un desplegable como lo hace con Estados Unidos.

Para mostrar una lista desplegable en lugar del campo de texto basta con insertar los estados en la base de datos. Puedes utilizar el snippet que hice; usa los códigos de subdivisión del ISO 3166-2:MX.

-- Los códigos de estado corresponden al estándar ISO 3166-2:MX
-- Deberás cambiar el nombre de la tabla si estás utilizando un prefijo
INSERT INTO  `directory_country_region` (`country_id`, `code` , `default_name`)
VALUES
	('MX', 'AGU', 'Aguascalientes'),
	('MX', 'BCN', 'Baja California'),
	('MX', 'BCS', 'Baja California Sur'),
	('MX', 'CAM', 'Campeche'),
	('MX', 'CHP', 'Chiapas'),
	('MX', 'CHH', 'Chihuahua'),
	('MX', 'COA', 'Coahuila'),
	('MX', 'COL', 'Colima'),
	('MX', 'DIF', 'Distrito Federal'),
	('MX', 'DUR', 'Durango'),
	('MX', 'GUA', 'Guanajuato'),
	('MX', 'GRO', 'Guerrero'),
	('MX', 'HID', 'Hidalgo'),
	('MX', 'JAL', 'Jalisco'),
	('MX', 'MEX', 'Estado de México'),
	('MX', 'MIC', 'Michoacán'),
	('MX', 'MOR', 'Morelos'),
	('MX', 'NAY', 'Nayarit'),
	('MX', 'NLE', 'Nuevo León'),
	('MX', 'OAX', 'Oaxaca'),
	('MX', 'PUE', 'Puebla'),
	('MX', 'QUE', 'Querétaro'),
	('MX', 'ROO', 'Quintana Roo'),
	('MX', 'SLP', 'San Luis Potosí'),
	('MX', 'SIN', 'Sinaloa'),
	('MX', 'SON', 'Sonora'),
	('MX', 'TAB', 'Tabasco'),
	('MX', 'TAM', 'Tamaulipas'),
	('MX', 'TLA', 'Tlaxcala'),
	('MX', 'VER', 'Veracruz'),
	('MX', 'YUC', 'Yucatán'),
	('MX', 'ZAC', 'Zacatecas');

Y listo, a partir de este momento al seleccionar México en cualquier desplegable de la tienda mostrará la lista de estados en lugar del campo de texto.

Captura de pantalla 2016-05-02 a las 8.27.59 p.m.

Cobrar por internet en México v2

En el 2012, cuando apenas había un par de opciones para procesar pagos con tarjetas bancarias por internet, escribí un artículo con un comparativo de un par de soluciones que conocía. Ahora hay mucha más oferta y las soluciones son mucho más completas.

Frecuentemente clientes me preguntan sobre estas soluciones, así que decidí hacer un comparativo para poder proporcionar información más completa que la que puedo dar en una llamada.

Conekta Openpay Banwire Banorte Payworks Paypal
Comisión fija $2.5 a $12 $2.5 a $8 $2.5+ $0 $4
Comisión variable 2.9% a 4.5% 2.9% a 4.5% 2.9% a 4.9% 1.15% a 3.4% 2.95% a 5%
Depósito de fondos 3 a 8 días hábiles Una vez por semana Martes y viernes Día hábil siguiente Instantáneos. 4 a 6 días para transferir al banco
Tiempo de contratación 2 días hábiles. Variable 3 días hábiles. Variable 1 semana. Variable 15 a 30 días. Variable Instantáneo
Visa y Mastercard
American Express No
Pagos en ventanilla Solo Banorte No No Solo Banorte. Conciliación manual No
Transferencias SPEI Conciliación manual Solo para fondear
Tiendas de conveniencia OXXO 7 Eleven y 18 marcas más OXXO No No

Conekta

Recientemente ha ido ganando más terreno y considero que es una de las empresas que ha realizado la mejor ejecución en el área de pagos.

Cuenta con excelente documentación para desarrolladores y plugins para E-Commerce que facilitan bastante la integración a la plataforma.

Openpay

También han tenido excelente ejecución y comisiones casi idénticas a las de Conekta. Lo interesante de Openpay es que te permite transferir los fondos a diferentes cuentas (ideal para marketplaces) mientras que las otras opciones solo transfieren a la cuenta del comercio.

Anteriormente Openpay aceptaba Bitcoin como método de pago pero al momento de escribir este artículo no pude encontrar referencia en su sitio web.

Banwire

Banwire lleva un par de años en el mercado de los pagos en línea pero su ejecución no ha sido tan buena, especialmente en la documentación para desarrollo y las integraciones que ofrecen (cobran por utilizar sus módulos).

He escuchado de clientes que los porcentajes de contracargos son muy altos y el proceso para disputarlo no es muy eficiente.

Banorte Payworks

Comparando Banorte Payworks con otras soluciones en un poco difícil de contratar y el proceso puede tardar un par de semanas. Ofrecen documentación muy completa para realizar la integración pero no tienen plugins para E-Commerce desarrollados por lo que le agrega un costo adicional al cliente.

Dependiendo el giro del negocio puede obtener significativos ahorros en comisiones, sobre todo en función al volumen.

Payworks requiere el uso de 3D Secure con la finalidad de reducir los contracargos y los riesgos en las transacciones; pero esto daña la experiencia de usuario.

Paypal

Esta opción la recomiendo únicamente como alternativa de pago pues los usuarios no siempre están familiarizados con la plataforma y se pueden abrumar con el proceso.

Por otro lado tienen muchísimas integraciones y buena documentación para desarrolladores.

Es buena opción para los usuarios que ya tienen cuenta pero las comisiones son más altas que todas las otras alternativas.

Otras opciones

Existen otras alternativas en el mercado como PayU y Pagofacil pero no he tenido la oportunidad e integrarlos en algún proyecto.

Payworks 2, 3D Secure, Cybersource y Magento

Recientemente Banorte ha empezado a migrar a los usuarios de Payworks 1 a la nueva versión de la plataforma Payworks 2 y ha empezado a solicitar a todas las nuevas afiliaciones (salvo algunas excepciones) el uso de 3D Secure; y en algunos casos la integración de Cybersource para el calculo de riesgo.

La ventaja de tener esta combinación de herramientas es la reducción de contracargos y mejora en la experiencia de usuario ya que solo serán enviados a 3D Secure los usuarios que no pasen la validación de Cybersource.

Recientemente actualicé el módulo de Magento que había desarrollado para Payworks para integrar los nuevos cambios a la plataforma de Payworks y la integración de Cybersource. Este módulo ya está siendo usado por algunos clientes y ha sido certificado por parte de Banorte.

El módulo se puede adquirir en linea utilizando este link.

Módulo de Banwire API-JS para Magento

Después de varias peticiones, programé el módulo de Banwire con la API de JavaScript para Magento. El módulo permite recibir pagos por medio de OXXO, SPEI y todas las tarjetas de crédito soportadas por Banwire.

Captura_de_pantalla_2014-09-04_a_la_s__12_12_48

Todo el proceso de compra ocurre en la página del comercio y envía los datos personales a Banwire para que el usuario no los tenga que capturar de nuevo.

La ventaja de este módulo sobre el anterior (además de agregar OXXO y SPEI), es que el comercio no requiere tener certificado SSL pues todo el procesamiento e ingreso de datos es en la interfaz de Banwire.

Los pagos realizados por medio de OXXO y SPEI son reflejados en el sistema automáticamente una vez que Banwire envía la notificación correspondiente.

Si alguien está interesado en adquirir el módulo, pueden hacerlo en este enlace. Si requieren factura fiscal, favor de realizar el pago por transferencia bancaria.