Envío de vínculos del abreviador a través de SMS con Azure Communication Services

Los mensajes SMS están limitados a 160 caracteres, lo que limita la capacidad de enviar direcciones URL a los clientes. Las direcciones URL pueden superar el límite de 160 caracteres, ya que contienen parámetros de consulta, información cifrada, etc. Mediante el abreviador de direcciones URL de Azure, es posible generar direcciones URL cortas que sean adecuadas para envío a través de SMS, ya que permanecerán muy por debajo del límite de 160 caracteres. 

En este documento se describe el proceso de integración de Azure Communication Services con el abreviador de direcciones URL de Azure, un servicio de código abierto que le permite crear, administrar y supervisar fácilmente vínculos abreviados.

Código de ejemplo

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

Requisitos previos

Introducción a la arquitectura

En este tutorial, se pone el foco en configurar un middleware que organiza las solicitudes para enviar SMS y el acortamiento de direcciones URL a través del servicio del abreviador de direcciones URL de Azure. Interactúa con Azure Communication Services para completar el envío del SMS.

Diagram for architecture overview.

Configuración de Azure Functions

Para empezar, es necesario crear una nueva función de Azure. Puede crear la función de Azure siguiendo los pasos descritos en la documentación de Azure Functions. Si no usa una función de Azure y, en su lugar, usa un marco diferente, omita este paso y continúe con la sección siguiente.

Una vez configurada la función de Azure, vaya al archivo local.settings.json y agregue tres valores más que debe almacenar: la cadena de conexión de Azure Communication Services, el número de teléfono (por ejemplo: +15555555555) y el punto de conexión del abreviador de dirección URL (por ejemplo: https://<Azure_Function_URL>/api/UrlCreate). Estas variables son todos los valores que generó a partir de los requisitos previos del principio del documento.


{
    "IsEncrypted": false,
    "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "ACS_CONNECTIONSTRING": "<AZURE COMMUNICATION SERVICES CONNECTION STRING>",
    "ACS_PHONE_NUMBER": "<AZURE COMMUNICATION SERVICES PHONE NUMBER>",
    "URL_SHORTENER": "<URL SHORTENER ENDPOINT>" 
    }
}

Configuración de los parámetros de consulta

Ahora que ha creado la función de Azure, debe configurar los parámetros de consulta necesarios para desencadenarla. La función espera un número de teléfono y una dirección URL. El número de teléfono se usa como destinatario del mensaje SMS. La dirección URL es el vínculo que se abrevia y se envía al destinatario.


namespace Company.Function
{
    public static class SendSMSUrlShortener
    {
        [FunctionName("SendSMSUrlShortener")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string phoneNumberTo = req.Query["phoneNumber"]; // get phone number query parameter
            string urlToShorten = req.Query["url"]; // get url to shorten query parameter

            return new OkObjectResult(null);
        }
    }
}

Acortar la dirección URL

Ahora que tiene el número de teléfono y la dirección URL, puede usar el servicio del abreviador de direcciones URL de Azure para acortar la dirección URL. Asegúrese de que ya haya implementado este servicio. El servicio contiene varios puntos de conexión, pero para este tutorial el foco se pone en el punto de conexión UrlCreate. Use el método PostAsync para realizar una solicitud POST al servicio del abreviador de direcciones URL de Azure con la dirección URL que desee acortar. El servicio devuelve un objeto JSON con la dirección URL abreviada. Almacene la dirección URL abreviada en una variable denominada shortUrl. En el fragmento de código, inserte el punto de conexión del servicio del abreviador de direcciones URL de Azure implementado. Para más información sobre cómo obtener el punto de conexión, vea Validación de la implementación.

...
using System.Net.Http;
using System.Text.Json;
using System.Text;

namespace Company.Function
{
    public class ShortenedUrl
    {
        public string ShortUrl { get; set; }
    }

    public static class SendSMSUrlShortener
    {
        static string urlShortener = Environment.GetEnvironmentVariable("URL_SHORTENER", EnvironmentVariableTarget.Process);

