使用 Laravel 和 Nexmo 发送和接收短信

发布于 作者:

Sending and Receiving SMS with Laravel and Nexmo image

在本篇由 Phil Leggetter 撰写的快速教程中,我们将介绍如何在您的 Laravel 应用程序中发送和接收短信。我们将使用 Nexmo,一个提供 API 用于配置电话号码、发送和接收短信(这很方便,因为我们将使用它)、拨打电话和接听电话 等功能的云通信平台。

先决条件

您需要一个 Nexmo 账户、已安装和配置的 Nexmo CLI(命令行界面),以及 Laravel 应用程序的标准先决条件。您还需要一个本地隧道选项,以便 Nexmo 服务可以向您的本地 Web 服务器发出 HTTP 请求。我们建议使用 ngrok

开始

有了这些,让我们创建我们的 Laravel 短信应用程序

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_KEYAPI_SECRET 值。

'api_key' => 'API_KEY',
'api_secret' => 'API_SECRET',

注意:如果您愿意,您也可以从您的 .envenv(...) 中设置这些值。

发送短信

注意:为简单起见,我们将所有功能直接添加到 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']);
});

您会注意到,在上面的代码中,from 值设置为值为 @leggetter 的字符串。这在英国可以正常工作,但在其他国家可能无法工作。它实际上取决于国家。

对于那些需要在这里使用真实号码的用户,以及在下一步中需要使用真实号码的所有用户,让我们看看如何使用现有号码或购买一个号码。

列出、搜索和租用号码

本教程的先决条件之一是 Nexmo CLI。我们可以用它来做很多事情,包括处理与我们账户关联的电话号码(确切地说是虚拟号码)。如果您还没有这样做,您应该安装并设置 CLI,其中 API_KEYAPI_SECRET 应该替换为之前使用的 API 凭据

› npm install -g nexmo-cli
nexmo setup API_KEY API_SECRET

现在我们可以列出我们正在租用的号码,搜索可供租用的号码,租用这些号码或取消租赁。让我们先看看我们的账户中是否关联了任何号码

› nexmo number:list
14155550123

在上面的示例中,我有一个号码。如果您没有号码,您可以搜索可供租用的号码。您只需要知道两个字符的 ISO 3166-1 alpha-2 国家代码。这比听起来容易。例如,对于大不列颠,它是 GB,而对于美国,它是 US。让我们搜索一个在美国可供租用的号码

› nexmo number:search US
14155550111
14155550222
14155550333

如果您没有号码,您应该购买一个号码,以便您可以在需要真实出站号码的国家发送短信,并且以便我们以后也可以接收短信。

› nexmo number:buy 14155550111 --confirm
Number purchased: 14155550111

真正发送短信

现在,如果您更新代码以使用您刚购买的号码。将 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,您将看到与刚刚发送的消息相关的日志条目,以及日志条目末尾的唯一 message-id,例如:

[2016-08-02 13:45:01] local.INFO: sent message: 03000000068F5D97

接收传入短信

为了使 Laravel 应用程序接收短信,我们需要做几件事

  1. 确保我们的应用程序可以通过本地隧道被 Nexmo 访问
  2. 创建一个在接收短信时调用的路由
  3. 为我们的短信接收路由禁用 CSRF
  4. 通知 Nexmo 在接收消息时在何处进行 Webhook 调用

让我们先让 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 的输出中看到的那样,ngrok 上创建了一个子域,现在任何对此子域的请求都将被转发到 localhost:8000

有了本地隧道,我们现在应该在 routes.php 中创建一个路由来接收短信

Route::post('/sms/receive', function(\Nexmo\Client $nexmo){
});

默认情况下,Laravel 不允许对该路由进行 POST 请求,除非有 CSRF 令牌。由于对该路由的请求将由 Nexmo 发出,而 Nexmo 将没有令牌,因此我们将为此路由禁用 CSRF。在 App/Http/Middleware/VerifyCsrfToken.php 中添加以下内容

protected $except = [
'/sms/receive'
];

最后,让我们通知 Nexmo 在我们的号码上接收到短信时在何处进行 Webhook 调用。我们可以使用 Nexmo CLI 完成此操作。执行以下命令时,您应该使用您从 Nexmo 租用的电话号码和您的 ngrok 子域

› nexmo link:sms 14155550111 https://814882e9.ngrok.io/sms/receive
Number updated

当您执行此命令时,Nexmo 服务将尝试调用您的 /sms/receive 路由,您应该在 ngrok 终端中看到这些请求。

HTTP Requests
-------------
 
POST /sms/receive 200 OK

如果您看到的不是 200 响应,那么您需要修复该问题,以便号码和 Webhook 关联能够成功完成。

Nexmo PHP 客户端库提供了一种简单的方法来捕获 Nexmo 发送到 Laravel 应用程序的 HTTP 参数,并创建一个我们可以使用的 InboundMessage 消息对象。将 /sms/receive 代码更新为以下内容

Route::post('/sms/receive', function(\Nexmo\Client $nexmo){
$message = \Nexmo\Message\InboundMessage::createFromGlobals();
Log::info('got text: ' . $message->getBody());
});

然后向您租用的号码发送短信,并检查 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.

自动回复传入短信

最后,让我们为传入消息创建一个自动回复器。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 应用程序中所需的所有知识。

您可以在 github.com/nexmo-community/laravel-sms 找到此示例的代码。

如果您有任何想法或反馈,请随时联系我们。您可以通过电子邮件 devrel@nexmo.com 或在 Twitter 上通过 @leggetter 联系我。

如果您遵循本教程并想要一些额外的积分,请给我们发送电子邮件,附上您的 Nexmo API 密钥(不要包含 secret),并告诉我们您是在 Laravel News 上看到的,我们将向您的帐户添加更多积分。


非常感谢 Nexmo 本周赞助 Laravel News 并分享此关于如何开始使用其服务的教程。

Eric L. Barnes photo

Eric 是 Laravel News 的创建者,从 2012 年开始关注 Laravel。

归档于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,绝不错过任何新技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动补全和对本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

No Compromises

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发者,现已开放接受您的 Laravel 项目雇佣。⬧ 固定费率 7500 美元/月。 ⬧ 无冗长的销售流程。 ⬧ 无合同。 ⬧ 100% 退款保证。

No Compromises
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

让您项目的强大助力,配备经验丰富的 Laravel 开发人员(4-6 年经验),仅需 2500 美元/月。获得 160 小时的专业技能和 15 天的无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

现在就选择 Lucky - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带入 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。付款、精美结账、管理面板、用户仪表板、身份验证、即用组件、统计信息、博客、文档等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

您无缝 Laravel 升级的合作伙伴,降低成本,加速创新,成就成功企业

Rector
MongoDB logo

MongoDB

使用 MongoDB 和 Laravel 的强大集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务性、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。探索 MongoDB 如何灵活的现代数据库可以改变您的 Laravel 应用程序。

MongoDB

最新消息

查看全部 →
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的站点搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包向您的 Laravel 应用程序添加评论

阅读文章