plit banner image with a red Ruby logo and background on the left, and a black section on the right with a white paper airplane and message icon representing communication.

Comment recevoir des SMS avec Ruby on Rails

Publié le April 24, 2025

Temps de lecture : 4 minutes

Maintenant que votre application Ruby on Rails peut envoyer des SMS et suivre les statuts des messagesl'étape suivante consiste à gérer les messages entrants. Après tout, quel est l'intérêt d'envoyer des SMS si vous ne pouvez pas recevoir de réponses ? Dans cet article, nous vous montrons exactement comment procéder.

Dans ce tutoriel, vous apprendrez à recevoir un SMS entrant en mettant en œuvre un point de terminaison webhook dans Ruby on Rails.

TL;DR Passez à l'étape suivante et trouvez tout le code de code de démarrage rapide sur GitHub.

Conditions préalables

Pour acheter un numéro de téléphone virtuel, rendez-vous sur votre tableau de bord API et suivez les étapes ci-dessous.

Steps on how to purchase a phone number from the dashboard, from selecting the number and confirming the selection.Purchase a phone number

  1. Accédez à votre tableau de bord API

  2. Naviguez vers CONSTRUIRE & GERER > Numbers > Acheter des Numbers.

  3. Choisissez les attributs nécessaires et cliquez sur Rechercher

  4. Cliquez sur le bouton Acheter à côté du numéro désiré et validez votre achat

  5. Pour confirmer que vous avez acheté le numéro virtuel, allez dans le menu de navigation de gauche, sous CONSTRUIRE & GÉRER, cliquez sur Numéros, puis sur Vos Numéros

Comment fonctionne le SMS entrant ?

Vous vous demandez peut-être comment un SMS passe du téléphone d'un utilisateur à votre application Rails. De la même manière que pour les accusés de réception dans l'article précédent, Vonage s'occupe de l'interaction avec le réseau mobile. Ensuite, il transmet ces informations à un webhook que vous définissez dans votre application Vonage. Dans ce tutoriel, nous utiliserons ngrok pour gérer le webhook et le transmettre à notre application Rails.

Infographic titled 'Inbound SMS' showing how an SMS is sent from a user, processed through the Vonage platform, and delivered to an application via an API and webhook callback.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.

Comment exposer une application Ruby on Rails avec ngrok

Vous pouvez utiliser ngrok pour exposer publiquement et en toute sécurité votre serveur local via HTTP. Ainsi, dans un onglet séparé de votre serveur rails, ouvrez un tunnel ngrok sur le port 3000.

ngrok http 3000

Veillez à ajouter l'URL de votre ngrok en tant qu'élément de config.host dans votre fichier development.rb dans votre fichier development.rb. Nous allons utiliser la variable d'environnement VONAGE_SERVER_HOSTNAMEpour rendre notre application plus dynamique.

Pour plus d'aide, voir Comment démarrer et utiliser ngrok dans Rails.

# config/environments/development.rb

Rails.application.configure do
   config.hosts << ENV['VONAGE_SERVER_HOSTNAME']

Si vous n'avez pas créé de fichier .env auparavant, assurez-vous de le faire à la racine de votre application et ajoutez vos informations d'identification Vonage et l'URL ngrok :

VONAGE_APPLICATION_ID='XXXX'
VONAGE_PRIVATE_KEY='./private.key'
VONAGE_SERVER_HOSTNAME='XXXXXX.ngrok.app

>> Sécurisez vos données d'identification

>> Ne livrez jamais les fichiers .env à votre dépôt ! Assurez-vous que .env est dans votre .gitignore.

Nous devons maintenant mettre à jour notre application Vonage (des articles précédents) dans le tableau de bord du développeur. Cliquez sur 'edit'. Maintenant, mettez à jour l'URL entrante sous les capacités de messages. Ajoutez votre URL ngrok suivie de /inbound_sms.

Une fois que vous aurez appuyé sur save, ngrok transmettra les requêtes faites au point de terminaison /inbound_sms à votre application Rails ! Mais il y a un petit problème : notre application Rails n'a pas ce point de terminaison.

Comment gérer un SMS entrant WebHooks dans Rails

Maintenant que Vonage transmet une charge utile SMS à l'application /inbound_sms mettons à jour notre application et créons une route pour le gérer.

# config/routes.rb

Rails.application.routes.draw do
  resources :inbound_sms, only: [:create]
  ....remaining routes...

Lorsqu'un SMS a été envoyé à votre numéro virtuel Vonage, Vonage en informe votre application en envoyant un webhook. La charge utile typique d'un SMS entrant ressemble à ceci.

{
    "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"
    }
  }

Comment stocker un message SMS à partir de Rails

Maintenant que nous disposons de toutes les informations nécessaires basées sur notre modèle SMS tel que défini précédemment, nous pouvons créer une certaine logique pour stocker nos SMS entrants. Nous allons également ajouter une fonctionnalité amusante pour montrer que notre code fonctionne. Générons un nouveau contrôleur pour gérer cela.

rails g controller InboundSms create

À l'intérieur de notre contrôleur, nous aurons une simple fonction create qui analyse le webhook et entre un SMS dans notre base de données. Vous noterez que nous avons mis is_inbound à 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


Pour prouver que nous avons bien reçu le SMS, nous enverrons une réponse à l'expéditeur. Amusons-nous un peu, en montrant le texte original d'abord sans les voyelles, puis en binaire.


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

La méthode de réponse repose sur le client Vonage, nous devons donc l'initialiser comme nous l'avons fait dans le premier article.

 vonage = Vonage::Client.new(
 	application_id: ENV["VONAGE_APPLICATION_ID"],
private_key: ENV["VONAGE_PRIVATE_KEY"]
)

Voir comment tout le code s'articule dans le fichier complet inbound_sms_controller.rb complet.

Conclusion

Nous vous félicitons ! Vous avez réussi à créer une application SMS Ruby on Rails capable de recevoir des messages entrants à l'aide d'un webhook Vonage. Vous avez ainsi terminé la partie SMS du cours Ruby on Rails Quickstart. Nous ajouterons des capacités vocales avec l'API Voice de Vonage dans les prochains tutoriels.

Si vous avez des questions ou souhaitez demander une fonctionnalité pour l'application Quickstart, rejoignez la conversation sur le site Vonage. Communauté Vonage ou contactez-nous sur X (anciennement Twitter). Nous serions ravis d'entendre ce que vous allez construire !

Partager:

https://a.storyblok.com/f/270183/384x384/e4e7d1452e/benjamin-aronov.png
Benjamin AronovDéfenseur des développeurs

Benjamin Aronov est un défenseur des développeurs chez Vonage. C'est un bâtisseur de communauté qui a fait ses preuves, avec une formation en Ruby on Rails. Benjamin apprécie les plages de Tel Aviv, où il vit. Sa base à Tel Aviv lui permet de rencontrer et d'apprendre de certains des meilleurs fondateurs de startups du monde. En dehors de la technologie, Benjamin aime voyager à travers le monde à la recherche du parfait pain au chocolat.