        [FunctionName("SendSMSUrlShortener")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            //Parse Query Parameters
            string phoneNumberTo = req.Query["phoneNumber"]; // get phone number query parameter
            string urlToShorten = req.Query["url"]; // get url to shorten query parameter
            
            //Get short URL from Azure URL Shortener
            using var client = new HttpClient();
            var requestData = new
            {
                Url = urlToShorten //Body request for the POST call
            };
            var requestBody = JsonSerializer.Serialize(requestData);
            var httpContent = new StringContent(requestBody, Encoding.UTF8, "application/json");
            var response = await client.PostAsync(urlShortener, httpContent); // POST call to the Azure URL Shortener
            var content = await response.Content.ReadAsStringAsync();
            var data = System.Text.Json.JsonSerializer.Deserialize<ShortenedUrl>(content); // Parse content to ShortenedUrl object
            var url = data.ShortUrl;
            log.LogInformation("Shortened URL " + url);

            return new OkObjectResult(null);
        }
    }
}

Envío de SMS

Ahora que se abrevió la dirección URL, puede usar Azure Communication Services para enviar el SMS. Use el método send de la clase SmsClient del paquete Azure.Communication.Sms.


dotnet add package Azure.Communication.Sms

Este método envía el SMS al número de teléfono proporcionado en los parámetros de consulta. El SMS contiene la dirección URL abreviada. Para obtener más información sobre cómo enviar SMS, consulte Enviar SMS.

...
using Azure;
using Azure.Communication;
using Azure.Communication.Sms;

namespace Company.Function
{
    // Class to deserialize URL Shortener response
    public class ShortenedUrl
    {
        public string ShortUrl { get; set; }
    }

    public static class SendSMSUrlShortener
    {
        [FunctionName("SendSMSUrlShortener")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            
            //Parse Query Parameters
            string phoneNumberTo = req.Query["phoneNumber"]; // get phone number query parameter
            string urlToShorten = req.Query["url"]; // get url to shorten query parameter
            
            //Get short URL from Azure URL Shortener
            using var client = new HttpClient();
            var requestData = new
            {
                Url = urlToShorten //Body request for the POST call
            };
            var requestBody = JsonSerializer.Serialize(requestData);
            var httpContent = new StringContent(requestBody, Encoding.UTF8, "application/json");
            string urlShortener = Environment.GetEnvironmentVariable("URL_SHORTENER", EnvironmentVariableTarget.Process); // Ex. https://<Azure Function URL>/api/UrlCreate
            var response = await client.PostAsync(urlShortener, httpContent); // POST call to the Azure URL Shortener
            var content = await response.Content.ReadAsStringAsync();
            var data = System.Text.Json.JsonSerializer.Deserialize<ShortenedUrl>(content); // Parse content to ShortenedUrl object
            var url = data.ShortUrl;
            log.LogInformation("Shortened URL " + url);
            
            //Send SMS with Azure Communication Services
            string connectionString = Environment.GetEnvironmentVariable("ACS_CONNECTIONSTRING", EnvironmentVariableTarget.Process);
            string phoneNumberFrom = Environment.GetEnvironmentVariable("ACS_PHONE_NUMBER", EnvironmentVariableTarget.Process); // Ex. +15555555555
            SmsClient smsClient = new SmsClient(connectionString);            
            SmsSendResult sendResult = smsClient.Send(
                from: phoneNumberFrom,
                to: phoneNumberTo,
                message: "Here is your shortened URL: " + url
            ); // Send SMS message with shortened URL
            
            return new OkObjectResult(sendResult);
        }
    }
}

Prueba local

Nota:

Deberá comprobar el número de teléfono para enviar mensajes SMS con direcciones URL. Una vez que las aplicaciones de verificación estén establecidas en estado pendiente (1-2 días), el número de teléfono se habilitará para enviar direcciones URL. La comprobación completa tardará entre 5 y 6 semanas. Para obtener más información sobre la comprobación de números gratuitos, consulte Preguntas más frecuentes sobre la verificación de números gratuitos.

Ahora puede ejecutar la función de Azure localmente presionando F5 en Visual Studio Code o ejecutando el siguiente comando en el terminal:


func host start

