https://a.storyblok.com/f/270183/1368x665/e3a515fda7/25apr_dev-blog_ruby-sms-status.jpg

SMS-Nachrichtenstatus mit Ruby on Rails empfangen

Zuletzt aktualisiert am May 1, 2025

Lesedauer: 4 Minuten

Zuvor haben wir gelernt wie man SMS-Nachrichten versendet mit der Ruby on Rails SMS-Integration. Das Versenden einer SMS sollte sich jedoch nicht wie das Versenden einer Flaschenpost anfühlen. Mit SMS Ruby on Rails-Anwendungen können wir die Zustellung von Nachrichten verfolgen und die Zuverlässigkeit sicherstellen. Zum Glück gibt es das und noch viel mehr mit der Messages API und SMS-Nachrichtenstatus.

Dieses Tutorial zeigt Ihnen, wie Sie den Status der SMS-Zustellung in eine Ruby on Rails-Anwendung mit Vonage Webhooks integrieren können.

TL;DR Überspringen Sie den Anfang und finden Sie den gesamten Schnellstart-Code auf GitHub.

Voraussetzungen

  • Ein ngrok-Konto

  • Virtuelle Nummer von Vonage

  • Ruby on Rails-Anwendung, wie zuvor beschrieben

Um eine virtuelle Rufnummer zu kaufen, gehen Sie zu Ihrem API-Dashboard und befolgen Sie die unten aufgeführten Schritte.

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

  1. Gehen Sie zu Ihrem API-Dashboard

  2. Navigieren Sie zu BUILD & MANAGE > Numbers > Buy Numbers.

  3. Wählen Sie die gewünschten Attribute und klicken Sie dann auf Suchen

  4. Klicken Sie auf die Schaltfläche Kaufen neben der gewünschten Nummer und bestätigen Sie Ihren Kauf.

  5. Um zu bestätigen, dass Sie die virtuelle Nummer erworben haben, gehen Sie im linken Navigationsmenü unter BUILD & MANAGE auf Numbers und dann auf Your Numbers

Was ist der Status einer SMS-Nachricht?

Wenn Sie eine Anfrage zum Senden einer SMS absetzen, ist dies nur der erste Schritt auf dem Weg dorthin. Wenn Sie eine erfolgreiche SMS-Anfrage stellen, wird Vonage Warteschlange die SMS in die Warteschlange und sucht den besten Netzbetreiber für die Zustellung der SMS. Von dort aus wird der Netzbetreiber die Anfrage erfüllen und die SMS an den Empfänger senden.

Infographic titled 'What is an SMS Message Status?' showing an SMS flow from an application via Vonage's API to a carrier and user. It illustrates message requests, delivery, and callback notifications using icons for API, webhook, carrier, and user devices.Diagram explaining SMS Message Status, showing how messages travel from an application through Vonage and carriers to the user, with delivery status callbacks.

Anschließend wird in umgekehrter Reihenfolge (Netzbetreiber -> Vonage -> Ihre App) ein Nachrichtenstatus (MS) darüber gesendet, ob die SMS erfolgreich zugestellt wurde oder nicht.

Um diese MS in Ihrer Anwendung zu empfangen, müssen Sie einen Webhook-Endpunkt einrichten, der Vonage mitteilt, wohin die MS zu senden ist.

Wie wir unsere Ruby on Rails App mit ngrok öffentlich zugänglich machen

Vonage muss den Status unserer Nachrichten an einen Endpunkt senden. Unsere Ruby on Rails-Anwendung läuft in der Entwicklung auf Port 3000, so dass wir sie lokal unter localhost:3000 erreichen können. Das funktioniert allerdings nur auf unserem Computer!

Sie können ngrok verwenden, um Ihren lokalen Server sicher über HTTP öffentlich zu machen. So, jetzt in einem separaten Registerkarte Ihres Rails-Servers einen ngrok-Tunnel auf Port 3000.

ngrok http 3000

Stellen Sie sicher, dass Sie Ihre ngrok-URL als config.host in Ihrer development.rb-Datei hinzufügen. Wir verwenden die Umgebungsvariable VONAGE_SERVER_HOSTNAMEverwenden, um unsere Anwendung dynamischer zu gestalten.

Für weitere Hilfe, siehe wie man anfängt und ngrok in Rails benutzt.

# config/environments/development.rb

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

Setzen Sie nun in unserer .env Datei den 'VONAGE_SERVER_HOSTNAME' auf Ihre ngrok URL.

# .env

# ngrok URL, don't include the protocol (https://)
VONAGE_SERVER_HOSTNAME=''

Außerdem müssen wir unsere Vonage-Anwendung (aus dem vorherigen Artikel) in dem Dashboard um die ngrok-URL in unsere Webhooks einzufügen. Fügen Sie in das Feld Status URL Ihre ngrok URL ein, gefolgt von /sms_message_status.

