Funciones async en JavaScript

El comité TC39, encargado de la estandarización de ECMAScript (JavaScript para los amigos), incluyó en la versión ES2016/ES7 las llamadas Async Functions. Esta nueva característica, proveniente de C#, permite estructurar nuestro código asíncrono utilizando sintaxis del mundo síncrono, facilitando la manera en que pensamos el flujo de la aplicación.

Utilizando el caso de los llamados XHR vamos a mostrar la evolución en el trato del código asíncrono en JavaScript para llegar a esta nueva construcción llamada «Async Functions».

En el comienzo todo era callback

Hace mucho tiempo, en una galaxia muy muy lejana, la gente de Microsoft inventó una tecnología que luego se haría conocer como AJAX. Como los requests al servidor son muy lentos y el navegador solo permitía el uso de un thread para nuestro código (el mismo thread de UI), realizar un request xhr y esperar por la respuesta para seguir con el flujo de la app no es una opción ya que bloquearía el uso del resto de la aplicación para el usuario. Es por eso que cada vez que ejecutábamos/ejecutamos un request utilizando el objeto XMLHttpRequest pasamos una función (o más) a ejecutar cuando la respuesta es recibida.

Usando jQuery para el ejemplo, un pedido AJAX al servidor se ve así:

function pedirPartidos(competencia, success, error) {
  $.ajax({
    "url": "/api/partidos.json",
    "success": success,
    "error": error,
    "data": {
      "competencia": competencia      
    }
  });
}

function copaAmerica() {
  pedirPartidos('Copa America', function(data) {
    if(!data.juegaMessi) mostrarError(new Error('No se transmite'));
  }, mostrarError);
}

Este approach, que es el más utilizado hasta la actualidad, tiene algunos problemas. En principio el flujo de la función tiene ramas donde el órden de ejecución no se condice con el órden del código dentro de la misma. El programa va a ejecutarse en este órden:

  • Request a /api/partidos.json
  • Termina la ejecución de copaAmerica y el programa sigue ejecutando otras tareas y escuchando eventos.
  • Retorna el llamado a la función:
    1. Si el request fue exitoso se ejecuta la primera función pasada por parámetro y si todo está bien, luego se llama a prepararLaTele.
    2. Si falló el request se ejecuta la segunda función de error.

Por otra parte la función copaAmerica no puede retornar el valor de la data pedida al servidor ya que esta termina su ejecución antes de que el request pueda ser completado.

Además, si otro request depende de la respuesta del primero, tengo que llamarlo desde la función de callback, facilitando lo que se conoce como «callback hell».

Callback hell

Zona de promesas

Una respuesta a esta falta de estructura es la introducción de un objeto llamado «Promise» o (Promesa), con su implementación estrella Promises/A+. La idea de las promesas es mitigar algunos de los problemas de usar callbacks para operaciones async:

  1. Retorna un objeto que «promete» ser completado
  2. Hace uso de excepciones

Volviendo a nuestro ejemplo de la Copa América, podemos reescribirlo utilizando promesas. (Los métodos de AJAX de jQuery retornan promesas desde la versión 1.5).

function pedirPartidos(competencia) {
  return $.getJSON("/api/partidos.json", { "competencia": competencia });
}

function copaAmerica() {
  var promesaPartidos = pedirPartidos('Copa America')
  .then(function(data) {
    if(!data.juegaMessi) throw new Error('No se transmite');
    prepararLaTele(data, 'HD'); // Salió bien
  })
  .catch(function(error) {
    mostrarError(error);
  });

  return promesaPartidos;
}

En este caso vemos como las funciones ahora sí retornan valores, pudiendo pasar promesas entre secciones del programa. La función que llame a copaAmerica va a poder hacer uso de promesaPartidos y a la vez no es necesario el pasaje de callbacks entre funciones.

Otro punto de interés tiene que ver con la capacidad de las promesas de emitir errores y handlearlos. Esta es una mejora circunstancial respecto del uso de callbacks donde no es posible.

Promises/A+ fue incluido en el estándar de ES2015 (ES6), es decir que ya está en la última versión terminada del lenguaje y ya se puede usar en algunos navegadores sin la necesidad de librerías o polyfills.

Async/Await al rescate

Si bien las promesas ayudan en gran parte al problema del flujo de código asíncrono, no resuelven completamente, el mindset sigue siendo parecido al del uso de callbacks. Para mejorar la experiencia a la hora de desarrollar se va a incluir en el próximo estándar llamado ES2016, la estructura llamada «Async Functions». Gracias al uso de Promises y la introducción de generadores en el lenguaje, sumado a 2 nuevas keywords «async» y «await» podemos repensar como escribimos código async.