Después, mediante una herramienta como Postman, podrá probar la función realizando una solicitud POST al punto de conexión de la función de Azure. Deberá proporcionar el número de teléfono y la dirección URL como parámetros de consulta. Por ejemplo, si la función de Azure se ejecutase localmente, podría realizar una solicitud a http://localhost:7071/api/<FUNCTION NAME>?phoneNumber=%2B15555555555&url=https://www.microsoft.com. Debería recibir una respuesta con la dirección URL abreviada y un estado de Success.

Implementar en Azure

Para implementar la instancia de Azure Functions, puede seguir las instrucciones paso a paso.

Una vez implementada, podrá acceder a la función a través de un método similar al que hizo al probar localmente. Deberá proporcionar el número de teléfono y la dirección URL como parámetros de consulta. Por ejemplo, si la función de Azure se implementase en Azure, podría realizar una solicitud a https://<YOUR AZURE FUNCTION NAME>.azurewebsites.net/api/<FUNCTION NAME>?phoneNumber=%2B15555555555&url=https://www.microsoft.com. Debería recibir una respuesta con la dirección URL abreviada y un estado de Success.

Código de ejemplo

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

Requisitos previos

Introducción a la arquitectura

En este tutorial, se pone el foco en configurar un middleware que organiza las solicitudes para enviar SMS y el acortamiento de direcciones URL a través del servicio del abreviador de direcciones URL de Azure. Interactúa con Azure Communication Services para completar el envío del SMS.

Diagram for architecture overview.

Configuración de Azure Functions

Para empezar, es necesario crear una nueva función de Azure. Puede crear la función de Azure siguiendo los pasos descritos en la documentación de Azure Functions. Si no usa una función de Azure y, en su lugar, usa un marco diferente, omita este paso y continúe con la sección siguiente.

Una vez configurada la función de Azure, vaya al archivo local.settings.json y agregue tres valores más que debe almacenar: la cadena de conexión de Azure Communication Services, el número de teléfono (por ejemplo: +15555555555) y el punto de conexión del abreviador de dirección URL (por ejemplo: https://<Azure_Function_URL>/api/UrlCreate). Estas variables son todos los valores que generó a partir de los requisitos previos del principio del documento.


{
    "IsEncrypted": false,
    "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "ACS_CONNECTIONSTRING": "<AZURE COMMUNICATION SERVICES CONNECTION STRING>",
    "ACS_PHONE_NUMBER": "<AZURE COMMUNICATION SERVICES PHONE NUMBER>",
    "URL_SHORTENER": "<URL SHORTENER ENDPOINT>" 
    }
}

Configuración de los parámetros de consulta

Ahora que ha creado la función de Azure, debe configurar los parámetros de consulta necesarios para desencadenarla. La función espera un número de teléfono y una dirección URL. El número de teléfono se usa como destinatario del mensaje SMS. La dirección URL es el vínculo que se abrevia y se envía al destinatario.


const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    //Parse Query Parameters
    let phoneNumber = req.query.phoneNumber; // get phone number query parameter
    let url =  req.query.url; // get url to shorten query parameter

    context.res = {
      // status: 200, /* Defaults to 200 */
      body: null
    };
};

export default httpTrigger;

Acortar la dirección URL

Ahora que tiene el número de teléfono y la dirección URL, puede usar el servicio del abreviador de direcciones URL de Azure para acortar la dirección URL. Asegúrese de que ya haya implementado este servicio. El servicio contiene varios puntos de conexión, pero para este tutorial el foco se pone en el punto de conexión UrlCreate. Use el método fetch para realizar una solicitud POST al servicio del abreviador de direcciones URL de Azure con la dirección URL que desee acortar. El servicio devuelve un objeto JSON con la dirección URL abreviada. Almacene la dirección URL abreviada en una variable denominada shortUrl. En el fragmento de código, inserte el punto de conexión del servicio del abreviador de direcciones URL de Azure implementado. Para más información sobre cómo obtener el punto de conexión, vea Validación de la implementación.


