Phil Leggetterによるこの短いチュートリアルでは、LaravelアプリでSMSを送受信する方法について説明します。 電話番号の初期化、SMSの送受信(使用する)、および通話を行うためのAPIを提供するクラウド通信プラットフォームであるNexmoを使用して、この機会を実現します。
前提条件
Nexmo CLI (コマンドラインインターフェイス)によってインストールされた Nexmo アカウントと、事前にインストールされたLaravelアプリケーションが必要です。 さらに、NexmoサービスがローカルWebサーバーにHTTPリクエストを送信できるように、ローカルトンネリングが必要になります。 ngrokをお勧めします 。
はじめに
まず、Laravel SMSアプリケーションを作成します。
composer create-project --prefer-dist laravel/laravel laravel-sms cd laravel-sms
次に、 Nexmo Laravelパッケージをcomposer.jsonに追加します 。
"require": { ..., "nexmo/laravel": "dev-master as 1.0", "nexmo/client": "dev-master as 1.0" },
注:これらのパッケージがベータ版から出る場合、
nexmo/laravel
を有効にするだけで、
nexmo/client
が依存関係として自動的に追加されます。
Nexmoサービスプロバイダーを
app.php
構成ファイルに追加します。
'providers' => [ ..., Nexmo\Laravel\NexmoServiceProvider::class ]
注:ファサードを使用する場合は、
aliases
追加することもできます。
パッケージをインストールし、Nexmo構成ファイルをコピーします。
› composer update php artisan vendor:publish
最後に、Nexmo APIキーとAPIシークレットを
/config/nexmo.php
に追加し、NexmoダッシュボードのAPI設定に含まれる値に基づいてAPI_KEYとAPI_SECRETの値を更新します。
'api_key' => 'API_KEY', 'api_secret' => 'API_SECRET',
注:オプションで
.env
および
env(...)
値を宣言できます。
SMS送信
注:簡単にするために、すべての機能を
app/Http/routes.php
追加し
app/Http/routes.php
。
app/Http/routes.php
次のルートを追加し
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']); });
上記のコードでは、
@leggetter
値が含まれていることに注意して
@leggetter
。 これは英国で機能しますが、他の国では機能しません。
実際の番号を使用する必要がある人のために、既存の番号の使用とその購入について見てみましょう。
部屋のリスト、検索、レンタル
このレッスンの前提条件の1つは、 Nexmo CLIです。 アカウントに関連付けられている電話番号(正確には仮想番号)の操作など、多くのアクションに使用できます。 まだ行っていない場合は、CLIをインストールして構成する必要があります
API_KEY
と
API_SECRET
は、以前に使用したAPI資格情報に置き換える必要があります。
› npm install -g nexmo-cli nexmo setup API_KEY API_SECRET
これで、すでにレンタルした利用可能な部屋を表示したり、レンタル可能な部屋を探したり、特定の部屋をレンタルまたはキャンセルしたりできます。 まず、アカウントで既に利用可能な番号のリストを見てみましょう。
› nexmo number:list 14155550123
上記の例では、数字があります。 部屋がない場合は、レンタル番号を検索できます。 このために知っておく必要があるのは、 ISO 3166-1 alpha-2形式の国コードの2文字です 。 実際、これは思ったより簡単です。 たとえば、英国の場合はGBであり、米国の場合はUSです。 アメリカでレンタル番号を見つけましょう:
› nexmo number:search US 14155550111 14155550222 14155550333
番号がない場合は購入する必要があります。その後、実際の発信番号を必要とする国でSMSを送受信できます。
› nexmo number:buy 14155550111 --confirm Number purchased: 14155550111
最後に、SMSを送信します!
次に、購入したばかりの番号を使用するようにコードを更新する必要があります。 これを行うには、次の例のように、
from
値を
env('NEXMO_NUMBER')
に変更します。
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']); });
次に、サーバーを起動します。
› php artisan serve Laravel development server started on http://localhost:8000/
http://localhost:8000/sms/send/YOUR_NUMBER
。ここで、
YOUR_NUMBER
は、国番号を含むE.164形式の実数に置き換える必要があります。 上記のすべての例で示されたのと同じ形式で。
storage/logs/laravel.log
には、送信されたばかりのメッセージに関連するログエントリが表示されます。たとえば、エントリの最後にあるメッセージの一意の識別子が含まれます。
[2016-08-02 13:45:01] local.INFO: sent message: 03000000068F5D97
着信SMSを受信する
アプリケーションが着信SMSを受信するには、いくつかのアクションを実行する必要があります。
- アプリケーションがローカルトンネルを介してNexmoに表示されることを確認します
- SMSを受信するためのルートを作成します
- SMSを受信するルートのCSRFを無効にする
- メッセージを受信したときにwebhookを呼び出すルートをNexmoに伝えます。
Nexmoプラットフォームにローカルトンネルを介してアプリケーションへのアクセスを許可することから始めましょう。 ngrokを使用していて、Laravel Webサーバーがポート8000でリッスンしていると仮定すると、次のようにこれを実行できます。
› 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
上記のように、ngrokのサブドメインが正常に作成されたことがわかり、そのサブドメインへの要求はすべて、
localhost:8000
トンネリングされます。
次に、
routes.php
ファイルでSMSを受信するためのルートを作成する必要があります。
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){ });
デフォルトでは、LaravelはCSRFトークンなしでこのルートのPOSTリクエストを見逃しません。 このルートのリクエストはトークンを持たないNexmoによって行われるため、このルートのCSRFを無効にする必要があります。
App/Http/Middleware/VerifyCsrfToken.php
次を追加します。
protected $except = [ '/sms/receive' ];
最後に、SMSを受信したときにwebhook呼び出しを行うルートをNexmoに知らせましょう。 Nexmo CLIでこれを行うことができます。 次のコマンドを実行するときは、レンタルした電話番号とngrokサブドメインを使用する必要があります。
› nexmo link:sms 14155550111 https://814882e9.ngrok.io/sms/receive Number updated
このコマンドを実行すると、Nexmoサービスはroute
/sms/receive
呼び出しを試行し、ngrokターミナルにリクエストが表示されるはずです。
HTTP Requests ------------- POST /sms/receive 200 OK
Nexmo PHPクライアントライブラリは、NexmoからLaravelアプリケーションに送信されたHTTPパラメーターを簡単にキャプチャし、
InboundMessage
インバウンドメッセージ
InboundMessage
を作成する
InboundMessage
します。 次のように、ルートコード
/sms/receive
を更新します。
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){ $message = \Nexmo\Message\InboundMessage::createFromGlobals(); Log::info('got text: ' . $message->getBody()); });
その後、レンタル番号にSMSを送信し、
storage/logs/laravel.log
を確認します。送信したメッセージはログに記録されているはずです。
[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.
着信SMSへの自動返信
そして最後に、着信メッセージの自動応答を作成しましょう。 Nexmo PHPクライアントは、
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']); });
レンタルした番号にメッセージを送信すると、自動応答が届きます。 それはほとんど魔法です!
おわりに
このチュートリアルでは、Nexmoクラウド通信プラットフォームを使用したLaravelアプリケーションで、SMSの送受信、さらにはSMSへの自動返信を実装するために知っておく必要のあるすべてを取り上げました。
このレッスンのコードはgithub.com/nexmo-community/laravel-smsにあります。