Nuevamente vamos a reescribir el ejemplo, ahora utilizando una función async:

function pedirPartidos(competencia) {
  return $.getJSON("/api/partidos.json", { "competencia": competencia });
}

async function copaAmerica() {
  try {
    var partidos = await pedirPartidos('Copa America');
    if(partidos.juegaMessi) throw new Error('No se transmite');
     prepararLaTele(data, 'HD'); // Salió bien
     return partidos;
  } catch(e) {
    mostrarError();
  }
}

Ahora sí, nuestro código tiene estructura de código síncrono y el valor de retorno de la función es simplemente la información que necesitamos y que puede ser recogida por otra función async. La estructura try/catch (de ES3) nos permite handlear errores sin necesidad de uso de estructuras ad-hoc.

¿Qué pasa si ahora quiero pedirle al servidor información de 2 competencias en paralelo y devolver cuando estén completas?

async function copaAmerica() {
  var partidos = await*([pedirPartidos('Copa América'), messi('Argentino B')]);
  console.log(partidos); // [{//data de copa america}, {//data de argentino b}]
}

Esta nueva estructura definitivamente nos permite pensar el código async como sync, simplemente utilizando funciones de tipo async.

Tengo que esperar hasta 2050?

No es necesario esperar a que los navegadores adopten esta feature para poder usarla hoy. De hecho si entran ahora al Panel de Control de Mango, van a ejecutarse requests utilizando esta técnica.

Gracias a transpilers como Babel pueden usar async/await en navegadores como IE8. En el caso de Babel, es necesario habilitar la transformación es7.asyncFunctions.

Otro caso de uso

Un caso de uso muy interesante es el uso de funciones async para el acceso a bases de datos en node.js.

El siguiente es un ejemplo, pidiendo prestadas las arrow functions de ES6 y utilizando express y el ORM Sequelize (que hace uso de promesas):

// antes
app.get('/partidos', (req, res) => {
  Partido.findAll({})
  .then(function(partidos){
    res.json(partidos);
  });
});

// usando async functions
app.get('/partidos', async (req, res) => res.json(await Partido.findAll({}) ));

Podemos concluir que esta nueva construcción nos permite creer que estamos ejecutando código de modo síncrono, pero como toda magia es solo una ilusión.

Cualquier duda/comentario o experiencias que quieran compartir, me pueden contactar vía Twitter a @impronunciable.

crowdfunding

¿Qué es crowdfunding?

Crowdfunding es un modelo muy popular de recolección de fondos e inversión colectiva. Funciona de la siguiente manera:

  • Una persona o una empresa presenta un proyecto y la inversión necesaria para poder hacerlo realidad.
  • El proyecto es presentado en un sitio web y la gente puede invertir lo que pueda/quiera para llegar colectivamente a financiar el proyecto.
  • Hasta que el objetivo económico no es conseguido, no se recolectan los fondos. Es decir: sólo si el proyecto llega a financiarse al 100% se les hace el cobro a las personas que invirtieron.

El proyecto puede ser absolutamente cualquier cosa. Desde vender un producto hasta donar agua potable en un país africano. Hay muchas plataformas que se dedican a proveer este servicio, entre las más conocidas: KickStarter, IndieGogo y CharityWater.

Estos modelos han probado ser muy exitosos. Las personas consiguen productos nuevos, que no tendrían la posibilidad de acceder, o donar colectivamente para una buena causa de forma muy fácil y accesible.

El medio de pago para invertir en los proyectos comúnmente es tarjeta de crédito.

El modelo de negocio de estas plataformas es muy simple: se quedan con un porcentaje de los fondos cuando el proyecto es exitoso y llega a su objetivo.

Crowdfunding en Argentina

En Argentina también hay plataformas de crowdfunding como por ejemplo Idea.me y PanalDeIdeas. No obstante, en comparación con el exterior, no sólo hay mucho menos oferta de cantidad de plataformas, sino también que la oferta provista no ha podido brindar un servicio de las mismas características al ofrecido en Estados Unidos. Esta imposibilidad se basa en tres pilares interconectados:

  • Tecnología de pago.
  • Bancarización de la sociedad.
  • Retenciones impositivas de tarjetas de crédito.

Dos de ellos no estando bajo el control de las plataformas.

Sin los 3 pilares funcionando al únisono, el éxito es difícil.

