简介
在您的Laravel应用程序中,可能会有需要向用户发送短信的情况。您可能想这样做是为了向用户发送通知,或者作为两步验证(2FA)的一种形式。
为了发送这些信息,通常需要与第三方服务的API(如Vonage或Twilio)进行交互,该API可以处理信息的发送(有时也可以接收)。在本指南中,我们将看看如何使用Vonage(以前名为Nexmo)从您的Laravel应用程序向用户发送短信。
Vonage提供几个不同的API,您可以使用它们,包括
- SMS API - 用于发送和接收短信
- 语音API - 用于打电话
- 视频API - 用于进行视频通话
- 验证API - 用于添加两步验证功能并验证用户的手机号码或身份
在本指南中,我们将使用SMS API。
使用Vonage发送短信
创建Vonage账户
在触摸项目中任何代码之前,您首先需要创建一个Vonage账户。这非常简单快捷!之后,您将能够获取您的API密钥。
注册时,您可能会获得一些免费信用(我被提供了2欧元),并且您的账户会有一些小限制,如
- 您发送的所有短信都会在消息末尾添加水印(显示“[免费短信演示,测试消息]”)
- 您只能向自己的手机号码发送消息
但是,这并不是一个问题,因为这可以给您一个机会来尝试API,并检查它是否适合您的项目。一旦您准备好使用Vonage并解除限制,您可以升级到付费账户。
安装
现在我们已经创建了我们的Vonage账户并获取了我们的API密钥,我们可以使用以下命令来安装Laravel的Vonage通知频道(laravel/vonage-notification-channel)
composer require laravel/vonage-notification-channel
然后,我们可以前往我们的.env
文件并添加我们在创建Vonage账户后获得的API密钥
VONAGE_KEY=your-vonage-key-here
VONAGE_SECRET=your-vonage-secret-here
VONAGE_SMS_FROM=1234567890
如您所见,我们还添加了一个VONAGE_SMS_FROM
字段。这将是短信看起来是由哪个号码(或名称)发送的。如果您从Vonage购买了电话号码,您可能想在这里放置那个号码;或者您可能想在这里使用您的品牌/公司名称。在下面,我们将讨论如何在发送短信时按通知覆盖此值。
配置我们的模型
现在我们已经设置了通知频道,我们需要配置我们的模型。在这个例子中,我们想象我们要将短信发送给我们的User
模型,并且他们在phone_number
字段中存储了电话号码。
每当我们发送一个短信通知时,我们都需要告诉Laravel从哪里获取接收者的电话号码。目前,它不知道应该使用哪个电话号码。所以,我们在User
模型上创建了一个新的routeNotificationForVonage
方法,该方法返回phone_number
字段。例如,我们可以更新我们的模型如下所示
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
// ...
public function routeNotificationForVonage($notification)
{
return $this->phone_number;
}
}
您还需要确保您的模型正在使用Illuminate\Notifications\Notifiable
特征,这样我们就可以使用notify
方法发送通知。
我们现在已经指定,在通过Vonage通道发送通知时,我们应该将短信发送到存储在phone_number
字段中的用户的电话号码。
创建通知
现在我们已经配置了我们的模型,我们可以创建一个新的通知类。出于本教程的目的,我们假设我们希望在用户注册我们的应用程序后向用户发送一个短信通知。
因此,我们首先使用以下命令创建通知
php artisan make:notification SuccessfulRegistration
运行此命令应在app/Notifications
目录中创建一个新的通知类。然后我们可以更新该类,使其能够用于发送短信
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\VonageMessage;
use Illuminate\Notifications\Notification;
class SuccessfulRegistration extends Notification implements ShouldQueue
{
use Queueable;
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['vonage'];
}
/**
* Get the Vonage / SMS representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\VonageMessage
*/
public function toVonage($notifiable)
{
return (new VonageMessage())
->content('You have now registered for My Amazing App!');
}
}
如您所见,我们指定了via
方法返回['vonage']
。我们还添加了一个新的toVonage
方法,该方法返回一个包含我们的短信消息内容的Illuminate\Notifications\Messages\VonageMessage
实例。
您可能还注意到,我还确保了这个类实现了ShouldQueue
接口。这意味着如果我们将短信作为请求的一部分发送,我们不需要在返回用户的响应之前等待短信发送。相反,短信将调度并在项目中的一个后台队列工作者中运行。如果您想了解更多,我在6 Quick & Easy Ways to Speed Up Your Laravel Website文章中讲述了这种方法。
发送通知
现在我们已经准备好了通知,我们现在可以发送它。为此,我们可以使用(由User
模型上的Notifiable
特征提供)的notify
方法。
$user->notify(new SuccessfulRegistration());
您的用户现在应该收到一个短信消息,内容为“您已经注册了我们的超级应用!”
进一步发展
现在我们已经了解了如何向用户发送简单的短信消息,让我们看看我们如何进一步扩展这个例子。
向短信传递额外信息
有时你可能想要在短信中向用户发送额外的信息。作为一个基本的例子,让我们设想我们也想显示当用户注册时他们正在使用的浏览器。我们可以像在我的Laravel 获取用户设备、浏览器和操作系统中看到的那样获取这些信息。然后我们需要更新我们的通知类来接受这些信息,如下所示
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\VonageMessage;
use Illuminate\Notifications\Notification;
class SuccessfulRegistration extends Notification implements ShouldQueue
{
use Queueable;
public function __construct(private string $browser)
{
//
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['vonage'];
}
/**
* Get the Vonage / SMS representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\VonageMessage
*/
public function toVonage($notifiable)
{
return (new VonageMessage())
->content('You have now registered for My Amazing App using '.$this->browser.'!');
}
}
注意我们是如何在通知中添加一个构造函数来接受一个字符串类型的 $browser
参数的。
现在我们可以更新我们的方法调用来传递这个额外信息,如下所示
use Jenssegers\Agent\Facades\Agent;
$user->notify(new SuccessfulRegistration(Agent::browser()));
在这个特定的例子中,我们使用 (jenssegers/agent) 包来确定用户的浏览器。出于文章的目的,我们假设 Agent::browser
调用返回 "Firefox"。因此,我们的用户现在应该收到一条短信说:“您已经使用Firefox注册了我们的My Amazing App!”
按需Vonage短信通知
可能有时你会想向你的数据库中不存在的人发送通知。例如,你可能希望每次有人完成注册或从你的网站上购买东西时都给你自己发送一条短信。为此,我们可以利用Laravel的“按需通知”。
作为一个例子,让我们看看我们如何给自己发送一条通知。首先,我们将想要创建一个新的配置变量。重要的是要记住,你不应该在代码中硬编码凭证、电子邮件或电话号码,因为这可能会在代码被泄露(无论是由于不满的前员工,还是恶意的黑客)时造成安全问题。这是一个我将在我的即将出版的电子书中更详细讨论的话题 Battle Ready Laravel,如果你对此感兴趣的话。
你应该根据你的用途选择最佳位置来放置该字段,但在这个特定的例子中,我将称之为 admin_sms_number
,并将其放置在我的 config/app.php
配置文件底部
return [
// ...
'admin_sms_number' => env('ADMIN_SMS_NUMBER'),
// ...
];
然后我们要在 .env
文件中添加 ADMIN_SMS_NUMBER
ADMIN_SMS_NUMBER=1234567890
现在我们可以编写代码来发送通知。假设我们已经按照上面的指南创建了一个新的名为 NewUserRegistered
的通知,并且已经设置了内容。我们还将假设构造函数接受一个带有用户电子邮件地址的参数。因此,我们可以像这样发送通知
use Illuminate\Support\Facades\Notification;
Notification::route('vonage', config('app.admin_sms_number'))
->notify(new NewUserRegistered($user->email));
使用这样的按需通知的好处是,你可以一次通过多个渠道发送通知。例如,如果我们为 NewUserRegistered
类添加了发送电子邮件的功能,我们可以扩展上面的代码以同时发送短信和电子邮件。
use Illuminate\Support\Facades\Notification;
Notification::route('vonage', config('app.admin_sms_number'))
->route('mail', config('app.admin_email_address'))
->notify(new NewUserRegistered($user->email));
使用不同的“发件人”号码或名称
默认情况下,所有的消息都将使用你在 .env
文件中定义的 VONAGE_SMS_FIELD
字段发送。但是,在创建你的短信消息时,可能会有时候你想更改“发件人”号码或名称。例如,假设你想在发送特定通知时覆盖“发件人”号码。为此,你可以在通知类中使用 from
方法覆盖“发件人”号码或名称。
假设我们想将上面的 SuccessfulRegistration
通知设置为从“我的神奇应用”发送。我们可以像这样更新类中的 toVonage
方法
public function toVonage($notifiable)
{
return (new VonageMessage())
->from('My Awesome App')
->content('You have now registered for My Amazing App');
}
现在,当用户接收短信时,它应该显示为从“我的酷炫应用”接收的。
结论
希望这篇文章能展示如何在使用Laravel应用程序时使用Vonage发送短信给用户。它还应迅速让您了解到如何发送按需短信通知,向短信传递额外信息,并按通知逐个更改“来自”号码。
如果您喜欢阅读这篇文章,我希望听到您的想法。同样,如果您有任何反馈以改进未来的文章,我也愿意倾听。
如果您想每次我发表新文章时都获取更新,请随时 订阅我的时事通讯。
继续打造精彩的东西!🚀
driesvints, felixramowda 赞同了这篇文章