LaravelでSMS(ショートメッセージ)を送信する

さてさて、Laravel好きな私からすると新しい機能や体験していない機能は最低1度は今後の開発のために触って見るようにしているのですが、そんな中でも少しだけ敷居が高いというか「ちょっとめんどう」感が出てしまうものがあります。

それが、課金が必要になる機能です。

そして、その中で気になっていたのが「SMS(ショートメッセージ)送信機能」

SMSとは、電話番号を使ってメッセージを送信するサービスのことで、最近では入力された携帯番号が本当に正しいかをチェックするためにSMSで「認証番号」を送信し、その番号を入力してもらうという形をとっていたりします。

Laravelでは、SMS機能をNotificationNexmoというサイト連携させて利用できるようになっているのですが、クレジットカードの登録などが少しめんどうだなと思いずっと実行しないままになっていましたが、最近Nexmoには無料のトライアル版があることを知りました。

そこで!今回はその少し重たい腰を上げて😂、LaravelからSMSを送信する方法を紹介したいと思います。

ぜひ皆さんのお役に立てると嬉しいです。

実行環境: Laravel 5.8

SMSを使う準備をする

Nexmoにアカウントをつくる

Nexmoとは、SMSを送信するなど様々なサービスを展開しているウェブサイトですが、LaravelNotificationでは、このNexmoを使ってSMSを送信します。

ということで、まずはトップページへアクセスしてアカウントを作成しましょう。

まずは「TRY IT FREE」ボタンをクリックします。

すると、以下のようなアカウント入力フォームが表示されるので入力します。以下は赤枠の必須項目です。

  • First name ・・・ 名
  • Last name ・・・ 姓
  • Email address ・・・ メールアドレス
  • Phone number ・・・ 電話番号 ※注1
  • Password ・・・ パスワード

※注1:電話番号は、例えば「090-****-****」の場合「90-****-****」を入力してください。国際電話を掛ける場合と同じですね。

入力が終わったら「Sign up」ボタンをクリックします。

すると、すぐにページが移動し、入力した携帯番号に以下のようなSMSが送信されて来ますのでその認証番号を入力して送信してください。(すみませんフォームのキャプチャ取り忘れました💦)

また、入力したメールアドレスにメールアドレスを有効にする以下のようなメッセージが届いているので赤枠の部分をクリックします。

これでアカウントの作成は完了しました!

※ ちなみに、Nexmoの無料トライアルの制限は以下の3つになります。

  1. 無料で使えるのは€2(2ユーロ)まで
  2. アカウント登録した電話番号以外に送信するにはあらかじめ「テスト電話番号」を登録しておかないといけない。
  3. 送信されたショートメッセージの最後に「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送信することができますよ!

皆さんも一度試してみてはいかがでしょうか。

ではでは〜!

この記事が役立ちましたらシェアお願いします😊✨