Tecnología de pago

Previamente al lanzamiento de plataformas de pago como Mango, no existía ningún servicio que tuviese la capacidad de almacenar los datos de tarjeta de crédito de forma segura y una vez llegado a un objetivo económico de un proyecto, realizar los cobros de todas las tarjetas al mismo tiempo. Con nuestra tecnología, hoy esto es posible.

Bancarización de la sociedad

Un gran sector de la sociedad -alrededor del 30%- sigue pagando servicios o bienes a través de internet con dinero en efectivo. La falta de bancarización es provocada por múltiples razones, como por ejemplo la desconfianza bancaria y el trabajo informal, entre otros.

Retenciones impositivas de tarjetas de crédito

Una empresa que cobra con tarjeta de crédito, obtiene «liquidaciones» periódicas en su cuenta bancaria por el total de ventas realizadas. Al realizar dicha liquidación, la tarjeta de crédito realiza una retención dinero a la empresa por varios conceptos:

  • 3% de comisión (modelo de negocio de las tarjetas).
  • Retenciones de IVA.
  • Retenciones de Ingresos Brutos.

Sobre-simplificando el concepto de retención: básicamente es un «impuesto por adelantado». En vez de pagar los impuestos a fin del ciclo correspondiente, el estado utiliza este modelo de retención para recaudar los impuestos de antemano.

Esto generalmente no es un problema, ya que esa retención se transforma en crédito fiscal después de cierto período de tiempo. Sin embargo, esto sí pasa a ser un problema en el modelo de «intermediario» implícito en plataformas de crowdfunding.

Imaginemos la situación en la que un proyecto tiene como objetivo 1 millón de pesos: la plataforma de crowdfunding recibirá retenciones impositivas por la totalidad de ese monto, cuando en realidad su ganancia es tan solo un porcentaje de esa cifra.

Esto significa, que emprendimientos pequeños de plataformas de crowdfunding, no tienen la espalda económica para sustentar la operación teniendo un «descalce» financiero. Tienen que tener una gran cantidad de fondos reservados para poder soportar la operación frente a todas estas retenciones.

¿Cómo intentan resolver hoy las plataformas de crowdfunding estas problemáticas?

Utilizando servicios terciarizados de cobro como MercadoPago o PayPal.

Ventajas:

  • Utilizan la espalda económica de un tercero.
  • No lidian con las retenciones impositivas de las tarjetas de crédito.
  • La tecnología no es difícil de implementar.
  • La forma de pago, sea cual sea, son las ofrecidas por dichos servicios.

Desventajas:

  • Cada persona o empresa que tiene un proyecto tiene que tener una cuenta en dichos servicios.
  • En el caso de PayPal, por regulaciones argentinas, a los pagos con tarjeta se les adiciona el 35%.
  • Los usuarios deben pagar por adelantado, sin importar si el proyecto llega a su objetivo o no.
  • Si el proyecto no alcanza su meta, se les devuelve el dinero, lo cual genera en un proceso administrativo tedioso para la compañía y gran frustración en los usuarios.

Conclusión

¿Es posible realizar crowdfunding en Argentina?
Sí, con varias limitaciones.

¿Que sería necesario para que este modelo crezca en el país?

  • Que surjan jugadores con la espalda económica suficiente para sobrellevar esta cuestión impositiva y que deje de ser un problema.
  • Que los players en la industria de pagos se sumen a la ola de innovación internacional, como ya lo han hecho en otros mercados del mundo, y generen un formato para estos nuevos modelos de negocio.
    Hoy es muy difícil que nazcan y crezcan proyectos basados en crowdfunding así como también con otros modelos de negocios en los que se necesita una figura de intermediario, debido a todas las dificultades mencionadas anteriormente.

Desde el punto de vista tecnológico (que es el que Mango puede solucionar), avanzamos con nuestra misión de poder solucionarle la problemática de los cobros con tarjeta de crédito online a las empresas y personas en múltiple países.

La tecnología está disponible 😉

creditcards

Mango es un servicio que permite procesar transacciones con tarjeta de crédito online.
Parte de nuestras tareas como compañía es auditar y mejorar la seguridad de nuestros clientes que venden productos o servicios a través de Internet.

Sin embargo, la seguridad o inseguridad, también puede venir de parte de los consumidores. Cada vez que una tarjeta es robada, tanto el dueño del plástico y los comercios se ven perjudicados.

