prgayman/laravel-sms

Laravel 发送短信包

16.4 2024-05-29 10:45 UTC

This package is auto-updated.

Last update: 2024-08-29 11:51:12 UTC


README

Laravel SMS 允许您使用多个短信服务提供商从您的 Laravel 应用程序发送短信,并允许添加自定义短信服务提供商

要求

  • php ^7.3|^8.0
  • guzzlehttp/guzzle ^7.0.1

安装

要获取项目中 laravel-sms 的最新版本,请从 "composer" 中要求它

$ composer require prgayman/laravel-sms

或者您可以直接在 composer.json 文件中添加它

{
    "require": {
        "prgayman/laravel-sms": "1.5.0"
    }
}

Laravel

直接在您的 app 配置文件 config/app.php 中注册提供者 config/app.php

Laravel >= 5.5 提供了包自动发现功能,感谢 rasmuscnielsen 和 luiztessadri 在 Zatca 中帮助实现此功能,提供者和外观的注册可能不再必要。

'providers' => [
    Prgayman\Sms\SmsServiceProvider::class,
]

在相同文件中添加外观别名

'aliases' => [
  'Sms' => Prgayman\Sms\Facades\Sms::class,
  'SmsHistory' => Prgayman\Sms\Facades\SmsHistory::class,
]

Lumen

在您的 bootstrap app 文件 boostrap/app.php 中注册提供者

在文件的 "注册服务提供者" 部分底部添加以下行。

$app->register(Prgayman\Sms\SmsServiceProvider::class);

对于外观,在 "创建应用程序" 部分中添加以下行。

class_alias(\Prgayman\Sms\Facades\Sms::class, 'Sms');
class_alias(\Prgayman\Sms\Facades\SmsHistory::class, 'SmsHistory');

运行迁移

使用以下 artisan 命令发布迁移

$ php artisan vendor:publish --tag=laravel-sms-migrations

配置

您可以使用以下 artisan 命令发布配置文件

$ php artisan vendor:publish --tag=laravel-sms-config

可用的 SMS 提供商

可用的 SMS 驱动器本地开发

事件

  • \Prgayman\Sms\Events\MessageSending::class
  • \Prgayman\Sms\Events\MessageSent::class
  • \Prgayman\Sms\Events\MessageFailed::class

类型

  • \Prgayman\Sms\SmsTypes::GENERAL
  • \Prgayman\Sms\SmsTypes::OTP
  • \Prgayman\Sms\SmsTypes::WELCOME
  • \Prgayman\Sms\SmsTypes::AD

使用

设置默认驱动器

使用 .env

SMS_DRIVER=log

使用外观

/**
 * Set the default sms driver name.
 *
 * @param string $driver
*/
Prgayman\Sms\Facades\Sms::setDefaultDriver("array");

启用使用数据库的短信历史记录(不支持存储历史记录的多联系人发送)

  • .env 文件中启用密钥 SMS_HISTORY_ENABLED

    SMS_HISTORY_ENABLED=true
  • 确保使用以下 artisan 命令发布迁移

    $ php artisan vendor:publish --tag=laravel-sms-migrations
    
  • 使用以下 artisan 命令运行迁移

    $ php artisan migrate
    

发送消息

您可以简单地发送一条消息,如下所示

# Send message using facade
use Prgayman\Sms\Facades\Sms;

$to = "+962790000000";
$from = "SenderName";
$message = "Test Send Message";

/**
 * Send using default driver sms
 *
 * @return \Prgayman\Sms\SmsDriverResponse
 */
$response = Sms::to($to)->from($from)->message($message)->send();

# Get Message
$response->getMessage();

# Get Request
$response->getRequest();

# Get driver response
$response->getResponse();

# Check is successfuly send sms message
$response->successful();

# Check is failed send sms message
$response->failed();

使用选择驱动器发送

Sms::driver("array")
  ->to($to)
  ->from($from)
  ->message($message)
  ->send();

发送多个联系人

// please sure driver is support send multiple contacts
Sms::to([
  "+962792994123",
  "+962792994124",
  "+962792994125",
])
->from($from)
->message($message)
->send();

使用自定义类型发送

Sms::driver("array")
  ->type(\Prgayman\Sms\SmsTypes::OTP)
  ->to($to)
  ->from($from)
  ->message($message)
  ->send();

