Blog

ES
Integración de Twilio con Spring Boot para enviar mensajes de texto (SMS)

Integración de Twilio con Spring Boot para enviar mensajes de texto (SMS)

6 min de lectura

Algo que es muy usado y útil es notificar a los usuarios, ya sea por texto, voz o correo electrónico, y Twilio es un servicio que nos facilita esta tarea. En este artículo te explico paso a paso cómo integrarlo con Spring Boot.

Twilio

Twilio es una plataforma basada en la nube que permite a los desarrolladores integrar funciones de voz, mensajería, vídeo y correo electrónico en aplicaciones mediante API. Este ejemplo nos permitirá enviar un SMS usando Spring Boot.

Dependencias

Primero debemos crear nuestro proyecto en Spring Boot, puedes utilizar Spring Initializr. Y instalar las siguientes dependencias:

En Gradle:

implementation group: "com.twilio.sdk", name: "twilio", version : "11.3.2"

En maven:

<dependency>
    <groupId>com.twilio.sdk</groupId>
    <artifactId>twilio</artifactId>
    <version>11.3.2</version>
    <scope>compile</scope>
</dependency>

Consulta más información de la dependencia aquí: https://mvnrepository.com/artifact/com.twilio.sdk/twilio/11.3.2

Generar token de Twilio

Para poder enviar los mensajes necesitamos estar autenticados en Twilio, para eso debemos colocar las siguientes variables en el application.properties o application.yml:

twilio:
  account-sid: ${TWILIO_ACCOUNT_SID}
  auth-token: ${TWILIO_AUTH_TOKEN}
  phone-number: ${TWILIO_PHONE_NUMBER}

¿De dónde se obtienen esos datos y el token? Fácil, debemos crear una cuenta en Twilio para después ingresar a la Consola en https://console.twilio.com/ y buscar Account Info donde estarán los datos que necesitamos.

Obtener Auth Token de Twilio

Consola de Twilio

Cliente de Twilio

Ahora crearemos una clase para enviar los mensajes:

import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.twilio.type.PhoneNumber;

@Component
public class TwilioService {

    @Value("${twilio.account-sid}")
    private String accountSid;

    @Value("${twilio.auth-token}")
    private String authToken;

    @Value("${twilio.phone-number}")
    private String fromNumber;

    public TwilioService(
            @Value("${twilio.account-sid}") String accountSid,
            @Value("${twilio.auth-token}") String authToken
    ) {
        Twilio.init(accountSid, authToken);
    }

    public void send(String to, String messageBody) {
        try {
            Message.creator(
                    new PhoneNumber(to),
                    new PhoneNumber(fromNumber),
                    messageBody
            ).create();
        } catch (Exception e) {
            throw new RuntimeException("Error al enviar SMS con Twilio: " + e.getMessage());
        }
    }

}

Te explico algunos detalles para que lo entiendas todo:

  • @Component: Define la clase como un Bean de Spring, permitiendo su inyección en otras partes de la app.
  • @Value: Carga de forma segura las credenciales (SID, Token, Número) desde el archivo de configuración.
  • Constructor: Ejecuta Twilio.init(), autenticando la aplicación con el servicio en cuanto se crea el objeto.

Enviar mensajes

Primero debemos recibir el body de una petición para saber a quién se le envía el mensaje y qué contendrá, para eso usaremos un DTO:

import lombok.Data;

@Data
public class MessageDto {

    private String to;

    private String message;

}
  • @Data: Es una anotación de Lombok que genera automáticamente en tiempo de compilación: Getters y Setters, toString(), equals(), hashCode() y el constructor.

Ahora, para probar el envío de los mensajes SMS crearé un controlador con un método POST para enviar un SMS a un teléfono.

import com.byandrev.sms.config.TwilioService;
import com.byandrev.sms.dto.MessageDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/messages")
@RequiredArgsConstructor
public class MessageController {

    private final TwilioService twilioService;

    @PostMapping("/")
    public ResponseEntity<Void> sendMessage(@RequestBody MessageDto data) {
        twilioService.send(data.getTo(), data.getMessage());
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

}

Para probar debemos hacer una petición post a la ruta /api/v1/messages con el siguiente body:

{
    "to": "X",
    "message": "Hello from Twilio"
}
  • En el to se debe colocar un numero de celular con un prefijo, por ejemplo +57XXXXXXXX;

Repositorio en Github con todo el código: https://github.com/byandrev/twilio-spring-boot

Comparte este artículo en

Avatar byandrev

Andres Parra

Software Engineer

Soy Andrés Parra, Ingeniero de Software apasionado por crear soluciones tecnológicas escalables e innovadoras. Me especializo en la construcción de aplicaciones web modernas, dominando un stack versátil que incluye JavaScript, TypeScript, Python y Java, junto con frameworks como React, Next.js y Spring Boot. Interesado en las últimas tecnologías y herramientas de desarrollo.