En los últimos meses, hemos encontrando gran cantidad de fotos en internet de personas publicando sus tarjetas de crédito en sitios web o redes sociales. Lo peor de todo es que éstas publicaciones son 100% públicas, no es necesario ser amigo de la persona o estar en su círculo.

Te acercamos en este artículo información relevante para que conozcas un poco más sobre tus tarjetas de crédito y cómo debés protegerlas para evitar que sufras fraudes en internet.

Phishing

Phishing es un término informático definido como la actividad de adquirir información confidencial de forma fraudulenta suplantando la identidad de otra persona o empresa.

Esta actividad es muy común y muy frecuente. De hecho, hace unas semanas hubo un phishing de Visa, donde las personas recibieron un email similar a este:

phising-visa

Fuente

Las tarjetas de crédito nunca suelen enviar este tipo de e-mails.
Los emails más frecuentes son con promociones o informe de pago de resumen.
No te dejes engañar por este tipo de correos.

Recomendación para que puedas confirmar la veracidad del correo: Revisá que el dominio (texto posterior al arroba) de la casilla sea una página web válida de la tarjeta de crédito. Adicionalmente, antes de hacer click en un vínculo o botón, revisá que el sitio web haciendo donde serás dirigido sea un página oficial también.

Nunca compartas una foto de tu tarjeta

Parece una obviedad, pero sin demasiado esfuerzo hemos encontrado en Internet más de 50 fotos de tarjetas de crédito, donde se puede ver el número completo y la fecha de expiración.

cards

Tu tarjeta: Números MII y BIN

¿Qué es el número MII (Major Industry Identifier)?

2XXX XXXX XXXX XXXX

El MII es el primer dígito del número de tu tarjeta de crédito.
Dicho dígito indica la industria a la cual ha sido asignado tu plástico.
A continuación se encuentra la lista:

  • 0 – ISO/TC 68 y otras asignaciones futuras
  • 1 – Aerolíneas
  • 2 – Aerolíneas y otras asignaciones futuras
  • 3 – Turismo, entretenimiento y bancario/financiero
  • 4 – Bancario y financiero
  • 5 – Bancario y financiero
  • 6 – Merchandising y bancario/financiero
  • 7 – Petróleo y otras asignaciones futuras
  • 8 – Medicina, telecomunicaciones y otras asignaciones futuras
  • 9 – Asignación nacional

Ejemplos aplicables: vas a poder apreciar que American Express siempre comienza con 3, Visa con 4 y MasterCard con 5. 

¿Qué es el número BIN (Bank Identification number)?

5399 09XX XXXX XXXX

Es el número que identifica a la entidad que emitió tu plástico.
Puede ser una empresa, una organización o un banco.

Si consultás con algún familiar o amigo y tienen la misma tarjeta en algún banco, vas a ver que los primeros 6 dígitos suelen ser iguales.

¿Qué es el algoritmo Luhn?

El algoritmo Luhn es una fórmula de validación utilizada para validar una diversidad de números de identificación, incluyendo números de tarjetas de crédito. El algoritmo es de público conocimiento, utilizado globalmente, y forma parte del estándar ISO/IEC 7812-1.

De forma simplificada, este algoritmo aplicado a un número de tarjeta de crédito, permite saber que números de tarjeta de crédito son válidos para cada emisor (Visa, American Express, etc.) y cuales no.
En un intento de fraude, le provee aún más información al atacante.

Ahora mirá esta foto…

samantha

La persona en la foto está tapando el BIN y dos dígitos más.
Por otro lado está mostrando los 8 dígitos finales.

Mostrar un número parcial no te protege.

El que quisiese cometer fraude la tiene fácil:

  • Puede pedirle a un conocido su Tarjeta Naranja Visa y descubrir el BIN
  • Ya tiene los últimos 8 dígitos por la foto
  • Los dígitos en la posición 7 y 8 los desconoce, pero siendo que pueden ir de 0 a 9, sólo tiene que probar como mucho 100 posibilidades en distintos sitios web para saber cual es el correcto.
  • Si encima a esto se le suma la aplicación del algoritmo Luhn, habría alrededor de sólo 10 posibilidades.

Tu tarjeta: código de seguridad (CCV o CVV)

ccv

Es el código adicional que suele estar al dorso de tu tarjeta. Es utilizado como una medida adicional de seguridad para realizar un pago. Afortunadamente no encontramos fotos de gente que haya fotografiado el dorso de su tarjeta.

Sin embargo, en el caso de American Express sí figura adelante, por lo cual con más razón no hay que publicar fotos con el frente de la tarjeta.