const urlShortener = process.env.URL_SHORTENER

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    //Parse Query Parameters    
    let phoneNumberTo = req.query.phoneNumber; // get phone number query parameter
    let urlToShorten =  req.query.url; // get url to shorten query parameter
    
    //Get short URL from Azure URL Shortener
    const body =  JSON.stringify({ "Url": url})
    await fetch(urlShortener, {
      method: 'POST',
      body: body
    })
    .then(res => res.json())
    .then(async data => {
      const shortUrl = data["ShortUrl"]
      context.log(shortUrl)
      }
    })

    context.res = {
      // status: 200, /* Defaults to 200 */
      body: null
    };
};

export default httpTrigger;

Envío de SMS

Ahora que tiene la dirección URL corta, use Azure Communication Services para enviar el SMS. Comience con el método send de la clase SmsClient del paquete @azure/communication-sms.


npm i @azure/communication-sms --save

Este método envía el SMS al número de teléfono proporcionado en los parámetros de consulta. El SMS contiene la dirección URL abreviada. Para obtener más información sobre cómo enviar SMS, consulte Enviar SMS.


import { AzureFunction, Context, HttpRequest } from "@azure/functions"
import { SmsClient }  from "@azure/communication-sms"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    //Parse Query Parameters
    let to = req.query.phoneNumber; // Get phone number to send SMS to
    let urlToShorten =  req.query.url; // Get URL to shorten

    //Get short URL from Azure URL Shortener
    const body =  JSON.stringify({ "Url": urlToShorten})
    const urlShortener = process.env.URL_SHORTENER
    await fetch(urlShortener, {
      method: 'POST',
      body: body
    })
    .then(res => res.json())
    .then(async data => {
      const url = data["ShortUrl"]
      const connectionString =  process.env.ACS_CONNECTIONSTRING
      const phoneNumberFrom = process.env.ACS_PHONE_NUMBER
      const smsClient = new SmsClient(connectionString);
      // Send the SMS message
      const sendResults = await smsClient.send({
        from: phoneNumberFrom,
        to: [to],
        message: "Join your scheduled appointment here: " + url
      }, {
        enableDeliveryReport: true
      });
      // Use the "successful" property to verify the status.
      for (const sendResult of sendResults) {
        if (sendResult.successful) {
          console.log("Success: ", sendResult);
        } else {
          console.error("Something went wrong when trying to send this message: ", sendResult);
        }
      }
      context.res = {
        // status: 200, /* Defaults to 200 */
        body: url
      };
    })

};

Prueba local

Nota:

Deberá comprobar el número de teléfono para enviar mensajes SMS con direcciones URL. Una vez que las aplicaciones de verificación estén establecidas en estado pendiente (1-2 días), el número de teléfono se habilitará para enviar direcciones URL. La comprobación completa tardará entre 5 y 6 semanas. Para obtener más información sobre la comprobación de números gratuitos, consulte Preguntas más frecuentes sobre la verificación de números gratuitos.

Ahora puede ejecutar la función de Azure localmente presionando F5 en Visual Studio Code o ejecutando el siguiente comando en el terminal:


func host start

Después, mediante una herramienta como Postman, podrá probar la función realizando una solicitud POST al punto de conexión de la función de Azure. Deberá proporcionar el número de teléfono y la dirección URL como parámetros de consulta. Por ejemplo, si la función de Azure se ejecutase localmente, podría realizar una solicitud a http://localhost:7071/api/<FUNCTION NAME>?phoneNumber=%2B15555555555&url=https://www.microsoft.com. Debería recibir una respuesta con la dirección URL abreviada y un estado de Success.

Implementar en Azure

Para implementar la instancia de Azure Functions, puede seguir las instrucciones paso a paso.

Una vez implementada, podrá acceder a la función a través de un método similar al que hizo al probar localmente. Deberá proporcionar el número de teléfono y la dirección URL como parámetros de consulta. Por ejemplo, si la función de Azure se implementase en Azure, podría realizar una solicitud a https://<YOUR AZURE FUNCTION NAME>.azurewebsites.net/api/<FUNCTION NAME>?phoneNumber=%2B15555555555&url=https://www.microsoft.com. Debería recibir una respuesta con la dirección URL abreviada y un estado de Success.

Pasos siguientes