发送多条消息(运行事件并按消息存储历史记录)

    $items = [
        [
            "to" => "+962792994123",
            "from" => "SenderName",
            "message" => "New message"
        ],
        [
            "to" => "+962792994124",
            "from" => "SenderName",
            "message" => "Send Message"
        ]
    ];

    /**
     * @param $items must contain message, to, and from keys per item
     * @return \Prgayman\sms\SmsDriverResponse[]
     */
    $response = Sms::sendArray($items);

    // Or send using helper function
    $response = sms()->sendArray($items);

使用默认驱动器的辅助函数发送

sms()
  ->to($to)
  ->from($from)
  ->message($message)
  ->send();

使用辅助函数和选择驱动器发送

sms("array")
  ->to($to)
  ->from($from)
  ->message($message)
  ->send();

使用辅助函数和自定义类型发送

sms("array")
  ->type(\Prgayman\Sms\SmsTypes::OTP)
  ->to($to)
  ->from($from)
  ->message($message)
  ->send();

创建自定义驱动器

  • 创建一个从 \Prgayman\Sms\Drivers\Driver 继承的类,并处理发送函数

  • 如果驱动器支持发送多个联系人,请实现 Prgayman\Sms\Contracts\DriverMultipleContactsInterface

    use Prgayman\Sms\Drivers\Driver;
    use Prgayman\Sms\SmsDriverResponse;
    use Prgayman\Sms\Contracts\DriverMultipleContactsInterface;
    
    class CustomDriver extends Driver implements DriverMultipleContactsInterface {
    
        # You not need to run events or store history
        # package automatically run all events and store history
        public function send() : SmsDriverResponse
        {
    
          $request = [
              "to" => $this->getTo(),
              'from' => $this->getFrom(),
              'body' => $this->getMessage(),
          ];
    
          try {
              # Handler send message
              $response = null;
              return new SmsDriverResponse($request, $response, true);
          } catch (\Exception $e) {
              return new SmsDriverResponse($request, null, false, $e->getMessage());
          }
        }
    
    }
  • config/sms.php 中添加驱动器配置

      "drivers"=>[
        .......
    
        # Use custom driver
        'your-driver-name'=>[
          'handler'=> \App\SmsDrivers\CustomDriver::class
        ],
    
        # Use supported drivers but different name
        # Copy driver object and change name
        "new-log-driver" => [
              "driver" => "log",
              'channel' => env('SMS_LOG_CHANNEL'),
        ],
      ]
  • 使用自定义驱动器发送消息

    # Use driver
    Sms::driver("your-driver-name")
        ->to($to)
        ->from($from)
        ->message($message)
        ->send();
    
    # Or set custom driver in default driver or set
    # SMS_DRIVER=your-driver-name in dotenv file
    Sms::setDefaultDriver("your-driver-name");
    
    Sms::to($to)
      ->from($from)
      ->message($message)
      ->send();

通道使用

首先,您必须使用 php artisan make:notification 命令创建您的通知。然后,可以像下面这样使用 Prgayman\Sms\Channels\SmsChannel::class 作为通道

use Illuminate\Notifications\Notification;
use Prgayman\Sms\SmsNotification;

class SendSmsNotification extends Notification
{

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['sms']; # add this channel
    }

    /**
     * @param mixed $notifiable
     * @return \Prgayman\Sms\SmsNotification
     */
    public function toSms($notifiable)
    {
        # Send message with default driver
        return (new SmsNotification)
          ->to("+962790000000")
          ->from("SenderName")
          ->message("Test New Message");

        # Send message with select driver
        return (new SmsNotification)
          ->driver('array')
          ->to("+962790000000")
          ->from("SenderName")
          ->message("Test New Message");
    }
}

SMS 历史记录

use Prgayman\Sms\Facades\SmsHistory;

# Get all
$histories = SmsHistory::get();

# Use Filters all filter is optional
$histories = SmsHistory::recipients("+962790000000")
->senders(["SendName"])
->statuses([
  Prgayman\Sms\Models\SmsHistory::SUCCESSED,
  Prgayman\Sms\Models\SmsHistory::FAILED,
])
->drivers(["log","array"])
->driverNames(["custom_name"])
->get();

# Or can use helper function
$histories = smsHistory()
->recipients("+962790000000")
->senders(["SendName"])
->statuses([
  Prgayman\Sms\Models\SmsHistory::SUCCESSED,
  Prgayman\Sms\Models\SmsHistory::FAILED,
])
->drivers(["log","array"])
->driverNames(["custom_name"])
->get();

测试

composer test

许可证

此库是开源软件,许可协议为 MIT 许可证