Screenshot of Vonage Messages API settings with fields for Inbound URL and Status URL. The Inbound URL field has an error message indicating an invalid URL.Vonage Messages API webhook settings showing an invalid Inbound URL error.Sobald Sie auf "Speichern" klicken, wird ngrok nun Anfragen an den Endpunkt /sms_message_status an Ihre Rails-Anwendung weiterleiten! Aber es gibt ein kleines Problem: Unsere Rails-Anwendung hat diesen Endpunkt nicht.

Wie man Lieferungseingang-Webhooks in Rails handhabt

Da Vonage nun Statusmeldungen an den Endpunkt /sms_delivery_receipts Endpunkt weiterleitet, müssen wir unsere Anwendung aktualisieren und eine Route erstellen, um dies zu verarbeiten.

# config/routes.rb
Rails.application.routes.draw do

 # For SmsMessageStatus controller, create
  post '/sms_message_status', to: 'sms_message_status#create', as: :sms_message_status

	...previous routes...

Aber was wird dort passieren? Unsere Anwendung akzeptiert den Meldungsstatus und analysiert ihn nach den relevanten Informationen. Sie können sehen, wie ein typischer Nachrichtenstatus aussieht:

{
"to"=>"13215678899",
"from"=>"John",
"channel"=>"sms",
"message_uuid"=>"93cc5afe-2824-4d40-97b1-e6f6ec00249e", 
"timestamp"=>"2025-02-23T14:52:53Z",
"status"=>"delivered", 
"destination"=> {"network_code"=>"42507"}
}

Das wichtigste Feld ist der Status denn es gibt Auskunft darüber, ob Ihre Nachricht zugestellt wurde und, falls nicht, was schief gelaufen ist. Weitere Informationen über Nachrichtenstatus Webhaken.

Wir werden eine Logik erstellen, um unseren SMS-Status auf der Grundlage der empfangenen Nachrichtenstatus zu aktualisieren. Lassen Sie uns einen neuen Controller in der Befehlszeile erstellen, um dies zu erledigen.


rails g controller SmsMessageStatus create

Unser Controller hat eine einzige, einfache create Methode. Zunächst analysiert die Methode unseren Nachrichtenstatus und extrahiert die message_uuid; sie verwendet diese fremde ID, um die SMS in unserer lokalen Datenbank zu finden. Anschließend wird der Status für diese SMS auf den aktuellen Status aktualisiert, den wir im Nachrichtenstatus erhalten haben.

class SmsMessageStatusController < ApplicationController
  skip_before_action :verify_authenticity_token

  def create
   SmsMessage.where(message_uuid: params[:sms_message_status][:message_uuid])
       .update_all(status: params[:sms_message_status][:status]) if params[:sms_message_status][:message_uuid]

    # Return an empty HTTP 200 status
    head :ok
  end
end

Sie können nun eine SMS senden und Ihren Rails-Server beobachten, um zu sehen, dass der Webhook aufgerufen und weitergeleitet wird und ActiveRecord die Datenbank aktualisiert!

Screenshot of a console log displaying an inbound SMS delivery receipt request, JSON parameters, and an SQL update query marking an SMS message as 'submitted' in a Vonage Rails application.Console log showing the processing of an SMS delivery receipt in a Vonage Rails application, including a database update query.

Schlussfolgerung

Sie haben es geschafft! Sie haben gelernt, wie Sie Ihre Ruby on Rails-Anwendung so einrichten, dass sie über ngrok auf einen Webhook wartet und dabei Ihre Datenbank aktualisiert! Im nächsten Beitrag werden wir auf dieser Anwendung weiter aufbauen, indem wir eingehende SMS akzeptieren.

Wenn Sie Fragen oder Vorschläge für weitere Ruby-Inhalte haben, schicken Sie uns eine Nachricht auf dem Gemeinschaft Slack. Sie können sich auch über unsere Inhalte und Veranstaltungen für Entwickler auf dem Laufenden halten X, früher bekannt als Twitter.

Teilen Sie:

https://a.storyblok.com/f/270183/384x384/e4e7d1452e/benjamin-aronov.png
Benjamin AronovAdvokat für Entwickler

Benjamin Aronov ist ein Entwickler-Befürworter bei Vonage. Er ist ein bewährter Community Builder mit einem Hintergrund in Ruby on Rails. Benjamin genießt die Strände von Tel Aviv, das er sein Zuhause nennt. Von Tel Aviv aus kann er einige der besten Startup-Gründer der Welt treffen und von ihnen lernen. Außerhalb der Tech-Branche reist Benjamin gerne um die Welt auf der Suche nach dem perfekten Pain au Chocolat.