
Compartir:
Benjamin Aronov es desarrollador de Vonage. Es un constructor de comunidades con experiencia en Ruby on Rails. Benjamin disfruta de las playas de Tel Aviv, a la que llama hogar. Su base en Tel Aviv le permite conocer y aprender de algunos de los mejores fundadores de startups del mundo. Fuera de la tecnología, a Benjamin le encanta viajar por el mundo en busca del perfecto pain au chocolat.
Cómo recibir mensajes SMS con Ruby on Rails
Tiempo de lectura: 4 minutos
Ahora que tu aplicación Ruby on Rails puede enviar SMS y seguir estados de los mensajesel siguiente paso es gestionar los mensajes entrantes. Después de todo, ¿qué sentido tiene enviar SMS si no puedes recibir respuestas? En este artículo te explicamos cómo hacerlo.
En este tutorial aprenderás a recibir un SMS entrante implementando un endpoint webhook en Ruby on Rails.
TL;DR Saltar adelante y encontrar todo el código de inicio rápido en GitHub.
Requisitos previos
Ruby on Rails instalado en su máquina
Número virtual de Vonage
Para comprar un número de teléfono virtual, vaya a su panel API y siga los pasos que se indican a continuación.
Purchase a phone number
Vaya a su Panel API
Vaya a CONSTRUIR Y GESTIONAR > Numbers > Comprar Numbers.
Elija los atributos necesarios y haga clic en Buscar
Pulse el botón Comprar junto al número que desee y valide su compra
Para confirmar que ha adquirido el número virtual, vaya al menú de navegación de la izquierda, en CONSTRUIR Y GESTIONAR, haga clic en Numbers y, a continuación, en Sus Numbers.
¿Cómo funcionan los SMS entrantes?
Puede que te estés preguntando cómo llega un SMS desde el teléfono de un usuario hasta tu aplicación Rails. De manera similar a cómo funcionaban los recibos de entrega en la publicación anterior, Vonage maneja la interacción con la red móvil. Después, reenviará esa información a un webhook que definas en tu aplicación de Vonage. En este tutorial, utilizaremos ngrok para gestionar el webhook y reenviarlo a nuestra aplicación Rails.
Diagram illustrating the inbound SMS process, where a user sends a message through the Vonage platform, which then forwards the message to an application via a webhook.
Cómo exponer una aplicación Ruby on Rails con ngrok
Puede utilizar ngrok para exponer de forma segura su servidor local públicamente a través de HTTP. Así que ahora, en una pestaña separada de tu servidor rails, abre un túnel ngrok en el puerto 3000.
ngrok http 3000Asegúrese de añadir su URL ngrok como config.host en tu archivo development.rb archivo. Utilizaremos la variable de entorno VONAGE_SERVER_HOSTNAMEpara que nuestra aplicación sea más dinámica.
Para más ayuda, consulta cómo empezar a usar ngrok en Rails.
# config/environments/development.rb
Rails.application.configure do
config.hosts << ENV['VONAGE_SERVER_HOSTNAME']
Si no has creado un archivo .env anteriormente, asegúrate de hacerlo en la raíz de tu aplicación y agrega tus credenciales de Vonage y la URL de ngrok:
VONAGE_APPLICATION_ID='XXXX'
VONAGE_PRIVATE_KEY='./private.key'
VONAGE_SERVER_HOSTNAME='XXXXXX.ngrok.app
>> Mantén seguras tus credenciales
>> Nunca envíe archivos .env a su repositorio. Asegúrese de que .env está en su .gitignore.
Ahora tendremos que actualizar nuestra aplicación de Vonage (de artículos anteriores) en el panel del desarrollador. Haz clic en "editar". Ahora actualiza la URL de entrada bajo las capacidades de mensajes. Agrega tu URL ngrok seguida de /inbound_sms.
Una vez que pulses guardar, ngrok reenviará las peticiones realizadas al endpoint /inbound_sms a tu aplicación Rails. Pero hay un pequeño problema: nuestra aplicación Rails no tiene ese punto final.
Cómo gestionar un SMS entrante con WebHooks en Rails
Ahora que Vonage está reenviando una carga útil de SMS a la aplicación /inbound_sms actualicemos nuestra aplicación y creemos una ruta para manejarlo.
# config/routes.rb
Rails.application.routes.draw do
resources :inbound_sms, only: [:create]
....remaining routes...Cuando se haya enviado un SMS a tu número virtual de Vonage, Vonage notificará a tu aplicación enviando un webhook. Una carga útil típica para un SMS entrante tendrá este aspecto.
{
"to": "12013508504",
"from": "12013508506",
"channel": "sms",
"message_uuid": "a1610e97-a045-4d04-933b-5e570fe51691",
"timestamp": "2025-02-23T18:21:41Z",
"usage": {
"price": "0.0059",
"currency": "EUR"
},
"message_type": "text",
"text": "Testing",
"context_status": "none",
"origin": {
"network_code": "42507"
},
"sms": {
"num_messages": "1",
"count_total": "1"
}
} Cómo almacenar un mensaje SMS desde Rails
Ahora que tenemos toda la información necesaria basada en nuestro modelo de SMS definido anteriormente, podemos crear algo de lógica para almacenar nuestros SMS entrantes. También añadiremos una función divertida para mostrar que nuestro código funciona. Vamos a generar un nuevo controlador para manejar esto.
rails g controller InboundSms createDentro de nuestro controlador, tendremos un simple comando crear que analiza el webhook e introduce un SMS en nuestra base de datos. Verás que hemos definido is_inbound en true.
# app/controllers/inbound_sms_controller.rb
class InboundSmsController < ApplicationController
skip_before_action :verify_authenticity_token
def create
sms = Sms.create(
to: params[:to],
from: params[:from],
text: params[:text],
message_uuid: params[:message_uuid],
is_inbound: true
)
# Send a reply
# reply sms
# Return an empty HTTP 200 status regardless
head :ok
end
end
Para demostrar que hemos recibido el sms, enviaremos una respuesta al remitente. Vamos a divertirnos un poco, mostrando primero el texto original sin vocales y luego en binario.
private
def reply(sms)
consonants = sms.text.delete("aeiouAEIOU")
binary = sms.text.unpack1('B*')
message = Vonage::Messaging::Message.sms(message: "Your message without vowels is #{consonants} and your message in binary is #{binary}")
vonage.messaging.send(
from: sms.to,
to: sms.from,
**message
)
end
El método de respuesta depende del cliente de Vonage, por lo que tendremos que inicializarlo como hicimos en el primer artículo.
vonage = Vonage::Client.new(
application_id: ENV["VONAGE_APPLICATION_ID"],
private_key: ENV["VONAGE_PRIVATE_KEY"]
)Vea cómo encaja todo el código en el archivo completo inbound_sms_controller.rb completo.
Conclusión
¡Enhorabuena! Has creado con éxito una aplicación de SMS en Ruby on Rails que puede recibir mensajes entrantes utilizando un webhook de Vonage. Y así has completado la parte de SMS del tutorial de Ruby on Rails. Agregaremos capacidades de voz con la Voice API de Vonage en futuros tutoriales.
Si tienes alguna pregunta o quieres solicitar una funcionalidad para la aplicación Quickstart, únete a la conversación en la Comunidad Slack o comunícate en X (antes Twitter). ¡Nos encantaría escuchar lo que construyes a continuación!
Compartir:
Benjamin Aronov es desarrollador de Vonage. Es un constructor de comunidades con experiencia en Ruby on Rails. Benjamin disfruta de las playas de Tel Aviv, a la que llama hogar. Su base en Tel Aviv le permite conocer y aprender de algunos de los mejores fundadores de startups del mundo. Fuera de la tecnología, a Benjamin le encanta viajar por el mundo en busca del perfecto pain au chocolat.