https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-send-receive-sms-messages-with-node-js-azure-functions-dr/E_SMS-Messages_Azure_1200x600-1.jpg

Cómo enviar y recibir mensajes SMS con Node.js y Azure Functions

Publicado el November 11, 2020

Tiempo de lectura: 5 minutos

Esta entrada de blog forma parte de Historias de la Nube Aplicada aplicada.

Los webhooks son cada vez más populares en el mundo de las API, y Vonage los utiliza para algunas de nuestras API. Así que termino escribiendo bastantes de ellos. Como soy un fan de Node.js, solía hacer la mayoría de ellos con Express. Era una molestia crear un servidor web y desplegarlo en algún sitio, así que empecé a buscar alternativas. Serverless seguía apareciendo en mi investigación como una de las buenas alternativas, así que pensé en usar Azure Functions y Node.js para enviar y recibir mensajes SMS.

Para los SMS, voy a utilizar la SMS APIque te permite enviar y recibir un gran volumen de SMS en cualquier parte del mundo. Una vez que obtengas tu número de teléfono virtual, podrás utilizar la API para gestionar los mensajes salientes ("envío") y los mensajes entrantes ("recepción").

En este artículo, aprenderás cómo enviar y recibir mensajes SMS con Node.js y una Azure Functions App.

El código de este tutorial se encuentra en GitHub.

Requisitos previos

Antes de empezar, asegúrate de que tienes:

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

Configurar una aplicación Azure Functions

Hay varias formas de configurar una Azure Functions App. Yo he elegido hacerlo desde el Portal Azure.

Create Azure Functions AppCreate Azure Functions App

Le he puesto un nombre send-receive-smshe creado un nuevo recurso para él y he elegido Node.js como tiempo de ejecución. He elegido los valores predeterminados en términos de despliegue, región y planes.

Una vez finalizado el despliegue (normalmente unos 2 minutos), puedes ir al recurso recién creado y crear tu primera función. Hay un asistente que le ayuda a través del proceso, y he seleccionado Código VS como entorno de desarrollo y "Publicación directa" como método de despliegue. Eso me dio un conjunto de instrucciones sobre cómo configurar VS Code para Azure.

Create Azure Function quickstartCreate Azure Function quickstart

Una vez que terminé con la configuración, creé mi primera función, un HTTP Trigger. La he llamado inboundpero puedes usar el nombre que quieras. Para el mecanismo de seguridad, usted tiene algunas opciones que controlan el nivel de autorización en la función. "Función" requiere una clave de API basada en la función, "Admin" requiere su clave de API maestra de Azure, y "Anónimo" no requiere una clave de API. He elegido "Anónimo" como el mecanismo de seguridad para ello. Eso creó un nuevo archivo con una plantilla predeterminada.

Create Azure Function templateCreate Azure Function template

Recibir un mensaje SMS

Crear una función Webhook

He sustituido el contenido de la función para que coincida con el Recibir un SMS fragmento de código que utilizamos en nuestro portal para desarrolladores. Combina el cuerpo y los parámetros de consulta de una solicitud y los registra en la consola. Es un simple Webhook que puedes usar para recibir mensajes SMS en la plataforma de Vonage.

module.exports = async function(context, req) {
    const params = Object.assign(req.query, req.body);

    if (params.text) {
      context.log("SMS received", params);
    }

    context.res = {};
  };

Función de despliegue

Como Vonage necesita poder acceder a una URL pública, he implementado mi función con Azure. Puedes hacerlo en VS Code. Una vez que finalice la implementación, obtendrás una URL activa para tu función, por ejemplo, la mía es https://send-receive-sms.azurewebsites.net/api/inbound.

Deploy Azure FunctionDeploy Azure Function

Establecer URL de entrada

Para recibir un mensaje SMS en la plataforma de Vonage, debes tener un número de Vonage. Si no tienes uno, puedes comprar uno en el Panel de Vonage:

Buy Vonage Phone NumberBuy Vonage Phone Number

