Senden und Empfangen von SMS mit Laravel und Nexmo

Ursprünglicher Autor: Phil Leggetter
  • Übersetzung
  • Tutorial
Bild

In diesem kurzen Tutorial von Phil Leggetter erfahren Sie, wie Sie SMS in der Laravel-App senden und empfangen. Wir nutzen diese Möglichkeit mit Nexmo , einer Cloud-Kommunikationsplattform, die APIs zum Initialisieren von Telefonnummern, zum Senden und Empfangen von SMS (die wir verwenden werden) sowie zum Tätigen von Anrufen bietet.


Voraussetzungen


Wir benötigen ein von Nexmo CLI (Befehlszeilenschnittstelle) installiertes Nexmo- Konto sowie Ihre vorinstallierte Laravel-Anwendung. Darüber hinaus benötigen Sie lokales Tunneln, damit der Nexmo-Dienst eine HTTP-Anforderung an den lokalen Webserver senden kann. Wir empfehlen ngrok .


Einführung


Zunächst erstellen wir unsere Laravel-SMS-Anwendung:
composer create-project --prefer-dist laravel/laravel laravel-sms
cd laravel-sms

Fügen Sie als Nächstes das Nexmo Laravel-Paket zu composer.json hinzu:
"require": {
    ...,
    "nexmo/laravel": "dev-master as 1.0",
    "nexmo/client": "dev-master as 1.0"
},

Hinweis: Wenn diese Pakete aus der Beta-Version kommen, müssen Sie nur das Paket aktivieren nexmo/laravelund nexmo/clientwerden automatisch als Abhängigkeit hinzugefügt.

Fügen Sie den Nexmo-Dienstanbieter zu Ihrer Konfigurationsdatei hinzu app.php:
'providers' => [
    ...,
    Nexmo\Laravel\NexmoServiceProvider::class
]

Hinweis: Sie können es auch hinzufügen, aliaseswenn Sie die Fassade verwenden möchten.

Installieren Sie die Pakete und kopieren Sie die Nexmo-Konfigurationsdatei:
› composer update
php artisan vendor:publish

Fügen Sie abschließend den Nexmo-API-Schlüssel und das API-Geheimnis /config/nexmo.phphinzu und aktualisieren Sie die Werte für API_KEY und API_SECRET basierend auf den Werten, die in den API-Einstellungen im Nexmo-Dashboard enthalten sind.
'api_key' => 'API_KEY',
'api_secret' => 'API_SECRET',

Hinweis: Sie können optional Werte in .envund deklarieren env(...).


SMS senden


Hinweis: Der Einfachheit halber werden wir alle Funktionen hinzufügen app/Http/routes.php.

Fügen Sie die folgende Route hinzu app/Http/routes.php:
Route::get('/sms/send/{to}', function(\Nexmo\Client $nexmo, $to){
    $message = $nexmo->message()->send([
        'to' => $to,
        'from' => '@leggetter',
        'text' => 'Sending SMS from Laravel. Woohoo!'
    ]);
    Log::info('sent message: ' . $message['message-id']);
});

Es ist erwähnenswert, dass der obige Code fromeinen Wert enthält @leggetter. Dies wird in Großbritannien funktionieren, jedoch nicht in anderen Ländern.

Bild


Для тех из вас, кому нужно использовать реальный номер, давайте рассмотрим использование существующего номера, а так же его покупку.


Листинг, поиск и аренда номеров


Одной из предпосылок для этого урока был Nexmo CLI. Мы можем использовать его для множества действий, в том числе для работы с телефонными номерами (виртуальными номерами, если быть точным), которые связаны с нашей учетной записью. Если вы еще не сделали этого, вы должны установить и настроить CLI, где API_KEY и API_SECRET должны быть заменены учетными данными API, которые использовались ранее:
› npm install -g nexmo-cli
nexmo setup API_KEY API_SECRET

Jetzt können wir die verfügbaren Zimmer anzeigen, die wir bereits gemietet haben, nach verfügbaren Zimmern suchen sowie ein bestimmtes Zimmer mieten oder stornieren. Schauen wir uns zunächst die Liste der Nummern an, die bereits auf unserem Konto verfügbar sind:
› nexmo number:list
14155550123

Im obigen Beispiel habe ich eine Nummer. Wenn Sie kein Zimmer haben, können Sie nach Mietnummern suchen. Dazu müssen Sie lediglich zwei Zeichen des Ländercodes im ISO 3166-1 Alpha-2-Format kennen . In der Tat ist dies einfacher als es klingt. Zum Beispiel ist es für Großbritannien GB und für die Vereinigten Staaten USA (ungefähr übersetzt: für Russland - RU ). Lassen Sie uns eine Mietnummer in den USA finden:
› nexmo number:search US
14155550111
14155550222
14155550333

Wenn Sie keine Nummer haben, müssen Sie diese kaufen. Danach können Sie in den Ländern, in denen eine echte ausgehende Nummer erforderlich ist, SMS senden und empfangen.
› nexmo number:buy 14155550111 --confirm
Number purchased: 14155550111


Endlich SMS senden!


Jetzt müssen Sie den Code aktualisieren, um die gerade gekaufte Nummer zu verwenden. Um dies zu tun, ändern Sie den Wert fromauf dem env('NEXMO_NUMBER')wie im Beispiel unten:
Route::get('/sms/send/{to}', function(\Nexmo\Client $nexmo, $to){
    $message = $nexmo->message()->send([
        'to' => $to,
        'from' => env('NEXMO_NUMBER'),
        'text' => 'Sending SMS from Laravel. Woohoo!'
    ]);
    Log::info('sent message: ' . $message['message-id']);
});

