Envío de SMS en Kotlin con la biblioteca smslib4k
En el desarrollo web moderno, la integración de notificaciones SMS sigue siendo una tarea demandada: autenticación de dos factores, alertas sobre el estado del pedido, recordatorios. Para el lenguaje Kotlin existe una práctica biblioteca smslib4k, que proporciona una interfaz unificada para trabajar con proveedores de SMS populares a través de REST API.
La biblioteca está escrita en Kotlin puro utilizando corrutinas (kotlinx.coroutines) y admite el envío asíncrono de mensajes. Abstrae las diferencias entre proveedores (Twilio, Vonage, SMS-Center, SMS-Ray, etc.), permitiendo al desarrollador centrarse en la lógica de negocio.
Instalación y configuración
Para usar smslib4k, agregue la dependencia en build.gradle.kts:
repositories { mavenCentral()}
dependencies { implementation("io.github.smslib4k:smslib4k-core:2.1.0") // Para un proveedor específico, por ejemplo Twilio: implementation("io.github.smslib4k:smslib4k-twilio:2.1.0")}Después de sincronizar Gradle, la biblioteca está lista para usar.
Inicialización básica del cliente
Cada proveedor requiere sus propias credenciales. Veamos la configuración para el servicio SMS-Center (proveedor ruso popular):
import io.github.smslib4k.core.SmsClientimport io.github.smslib4k.providers.smscenter.SmsCenterProvider
fun main() { val client = SmsClient( provider = SmsCenterProvider( login = "your_login", password = "your_password" ) ) println("Cliente SMS inicializado")}Para Twilio, la construcción será similar, pero requerirá accountSid y authToken.
Envío de un solo SMS
La biblioteca admite tanto el envío síncrono como asíncrono. Se recomienda usar corrutinas:
import kotlinx.coroutines.runBlockingimport io.github.smslib4k.core.model.SmsMessage
fun main() = runBlocking { val client = createClient() // función del ejemplo anterior
val message = SmsMessage( to = "+79161234567", text = "¡Hola! Este es un mensaje de prueba desde Kotlin." )
val result = client.send(message) println("Estado: ${result.status}") println("ID del mensaje: ${result.messageId}")}El método send devuelve un objeto SmsResult que contiene el estado (SUCCESS, FAILED, PENDING) y un identificador único del proveedor.
Envío masivo
Para enviar un mismo texto a varios números, use sendBatch:
val recipients = listOf( "+79161234567", "+79261234568", "+79361234569")
val batchResult = client.sendBatch( to = recipients, text = "¡Oferta! 20% de descuento en todos los productos hasta fin de semana.")
batchResult.forEach { (phone, result) -> println("$phone: ${result.status}")}La biblioteca maneja automáticamente los límites del proveedor en cuanto a solicitudes por segundo, utilizando un limitador de velocidad integrado.
Configuración de parámetros adicionales
Muchos proveedores admiten opciones avanzadas: nombre del remitente (alfa-nombre), indicador de transaccionalidad, tiempo de vida del mensaje. En smslib4k esto se implementa a través del builder:
val message = SmsMessageBuilder() .to("+79161234567") .text("Su código de verificación: 1234") .sender("MyApp") // alfa-nombre (si el proveedor lo permite) .ttl(300) // tiempo de vida en segundos .isTransactional(true) // entrega prioritaria .build()
client.send(message)Manejo de errores
La biblioteca lanza excepciones en caso de problemas de red o credenciales incorrectas. Se recomienda envolver las llamadas en try-catch:
t