Cuando un número de teléfono de Vonage reciba un mensaje SMS, Vonage pasará ese mensaje a un Webhook que hayas especificado en el panel de Nexmo. Usaremos nuestra función Azure como el Webhook receptor. Para configurar la URL del webhook, ve al pequeño icono de engranaje junto a tus Numbers en el panel de Nexmo y rellena el campo "Inbound Webhook URL" con la URL que obtuviste tras desplegar la función Azure (la mía fue https://send-receive-sms.azurewebsites.net/api/inbound).

Set Inbound Webhook URL on the Vonage DashboardSet Inbound Webhook URL on the Vonage Dashboard

Puedes probar que funciona enviando un SMS desde tu teléfono a tu número de teléfono de Vonage, y aparecerá en los registros de funciones de Azure.

Envío de un mensaje SMS

Pensé que estaría bien que la Función hiciera algo más que registrar los mensajes SMS, así que voy a hacer que también responda a los mensajes SMS, cambiando el mensaje de texto a emojis.

Voy a utilizar el SDK de Vonage Node.js para enviar el mensaje SMS, por lo que tendrás que instalarlo en la función Azure. La carpeta de nivel superior de tu función tiene un archivo package.json que se instala con cada despliegue. Así que si navegas a esa carpeta en el Terminal y usas npm install nexmoaccederás al SDK de Vonage dentro de la función Azure.

También he actualizado la función para inicializar el SDK de Vonage, convertir el mensaje SMS en emojis y luego enviarlo como SMS al remitente original.

module.exports = async function(context, req) {
  const Nexmo = require("nexmo");

  const nexmo = new Nexmo({
    apiKey: process.env["NEXMO_API_KEY"],
    apiSecret: process.env["NEXMO_API_SECRET"]
  });

  const params = Object.assign(req.query, req.body);

  if (params.text) {
    var response = [];

    // transform inbound SMS into emojis
    for (let i = 0; i < params.text.length; i++) {
      const emoji = String.fromCodePoint(127715 + params.text.charCodeAt(i));
      response.push(emoji);
    }

    // send SMS back with emojis
    nexmo.message.sendSms(
      params.to,
      params.msisdn,
      response.join(""),
      {
        type: "unicode"
      },
      (err, responseData) => {
        if (err) {
          context.log(err);
        } else {
          if (responseData.messages[0]["status"] === "0") {
            context.log("Message sent successfully.");
          } else {
            context.log(
              `Message failed with error: ${responseData.messages[0]["error-text"]}`
            );
          }
        }
      }
    );
  }

  context.res = {};
};

Verás que mi código inicializa el SDK de Vonage con process.env["NEXMO_API_KEY"] y process.env["NEXMO_API_SECRET"]. La aplicación Azure Function tiene la configuración de la aplicación y he agregado mis etiquetas NEXMO_API_KEY y NEXMO_API_SECRET y estos se actualizan con cada implementación desde mi máquina local. Tú también puedes hacerlo, o sustituir esos valores por tu clave y secreto de API reales. Puedes encontrarlos en la página "Cómo comenzar" en el Panel de Vonage.

Add Application Settings in AzureAdd Application Settings in Azure

El método del SDK para enviar un SMS, nexmo.message.sendSms()toma como parámetros el ID del remitente, el número de teléfono del destinatario, el mensaje de texto y las opciones. He añadido {type: "unicode"} en las opciones porque estoy enviando emojis. También acepta una llamada de retorno que se activa cuando finaliza la solicitud de la API.

Los datos de respuesta contienen una matriz con todos los mensajes enviados e información sobre su estado. En la mayoría de los casos, habrá un solo elemento en esa matriz, pero si el SMS tenía más de 160 caracteres, se dividirá en un SMS de varias partes, y entonces la matriz contendrá datos sobre cada parte enviada. Si el estado del mensaje es 0, el SMS se ha enviado correctamente; en caso contrario, los datos de error del mensaje se encuentran en la propiedad error-text del mensaje.

Debido a que mi texto tiene un emoji en él, estoy estableciendo el tipo unicode en el objeto de opciones, de lo contrario, ese emoji va a ser enviado en la red como ?.

Pruébelo

Ahora envía un mensaje SMS desde tu teléfono a tu número de Vonage. Deberías recibir de vuelta un mensaje SMS que convierta tus caracteres de texto en emojis. Si envías Hello World! en el SMS, deberías recibir de vuelta 🌷🍈🍛🍗🌃🍐🍈🌃🍗🍈🍑🍇🍈🍕🌑.

Received SMS message with VonageReceived SMS message with Vonage

Espero que haya funcionado y acabes de aprender a enviar y recibir mensajes SMS con las API de Vonage, Azure Functions y Node.js.

Compartir:

https://a.storyblok.com/f/270183/384x384/dabe7c5397/laka.png
Alex LakatosAntiguos alumnos de Vonage

Alex Lakatos es JavaScript Developer Advocate para Nexmo. En su tiempo libre es voluntario en Mozilla como Tech Speaker y Reps Mentor. Desarrollador de JavaScript en la web abierta, ha estado empujando sus límites todos los días. Cuando no está programando en Londres, le gusta viajar por el mundo, así que es probable que te lo encuentres en la sala de espera de un aeropuerto.