Tu tarjeta en el mundo

  • En Estados Unidos, Europa y en muchos otros países el mundo, se pueden hacer transacciones por internet sin la presencia del código de seguridad. Con más razón, si tu tarjeta es internacional, es fundamental no mostrar el número completo.
  • Hay tarjetas de débito que funcionan de forma internacional. A veces los sitios web ni siquiera te solicitan el PIN a la hora de pagar.

No todos los países son iguales

Por ejemplo en algunos países de Latinoamérica, como Argentina:

  • Hasta el día de hoy no es posible hacer transacciones con tarjeta de débito en Internet. La única forma de usar saldo en tu cuenta bancaria es a través de Homebanking o servicios como PagoMisCuentas.
  • Los pagos que se realizan a través de internet sin la presencia del código de seguridad suelen ser rechazados por la tarjeta de crédito.

Resumen y pensamientos finales

Pudiste observar fácilmente como el descuido personal con tarjetas de crédito permite hacer fraude de una forma muy fácil. Sólo se necesita un poco de conocimiento y sentido común para hacerlo.

En Argentina, por el momento, la mayoría de las transacciones sin el código de seguridad suelen ser rechazadas. Asi que aunque una persona muestre el número entero, puede llegar a ser salvada por este motivo. Sin embargo si dicha tarjeta tiene funcionamiento internacional, puede comprar en sitios del exterior con el número y nada más.

Si vos o un conocido/familiar/amigo publicaron la foto de tu tarjeta de crédito online, te sugerimos que eliminen la foto lo antes posible como primer medida. Idealmente luego de esto, darla de baja y solicitar una nueva.

Las fotos que aparecen en este artículo, fueron encontradas en Internet de forma pública, y modificadas para resguardar la identidad y los datos personales de las personas.

mango_sale

Uno de nuestros pilares principales como compañía es la misión de poder hacer fácil lo difícil. Esta visión se traslada a nuestro servicio y especialmente a nuestros productos y tecnología.

En esta oportunidad les quiero presentar Promociones, una funcionalidad en la que estuvimos trabajando arduamente los últimos dos meses.
Realmente fue de alta complejidad incorporarla debido a su naturaleza. Hubo que considerar muchísimos casos de uso y variables diferentes a la hora de planificar, diseñar y programarla.

Queríamos compartir con ustedes en este artículo, el alcance y los usos posibles de esta funcionalidad cuando la utilicen.

Nombre, código y duración

bin_9

Selección de tarjeta/franquicia

Se puede elegir para que tarjetas (una o varias) se desea aplicar la promoción

bin_3

Esta modalidad es para las tarjetas de cualquier entidad financiera.
También se puede optar por hacer una promoción específicamente para las tarjetas de determinada entidad configurando sus números de BIN.

Números de BIN

bin__

Los números de BIN identifican el emisor del plástico.
Puede ser una empresa, organización o banco.

Se puede configurar para cada entidad financiera sus respectivos números, agregando un punto de control adicional a la hora de transaccionar. Por cada número también se le puede asignar un tipo de tarjeta y un nivel o categoría (Gold, Black, etc.)

bin_2

Cuando se elige una entidad determinada en la promoción, se muestran los números de BIN cargados anteriormente. Si un consumidor intenta utilizar la promoción a la hora de pagar, y su tarjeta no coincide con el banco, la transacción no se realiza.

Cuotas

Permite definir las cuotas para la promoción.
Puede ser una en específico o un rango.

bin_4

Tasas de interés

Ofrecemos tres opciones para las tasas de interés de una promoción:

bin_6

En el caso de elegir la opción de matriz diferencial, se permite configurar coeficientes de interés particulares para dicha promoción:

bin_7

Números de comercio

Algunos bancos prefieren que el comercio genere el alta de un número de comercio particular para la promoción. Es posible elegir ese número para la promoción:

bin_5

En caso de no haber acordado un número de comercio específico para la promoción, se pueden elegir los números por defecto del comercio, que son los que se utilizan para realizar las transacciones normales.

Reintegros

Hay promociones donde el banco le hace un reintegro directamente a la persona.
Con esta opción, esto queda asentado en la promoción.

bin_8

Esta es una funcionalidad muy poderosa que le ayudará a los comercios ahorrar trabajo y dolores de cabeza a la hora de gestionar y hacer el seguimiento de sus promociones.

Si ya estás operando online y tu solución de pago no soporta este tipo de administración de promociones, te invitamos a crear una cuenta en Mango y probar esta funcionalidad.