Starten Sie dann den Server:
› php artisan serve
Laravel development server started on http://localhost:8000/

Und gehen http://localhost:8000/sms/send/YOUR_NUMBERSie dorthin, wo es YOUR_NUMBERdurch die reale Nummer einschließlich des Ländercodes im E.164- Format ersetzt werden soll , d. H. im gleichen Format, das in allen obigen Beispielen gezeigt wurde.

In der Datei sehen storage/logs/laravel.logSie einen Protokolleintrag, der sich auf die gerade gesendete Nachricht bezieht, einschließlich einer eindeutigen Kennung für die Nachricht am Ende des Eintrags, zum Beispiel:
[2016-08-02 13:45:01] local.INFO: sent message: 03000000068F5D97


Eingehende SMS empfangen


Damit unsere Anwendung eingehende SMS empfangen kann, müssen wir verschiedene Aktionen ausführen:
  1. Stellen Sie sicher, dass die Anwendung für Nexmo durch den lokalen Tunnel sichtbar ist
  2. Erstellen Sie eine Route zum Empfangen von SMS
  3. Deaktivieren Sie CSRF für den Routenempfang von SMS
  4. Teilen Sie Nexmo mit, auf welcher Route der Webhook aufgerufen werden soll, wenn er die Nachricht empfängt.


Beginnen wir damit, der Nexmo-Plattform über einen lokalen Tunnel Zugriff auf unsere Anwendung zu gewähren. Angenommen, Sie verwenden ngrok und Ihr Laravel-Webserver überwacht Port 8000, können Sie dies wie folgt tun:
› ngrok http 8000
ngrok by @inconshreveable                                                (Ctrl+C to quit)
Tunnel Status                 online
Version                       2.1.3
Region                        United States (us)
Web Interface                 http://127.0.0.1:4041
Forwarding                    http://814882e9.ngrok.io -> localhost:8000
Forwarding                    https://814882e9.ngrok.io -> localhost:8000
Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

Sie können oben sehen, dass die Subdomain auf ngrok erfolgreich erstellt wurde und jetzt alle Anforderungen an unseren lokalen Host getunnelt werden localhost:8000.

Jetzt müssen Sie eine Route erstellen, um SMS in einer Datei zu empfangen routes.php:
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){
});


Standardmäßig verpasst Laravel keine POST-Anforderungen für diese Route ohne CSRF-Token . Da eine Anfrage für diese Route von Nexmo gestellt wird, das kein Token hat, müssen wir CSRF für diese Route deaktivieren. Fügen Sie App/Http/Middleware/VerifyCsrfToken.phpFolgendes hinzu:
protected $except = [
    '/sms/receive'
];

Lassen Sie Nexmo schließlich wissen, auf welcher Route der Webhook-Anruf getätigt werden soll, wenn eine SMS empfangen wird. Wir können dies mit der Nexmo CLI tun. Wenn Sie den folgenden Befehl ausführen, müssen Sie die von Ihnen gemietete Telefonnummer sowie Ihre ngrok-Subdomain verwenden:
› nexmo link:sms 14155550111 https://814882e9.ngrok.io/sms/receive
Number updated

Wenn Sie diesen Befehl ausführen, versucht der Nexmo-Dienst, Ihre Route aufzurufen /sms/receive, und im ngrok-Terminal sollte eine Anforderung angezeigt werden:
HTTP Requests
-------------
POST /sms/receive              200 OK


Die Nexmo PHP-Clientbibliothek bietet die Möglichkeit, die von Nexmo an die Laravel-Anwendung gesendeten HTTP-Parameter einfach zu erfassen und ein eingehendes Nachrichtenobjekt zu erstellen, InboundMessagemit dem wir arbeiten können. Aktualisieren Sie den Routencode /sms/receivewie folgt:
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){
    $message = \Nexmo\Message\InboundMessage::createFromGlobals();
    Log::info('got text: ' . $message->getBody());
});

Senden Sie danach eine SMS an die gemietete Nummer und prüfen Sie, storage/logs/laravel.logob die von Ihnen gesendete Nachricht im Protokoll enthalten ist.
[2016-08-02 13:45:01] local.INFO: sent message: 03000000068F5D97  
[2016-08-02 14:20:50] local.INFO: sent message: 0300000006917797  
[2016-08-02 14:21:17] local.INFO: got text: Sending one back.


Bild



Automatische Antwort auf eingehende SMS


Und schließlich erstellen wir einen Autoresponder für eine eingehende Nachricht. Der Nexmo PHP-Client bietet eine gute Möglichkeit, dies mithilfe der folgenden Funktion zu tun InboundMessage->createReply:
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){
    $message = \Nexmo\Message\InboundMessage::createFromGlobals();
    Log::info('got text: ' . $message->getBody());
    $reply =$nexmo->message()->send($message->createReply('Laravel Auto-Reply FTW!'));
    Log::info('sent reply: ' . $reply['message-id']);
});

Senden Sie eine Nachricht an die gemietete Nummer und Sie erhalten eine automatische Antwort. Es ist fast magisch!

Bild



Fazit


In diesem Tutorial haben wir alles behandelt, was Sie wissen müssen, um das Senden und Empfangen von SMS und sogar die automatische Antwort auf SMS in der Laravel-Anwendung mithilfe der Nexmo Cloud-Kommunikationsplattform zu implementieren.

Den Code für diese Lektion finden Sie unter github.com/nexmo-community/laravel-sms .

Jetzt auch beliebt: