Recepción y respuesta de SMS con Java y Twilio

March 23, 2021
Redactado por
Revisado por

Recepción y respuesta de SMS con Java y Twilio

Si se pregunta cómo enviar SMS desde el código Java, ya tenemos lo que necesita. Sin embargo, las personas esperan cada vez más poder conversar con empresas y servicios en lugar de recibir una transmisión interminable de notificaciones. Para crear aplicaciones realmente interactivas y atractivas, también recomendamos que responda a los mensajes entrantes.

Para ello, deberá configurar una dirección URL en su consola de Twilio. Los mensajes entrantes desencadenarán solicitudes HTTP a esa URL y la respuesta a esas solicitudes de webhook determinará lo que sucede a continuación, incluido el envío de respuestas. Las respuestas se deben escribir en un dialecto XML llamado Twilio Markup Language o TwiML.

En esta publicación, lo guiaré a través de la configuración de un servidor web mediante Spring Boot para hacer precisamente eso.

Preparación

Antes de comenzar, necesitará:

La mejor manera de iniciar un nuevo proyecto de Spring Boot es utilizar Spring InitializrEste enlace lo llevará a una configuración preconfigurada con la dependencia web seleccionada y algunos nombres preconfigurados. Cargue esa página, haga clic en “Generate” (generar) y descomprima el proyecto descargado en un directorio vacío. A continuación, abra el proyecto en su IDE de elección y manos a la obra.

Creación de la aplicación

Cuando abra la base de código, verá el nivel superior del proyecto. Abra las carpetas anidadas src/main/java y busque el paquete llamado com.example.twilio.sms, con una sola clase, denominada RespondToSmsWithTwilioAndJavaApplication. No es necesario que edite esa clase, pero tiene un método main que será útil más adelante.

Creación de un endpoint HTTP

Por ahora, cree otra clase en el mismo paquete con la siguiente definición y llámela SmsWebhookHandler:

@RestController
public class SmsWebhookHandler {
    @PostMapping("/")
    @ResponseBody
    public String handleSmsWebhook(){
      return "Hola de Twilio";
    }
}

[código completo que incluye las importaciones en GitHub]

Puede ejecutar la aplicación ahora, ya sea mediante la ejecución del método main de RespondToSmSWithTwilioAndJavaApplication en su IDE o ./mvnw spring-boot:run en una ventana de terminal en la raíz de su proyecto.

Después de que se esté ejecutando, pruébela con el siguiente comando.

curl -XPOST http://localhost:8080

Debe ver “Saludos de Twilio” como respuesta.

Devolución de TwiML por HTTP

Hemos logrado un buen comienzo hasta ahora. A continuación, tenemos que devolver la etiqueta TwiML para que Twilio pueda comprender la respuesta.

Es posible escribir TwiML a mano, pero es más fácil hacerlo con el uso de Twilio Java Helper Library. Agregue el siguiente código a la sección <dependencies> de pom.xml en la raíz de su proyecto.

<dependency>
    <groupId>com.twilio.sdk</groupId>
    <artifactId>twilio</artifactId>
    <version>8.8.0</version>
</dependency>

Siempre recomendamos utilizar la última versión de Twilio Helper Library. Al momento de escribir esto, esta es la versión 8.8.0. Siempre puede comprobar la versión más reciente en mvnreporistory.com.

Ahora, hagamos algunos cambios en el código en SmsWebhookHandler. Cambie la clase para que tenga esta definición:

@RestController
public class SmsWebhookHandler {

    private final Map<String, Integer> messageCounts = new ConcurrentHashMap<>();

    @PostMapping(value = "/", produces = "application/xml")
    @ResponseBody
    public String handleSmsWebhook(
        @RequestParam("From") String from,
        @RequestParam("Body") String body){

        int thisMessageCount = messageCounts.compute(from, (k,v) -> (v == null) ? 1 : v+1);

        String plural = (thisMessageCount > 1) ? "mensajes" : "mensaje";
        String message = String.format(
            "☎️ Hola de Twilio. Has enviado %d %s, y esta dijo '%s'",
            thisMessageCount, plural, body);

        return new MessagingResponse.Builder()
            .message(new Message.Builder(message).build())
            .build().toXml();
    }
}

