
九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、Laravel好きな私からすると新しい機能や体験していない機能は最低1度は今後の開発のために触って見るようにしているのですが、そんな中でも少しだけ敷居が高いというか「ちょっとめんどう」感が出てしまうものがあります。
それが、課金が必要になる機能です。
そして、その中で気になっていたのが「SMS(ショートメッセージ)送信機能」。
SMSとは、電話番号を使ってメッセージを送信するサービスのことで、最近では入力された携帯番号が本当に正しいかをチェックするためにSMSで「認証番号」を送信し、その番号を入力してもらうという形をとっていたりします。
Laravelでは、SMS機能をNotification
とNexmoというサイト連携させて利用できるようになっているのですが、クレジットカードの登録などが少しめんどうだなと思いずっと実行しないままになっていましたが、最近Nexmo
には無料のトライアル版があることを知りました。
そこで!今回はその少し重たい腰を上げて、LaravelからSMSを送信する方法を紹介したいと思います。
ぜひ皆さんのお役に立てると嬉しいです。
実行環境: Laravel 5.8
目次 [非表示]
SMSを使う準備をする
Nexmoにアカウントをつくる
Nexmo
とは、SMS
を送信するなど様々なサービスを展開しているウェブサイトですが、Laravel
のNotification
では、このNexmo
を使ってSMS
を送信します。
ということで、まずはトップページへアクセスしてアカウントを作成しましょう。
まずは「TRY IT FREE」ボタンをクリックします。
すると、以下のようなアカウント入力フォームが表示されるので入力します。以下は赤枠の必須項目です。
- First name ・・・ 名
- Last name ・・・ 姓
- Email address ・・・ メールアドレス
- Phone number ・・・ 電話番号 ※注1
- Password ・・・ パスワード
※注1:電話番号は、例えば「090-****-****」の場合「90-****-****」を入力してください。国際電話を掛ける場合と同じですね。
入力が終わったら「Sign up」ボタンをクリックします。
すると、すぐにページが移動し、入力した携帯番号に以下のようなSMS
が送信されて来ますのでその認証番号を入力して送信してください。(すみませんフォームのキャプチャ取り忘れました)
また、入力したメールアドレスにメールアドレスを有効にする以下のようなメッセージが届いているので赤枠の部分をクリックします。
これでアカウントの作成は完了しました!
※ ちなみに、Nexmoの無料トライアルの制限は以下の3つになります。
- 無料で使えるのは€2(2ユーロ)まで
- アカウント登録した電話番号以外に送信するにはあらかじめ「テスト電話番号」を登録しておかないといけない。
- 送信されたショートメッセージの最後に「FREE SMS DEMO, TEST MESSAGE」というテキストが追加される
Laravel側の準備をする
APIキーを設置する
Nexmo
にアカウントを作成したら、次はLaravel
側の準備です。
ログインした状態で、画面左側メニューの「Getting started」をクリックします。
すると、次の画面ではLaravelで必要になるNexmo
のAPIキーが表示されているので、これを.env
に書き込んでおきましょう。
NEXMO_KEY=*******
NEXMO_SECRET=****************
また、このキーをNotification
が参照できるようにconfig/services.php
にも以下のように記述を追加しておきます。
<?php
return [
// 省略
'nexmo' => [
'key' => env('NEXMO_KEY'),
'secret' => env('NEXMO_SECRET'),
'sms_from' => '8190********',
],
];
※ sms_from
は、送信元になる電話番号です。
そして、LaravelでNexmoを使うために専用パッケージが用意されているので、以下のcomposer
コマンドでインストールします。
composer require laravel/nexmo-notification-channel
usersテーブルに電話番号の項目を追加する
(注意)すでにphp artisan make:auth
でユーザー認証システムが作成されていることが前提です。詳しくは、【Laravel5.6】インストール直後にやること3点の「ログイン、パスワードリマインダー機能を構築」をご覧ください。
SMSを使ったNotification
は、users
テーブルのphone_number
というフィールドを参照するようになっていますが、phone_number
はデフォルトでは用意されていないので、独自に追加します。
まずは以下のコマンドでマイグレーションを作成します。
php artisan make:migration add_phone_number_to_users_table
そして、作成されたdatabase/migrations/****_**_**_******_add_phone_number_to_users_table.php
を開いて以下のようにします。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddPhoneNumberToUsersTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('phone_number')
->nullable()
->after('email_verified_at');
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('phone_number');
});
}
}
そして、忘れてはいけないマイグレーションの実行です。
php artisan migrate
実行が完了するとテーブルはこのようになります。
これでLaravel側の準備も完了です。
SMS送信するコードをつくる
では、ここからが実際にSMS送信する部分になります。
冒頭でも書きましたが、SMSはLaravelのNotification
を使って送信しますので、まずは専用のファイルを以下のコマンドで作成します。
php artisan make:notification SmsNotification
そして、作成されたapp/Notifications/SmsNotification.php
を開いて中身を以下のようにします。(太字が変更、追加したところです)
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\NexmoMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class SmsNotification extends Notification
{
// 省略
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['nexmo'];
}
/**
* Get the Nexmo / SMS representation of the notification.
*
* @param mixed $notifiable
* @return NexmoMessage
*/
public function toNexmo($notifiable)
{
return (new NexmoMessage())
->content('こんにちは!SMSの送信テストです。')
->unicode();
}
// 以下省略
}
テスト送信する
では、全ての作業が完了したのでテストとして以下のコードを実行してSMS
を送信してみましょう。
<?php
namespace App\Http\Controllers;
// 省略
use App\Notifications\SmsNotification;
class HomeController extends Controller
{
public function sms() {
$user = \App\User::find(1);
$user->notify(new SmsNotification());
}
※ 送信するユーザーのphone_number
に(アカウント登録した)電話番号が登録されていることを確認してから実行してください。(電話番号は国番号81 + 最初のゼロを抜かした番号です)
※ またもし、Nexmoのアカウントがトライアル版の場合、その他の電話番号に送信する場合はテスト番号登録をしておく必要があります。詳しくは、「ちなみに:アカウントの電話番号以外に送信テストするには」をご覧ください。
すると以下のようなメッセージが送信されてきました。
成功です!
ちなみに – 1:アカウントの電話番号以外に送信テストするには
Nexmo
がトライアル版の場合、アカウント登録された電話番号以外へSMS送信するためには「テスト電話番号」を登録事前に登録しておく必要があります。手順は次のとおりです。
ログインすると画面左側のメニューにTest numbers
という項目が出ているのでこれをクリックします。
すると以下のような番号を登録するフォームが表示されるのでテスト用の電話番号(これも国際電話と同じく最初のゼロを抜かした番号)を登録して「Add」ボタンをクリックしましょう。
ボタンをクリックするとアカウントに登録した番号にSMSで認証番号が送信されてきますので、その番号を以下のように入力して「Verify」ボタンをクリックします。
ちなみに – 2:ユーザー登録されていない人にSMSを送信する
もしユーザー登録されていない人にSMSを送信したい場合は以下のようになります。(電話番号は国番号+最初のゼロを抜かした番号です)
\Notification::route('nexmo', '8190********') // 電話番号
->notify(new SmsNotification());
おわりに
ということで、今回はLaravel
からショートメッセージを送信する方法を紹介しました。
日本ではあまりSMS
を使ってやりとりをすることは少ないかもしれませんが、携帯番号が正しいかどうかを確かめる手段としてはとても有効な機能と言っていいんじゃないでしょうか。
また、Nexmo
はトライアル版もあるので勉強のために実行してみてもいいと思います。トライアルだけならクレジットカードを登録しなくてもSMS送信することができますよ!
皆さんも一度試してみてはいかがでしょうか。
ではでは〜!