[código completo que incluye las importaciones en GitHub]

Aquí ocurren varias cosas, así que vamos a repasarlas:

  • Línea 4: crea un nuevo mapa de cadena a entero para contar cuántos mensajes hemos recibido de cada número de teléfono único. Debido a que Spring solo creará una instancia de esta clase, el mapa se comparte entre todas las llamadas.
  • Línea 6: observe que el punto final ahora tiene un tipo de contenido de application/xml.
  • Líneas 9 a 10: podemos extraer datos de la solicitud entrante utilizando @RequestParam. Aquí solo estoy usando el número From y el Body del mensaje, pero se puede acceder a mucho más.
  • Línea 12: actualice el mapa de messageCounts para contabilizar este mensaje nuevo.
  • Líneas 14 a 17: cree la cadena que se utilizará como respuesta del mensaje.
  • Líneas 19 a 21: por último, cree la respuesta TwiML y devuélvala como una cadena XML.

Para probar el código, ejecute el proyecto como antes. Luego, cuando esté en ejecución, ejecute el siguiente comando.

curl http://localhost:8080/ -F From=+1234567890 -F Body= Hola

Debería recibir la siguiente respuesta:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Message>☎️ Hola de Twilio. Enviaste 1 mensaje y este dijo 'Hola'.</Message>
</Response>

(Tenga en cuenta que he agregado saltos de línea a esta salida)

Conectarse a un número de teléfono Twilio

La última parte del rompecabezas es cómo configurar Twilio para utilizar esta app cuando se recibe un mensaje. Como dije en la introducción, debe configurar su número de teléfono con una dirección URL para la aplicación. Debido a que está ejecutando la aplicación de forma local, solo tiene una URL localhost, a la que Twilio no podrá acceder. Hay varias opciones de alojamiento público con Java, pero una herramienta que me gusta usar para desarrollo es ngrok, que puede crear direcciones URL públicas que reenvían aplicaciones web localhost.

Una vez que haya instalado ngrok y reiniciado la app con su IDE o el comando de arriba, el siguiente comando creará una URL pública para su servidor local:

ngrok http 8080

Una vez que el túnel se ha conectado, ngrok muestra la URL generada aleatoriamente que ahora apunta a su aplicación. Debería verse como https://RANDOM_STRING.ngrok.io. Abra su consola de Twilio a sus números entrantes y elija el número que desea utilizar para esta app o compre uno nuevo. Edite el número y agregue la URL de ngrok como webhook para cuando llegue un mensaje (dejando el método como POST).

Si tiene instalada la CLI de Twilio, también puede hacerlo también en la línea de comandos, con el siguiente comando.

twilio phone-numbers:update PHONE_NUMBER --sms-url http://localhost:3000/messages

La CLI detectará que se trata de una dirección URL de host local y configurará ngrok por usted.

Envíe un par de mensajes de texto con su número y verá cómo llegan las respuestas.

Captura de pantalla de la app SMS en mi teléfono. I&#x27;ve envió 2 mensajes y tenía 2 respuestas que son eco de lo que envié y están numeradas.

 🎉🎉🎉 Buen trabajo 🎉🎉🎉

Conclusión

Aprendió cómo responder a SMS mediante Twilio y Java, y puede aprender cómo iniciar SMS salientes. Además, ha visto que puede personalizar las respuestas en función de quién le envía mensajes y lo que dicen. Ahora el límite es su imaginación. ¿Creará un recomendador de libros (librerías), un sistema de atención sanitaria comunitario, un bot de chat o algo totalmente nuevo?

Este artículo fue traducido del original "Receiving and Responding to SMS with Java and Twilio". Mientras estamos en nuestros procesos de traducción, nos encantaría recibir sus comentarios en help@twilio.com - las contribuciones valiosas pueden generar regalos de Twilio.