# Kylin SMS - Laravel 短信服务扩展包

[![PHP Version](https://img.shields.io/badge/PHP-%3E%3D8.5-8892BF.svg?style=flat-square)](https://php.net)
[![Laravel Version](https://img.shields.io/badge/Laravel-%3E%3D12.0-FF2D20.svg?style=flat-square)](https://laravel.com)
[![License](https://img.shields.io/packagist/l/kylin/sms.svg?style=flat-square)](https://packagist.org/packages/kylin/sms)

一个功能强大、易于扩展的 Laravel 短信服务扩展包，支持国内主流短信服务商，提供统一的 API 接口。

## 特性

- 🚀 **开箱即用**：简单配置即可使用，无需复杂设置
- 📦 **多服务商支持**：支持 35+ 国内主流短信服务商
- 🔧 **易于扩展**：简洁的网关模式，轻松添加新服务商
- 📝 **模板短信**：支持模板短信发送，自动参数替换
- 📨 **批量发送**：支持批量短信发送功能
- 🔔 **通知集成**：完美集成 Laravel 通知系统
- 📱 **手机号验证**：内置中国大陆手机号格式验证
- 🛡️ **异常处理**：完善的异常处理机制，便于问题定位
- 📖 **详细注释**：所有代码均包含详细的中文注释

## 环境要求

- PHP >= 8.5
- Laravel >= 12.0
- Guzzle HTTP >= 7.8

## 安装

通过 Composer 安装：

```bash
composer require kylin/sms
```

## 快速开始

### 1. 发布配置文件

```bash
php artisan vendor:publish --tag=sms-config
```

### 2. 配置环境变量

在 `.env` 文件中添加以下配置：

```env
# ========================================
# 短信服务配置
# ========================================

# 默认短信网关
SMS_GATEWAY=aliyun

# ========================================
# 云服务商配置
# ========================================

# 阿里云短信配置
ALIYUN_ACCESS_KEY_ID=your_access_key_id
ALIYUN_ACCESS_KEY_SECRET=your_access_key_secret
ALIYUN_SMS_SIGN_NAME=您的签名
ALIYUN_SMS_REGION=cn-hangzhou
ALIYUN_SMS_TEMPLATE_CODE=SMS_123456

# 腾讯云短信配置
TENCENT_SECRET_ID=your_secret_id
TENCENT_SECRET_KEY=your_secret_key
TENCENT_SMS_APP_ID=your_app_id
TENCENT_SMS_SIGN_NAME=您的签名
TENCENT_SMS_REGION=ap-guangzhou
TENCENT_SMS_TEMPLATE_ID=123456

# 华为云短信配置
HUAWEI_SMS_APP_KEY=your_app_key
HUAWEI_SMS_APP_SECRET=your_app_secret
HUAWEI_SMS_SENDER=your_sender
HUAWEI_SMS_SIGNATURE=您的签名
HUAWEI_SMS_ENDPOINT=smsapi.cn-north-4.myhuaweicloud.com:443
HUAWEI_SMS_TEMPLATE_ID=123456

# 百度云短信配置
BAIDU_ACCESS_KEY=your_access_key
BAIDU_SECRET_KEY=your_secret_key
BAIDU_SMS_ENDPOINT=smsv3.bj.baidubce.com
BAIDU_SMS_SIGN_NAME=您的签名
BAIDU_SMS_TEMPLATE_CODE=SMS_123456

# 火山引擎短信配置
VOLCENGINE_ACCESS_KEY_ID=your_access_key_id
VOLCENGINE_ACCESS_KEY_SECRET=your_access_key_secret
VOLCENGINE_SMS_SIGN_NAME=您的签名
VOLCENGINE_TEMPLATE_ID=123456
VOLCENGINE_REGION=cn-north-1

# 七牛云短信配置
QINIU_ACCESS_KEY=your_access_key
QINIU_SECRET_KEY=your_secret_key
QINIU_SMS_SIGN_NAME=您的签名
QINIU_SMS_TEMPLATE_ID=123456

# UCloud 短信配置
UCLOUD_PUBLIC_KEY=your_public_key
UCLOUD_PRIVATE_KEY=your_private_key
UCLOUD_PROJECT_ID=your_project_id
UCLOUD_SMS_SIGN_NAME=您的签名

# SendCloud 短信配置
SENDCLOUD_SMS_USER=your_sms_user
SENDCLOUD_SMS_KEY=your_sms_key
SENDCLOUD_SMS_SIGN_NAME=您的签名

# ========================================
# 专业短信服务商配置
# ========================================

# 云片短信配置
YUNPIAN_API_KEY=your_api_key
YUNPIAN_SIGN_NAME=您的签名
YUNPIAN_TEMPLATE_ID=123456

# 容联云通讯配置
RONGLIANYUN_ACCOUNT_SID=your_account_sid
RONGLIANYUN_AUTH_TOKEN=your_auth_token
RONGLIANYUN_APP_ID=your_app_id
RONGLIANYUN_SMS_SIGN_NAME=您的签名

# 融云短信配置
RONGCLOUD_APP_KEY=your_app_key
RONGCLOUD_APP_SECRET=your_app_secret
RONGCLOUD_SMS_SIGN_NAME=您的签名
RONGCLOUD_TEMPLATE_ID=123456

# 云之讯配置
YUNZHIXUN_ACCOUNT_SID=your_account_sid
YUNZHIXUN_AUTH_TOKEN=your_auth_token
YUNZHIXUN_APP_ID=your_app_id
YUNZHIXUN_SMS_SIGN_NAME=您的签名

# 网易云信配置
NETEASE_APP_KEY=your_app_key
NETEASE_APP_SECRET=your_app_secret
NETEASE_SMS_SIGN_NAME=您的签名
NETEASE_TEMPLATE_ID=123456

# Submail 赛邮配置
SUBMAIL_APP_ID=your_app_id
SUBMAIL_APP_KEY=your_app_key
SUBMAIL_SMS_SIGN_NAME=您的签名
SUBMAIL_PROJECT_ID=your_project_id

# 螺丝帽配置
LUOSIMAO_API_KEY=your_api_key
LUOSIMAO_SMS_SIGN_NAME=您的签名

# ========================================
# 传统短信平台配置
# ========================================

# 互亿无线配置
HUYI_USERNAME=your_username
HUYI_PASSWORD=your_password
HUYI_SMS_SIGN_NAME=您的签名
HUYI_API_URL=https://106.ihuyi.com/webservice/sms.php

# 聚合数据配置
JUHE_KEY=your_key
JUHE_SMS_SIGN_NAME=您的签名
JUHE_TPL_ID=your_template_id

# 华信短信平台配置
HUAXIN_USERNAME=your_username
HUAXIN_PASSWORD=your_password
HUAXIN_SMS_SIGN_NAME=您的签名
HUAXIN_API_URL=https://www.huaxinsms.cn/api/send

# 253云通讯（创蓝）配置
CHUANGLAN253_ACCOUNT=your_account
CHUANGLAN253_PASSWORD=your_password
CHUANGLAN253_SMS_SIGN_NAME=您的签名
CHUANGLAN253_API_URL=https://smssh1.253.com/msg/send/json

# 创蓝云智配置
CHUANGLANYUNZHI_ACCOUNT=your_account
CHUANGLANYUNZHI_PASSWORD=your_password
CHUANGLANYUNZHI_SMS_SIGN_NAME=您的签名
CHUANGLANYUNZHI_API_URL=https://api.253.com/open/send

# 天毅无线配置
TIANYI_USERNAME=your_username
TIANYI_PASSWORD=your_password
TIANYI_SMS_SIGN_NAME=您的签名
TIANYI_API_URL=http://api.ty-telecom.com/sms/send

# 凯信通配置
KAIXINTONG_USERNAME=your_username
KAIXINTONG_PASSWORD=your_password
KAIXINTONG_SMS_SIGN_NAME=您的签名
KAIXINTONG_API_URL=http://www.kxt-sms.com/api/send

# UE35.net 配置
UE35_USERNAME=your_username
UE35_PASSWORD=your_password
UE35_SMS_SIGN_NAME=您的签名
UE35_API_URL=http://www.ue35.net/api/send

# 短信宝配置
SMSBAO_USERNAME=your_username
SMSBAO_PASSWORD=your_password
SMSBAO_SMS_SIGN_NAME=您的签名
SMSBAO_API_URL=https://api.smsbao.com/sms

# Tiniyo 配置
TINIYO_ACCOUNT_SID=your_account_sid
TINIYO_AUTH_TOKEN=your_auth_token
TINIYO_SMS_SIGN_NAME=您的签名

# 摩杜云配置
MODUYUN_ACCESS_KEY_ID=your_access_key_id
MODUYUN_ACCESS_KEY_SECRET=your_access_key_secret
MODUYUN_SMS_SIGN_NAME=您的签名
MODUYUN_TEMPLATE_CODE=your_template_code

# ========================================
# 融合云平台配置
# ========================================

# 融合云（助通）配置
RONGHEYUN_USERNAME=your_username
RONGHEYUN_PASSWORD=your_password
RONGHEYUN_SMS_SIGN_NAME=您的签名
RONGHEYUN_API_URL=https://api.mix2.zthysms.com/v2/sendSmsTp

# 蜘蛛云配置
ZHIZIYUN_APP_ID=your_app_id
ZHIZIYUN_APP_KEY=your_app_key
ZHIZIYUN_SMS_SIGN_NAME=您的签名
ZHIZIYUN_TEMPLATE_ID=your_template_id

# 融合云信配置
RONGHEYUNXIN_USERNAME=your_username
RONGHEYUNXIN_PASSWORD=your_password
RONGHEYUNXIN_SMS_SIGN_NAME=您的签名
RONGHEYUNXIN_API_URL=http://api.rhyx.cn/sms/send

# 天瑞云配置
TIANRUIYUN_USERNAME=your_username
TIANRUIYUN_PASSWORD=your_password
TIANRUIYUN_SMS_SIGN_NAME=您的签名
TIANRUIYUN_API_URL=http://api.tianruiyun.com/sms/send

# 时代互联配置
SHIDAIHULIAN_USERNAME=your_username
SHIDAIHULIAN_PASSWORD=your_password
SHIDAIHULIAN_SMS_SIGN_NAME=您的签名
SHIDAIHULIAN_API_URL=http://api.now.cn/sms/send

# ========================================
# 运营商云服务配置
# ========================================

# 移动云MAS配置
MAS_USERNAME=your_username
MAS_PASSWORD=your_password
MAS_EC_NAME=your_ec_name
MAS_SMS_SIGN_NAME=您的签名
MAS_API_URL=https://mas.10086.cn/api/send

# 电信天翼云配置
CTYUN_USERNAME=your_username
CTYUN_PASSWORD=your_password
CTYUN_SMS_SIGN_NAME=您的签名
CTYUN_TEMPLATE_ID=your_template_id
CTYUN_API_URL=https://api.ctyun.cn/sms/send

# 微趣云配置
WEIQUYUN_USERNAME=your_username
WEIQUYUN_PASSWORD=your_password
WEIQUYUN_SMS_SIGN_NAME=您的签名
WEIQUYUN_API_URL=https://api.weiquyun.com/sms/send
```

### 3. 开始使用

```php
use Kylin\Sms\Facades\Sms;

// 发送短信
$result = Sms::send('13800138000', '您的验证码是123456');

// 发送模板短信
$result = Sms::sendTemplate('13800138000', 'SMS_123456', [
    'code' => '123456',
    'product' => '麒麟短信'
]);

// 批量发送
$result = Sms::sendBatch(['13800138000', '13900139000'], '群发短信内容');
```

## 支持的短信服务商

### 云服务商

| 服务商 | 标识 | 文档 |
|--------|------|------|
| 阿里云 | `aliyun` | [帮助文档](https://help.aliyun.com/product/44282.html) |
| 腾讯云 | `tencent` | [帮助文档](https://cloud.tencent.com/document/product/382) |
| 华为云 | `huawei` | [帮助文档](https://support.huaweicloud.com/productdesc-msgsms/sms_01_0001.html) |
| 百度云 | `baidu` | [帮助文档](https://cloud.baidu.com/doc/SMS/index.html) |
| 火山引擎 | `volcengine` | [帮助文档](https://www.volcengine.com/docs/639/63968) |
| 七牛云 | `qiniu` | [帮助文档](https://developer.qiniu.com/sms) |
| UCloud | `ucloud` | [帮助文档](https://docs.ucloud.cn/ussms/README) |
| SendCloud | `sendcloud` | [帮助文档](http://www.sendcloud.net/doc/sms/) |

### 专业短信服务商

| 服务商 | 标识 | 文档 |
|--------|------|------|
| 云片 | `yunpian` | [帮助文档](https://www.yunpian.com/doc/zh_CN/intl/brief_intl.html) |
| 容联云通讯 | `ronglianyun` | [帮助文档](https://www.yuntongxun.com/doc) |
| 融云 | `rongcloud` | [帮助文档](https://docs.rongcloud.cn/v4/5X/views/sms/note/intro.html) |
| 云之讯 | `yunzhixun` | [帮助文档](https://www.ucpaas.com/page/doc.jsp) |
| 网易云信 | `netease` | [帮助文档](https://dev.yunxin.163.com/docs/api/sms/) |
| Submail 赛邮 | `submail` | [帮助文档](https://www.mysubmail.com/documents) |
| 螺丝帽 | `luosimao` | [帮助文档](https://luosimao.com/docs/api/) |

### 传统短信平台

| 服务商 | 标识 | 文档 |
|--------|------|------|
| 互亿无线 | `huyi` | [帮助文档](https://www.ihuyi.com/sms-api/) |
| 聚合数据 | `juhe` | [帮助文档](https://www.juhe.cn/docs/api/id/54) |
| 华信短信平台 | `huaxin` | [帮助文档](http://www.huaxinsms.com/) |
| 253云通讯（创蓝） | `chuanglan253` | [帮助文档](https://www.253.com/docs) |
| 创蓝云智 | `chuanglanyunzhi` | [帮助文档](https://zz.253.com/v5/doc) |
| 天毅无线 | `tianyi` | [帮助文档](http://www.ty-telecom.com/) |
| 凯信通 | `kaixintong` | [帮助文档](http://www.kxt-sms.com/) |
| UE35.net | `ue35` | [帮助文档](http://www.ue35.net/) |
| 短信宝 | `smsbao` | [帮助文档](https://www.smsbao.com/) |
| Tiniyo | `tiniyo` | [帮助文档](https://tiniyo.com/) |
| 摩杜云 | `moduyun` | [帮助文档](https://www.moduyun.com/) |

### 融合云平台

| 服务商 | 标识 | 文档 |
|--------|------|------|
| 融合云（助通） | `rongheyun` | [帮助文档](https://www.zthysms.com/) |
| 蜘蛛云 | `zhiziyun` | [帮助文档](https://www.zhiziyun.com/) |
| 融合云信 | `rongheyunxin` | [帮助文档](https://www.rongheyunxin.com/) |
| 天瑞云 | `tianruiyun` | [帮助文档](https://www.tianruiyun.com/) |
| 时代互联 | `shidaihulian` | [帮助文档](https://www.now.cn/) |

### 运营商云服务

| 服务商 | 标识 | 文档 |
|--------|------|------|
| 移动云MAS | `mas` | [帮助文档](https://mas.10086.cn/) |
| 电信天翼云 | `ctyun` | [帮助文档](https://www.ctyun.cn/) |
| 微趣云 | `weiquyun` | [帮助文档](https://www.weiquyun.com/) |

## 使用方法

### 基础用法

```php
use Kylin\Sms\Facades\Sms;

// 发送普通短信
$result = Sms::send('13800138000', '您的验证码是123456');

// 发送模板短信
$result = Sms::sendTemplate('13800138000', 'SMS_123456', [
    'code' => '123456',
    'product' => '麒麟短信'
]);

// 批量发送短信
$result = Sms::sendBatch(['13800138000', '13900139000'], '群发短信内容');

// 使用指定网关发送
$result = Sms::gateway('tencent')->send('13800138000', '短信内容');
```

### 返回结果格式

```php
// 成功响应
[
    'success' => true,
    'gateway' => 'aliyun',
    'data' => [
        'biz_id' => '123456^0',
        'request_id' => 'xxx-xxx-xxx',
    ],
]

// 失败响应
[
    'success' => false,
    'gateway' => 'aliyun',
    'error' => [
        'message' => '错误信息',
        'code' => 500,
        'context' => [],
    ],
]
```

### 在通知中使用

本包完美集成 Laravel 通知系统，可以像发送邮件一样发送短信通知。

```php
use Illuminate\Notifications\Notification;
use Kylin\Sms\Messages\SmsMessage;

class VerificationCodeNotification extends Notification
{
    public function __construct(
        protected string $code
    ) {}

    /**
     * 获取通知渠道
     */
    public function via($notifiable): array
    {
        return ['sms'];
    }

    /**
     * 构建短信消息
     */
    public function toSms($notifiable): SmsMessage
    {
        return SmsMessage::create()
            ->template('SMS_123456', ['code' => $this->code])
            ->signName('您的签名');
    }
}
```

### 用户模型配置

在用户模型中添加手机号路由方法：

```php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;

class User extends Model
{
    use Notifiable;

    /**
     * 获取短信通知路由
     */
    public function routeNotificationForSms($notification): ?string
    {
        return $this->phone; // 返回用户手机号
    }
}
```

发送通知：

```php
$user = User::find(1);
$user->notify(new VerificationCodeNotification('123456'));
```

### 动态切换网关

```php
use Kylin\Sms\Facades\Sms;

// 方式一：使用 gateway 方法
$result = Sms::gateway('tencent')->send('13800138000', '内容');

// 方式二：在 send 方法中指定网关
$result = Sms::send('13800138000', '内容', [], 'tencent');

// 方式三：在消息中指定网关
$message = SmsMessage::create()
    ->content('短信内容')
    ->gateway('tencent');
```

### 消息构建器

`SmsMessage` 类提供了流式接口，便于构建短信消息：

```php
use Kylin\Sms\Messages\SmsMessage;

// 内容短信
$message = SmsMessage::create()
    ->content('您的验证码是123456')
    ->signName('您的签名');

// 模板短信
$message = SmsMessage::create()
    ->template('SMS_123456', ['code' => '123456'])
    ->gateway('aliyun');

// 验证码快捷方法
$message = SmsMessage::create()
    ->withVerificationCode('123456', 5); // 验证码，5分钟有效期

// 链式调用
$message = SmsMessage::create()
    ->template('SMS_123456')
    ->withTemplateParams(['code' => '123456'])
    ->signName('您的签名')
    ->gateway('aliyun')
    ->data(['custom' => 'data']);
```

### 获取网关实例

```php
use Kylin\Sms\Facades\Sms;

// 获取默认网关
$gateway = Sms::gateway();

// 获取指定网关
$aliyunGateway = Sms::gateway('aliyun');
$tencentGateway = Sms::gateway('tencent');

// 获取网关配置
$config = $gateway->getConfig();
```

## 异常处理

本包提供完善的异常处理机制：

```php
use Kylin\Sms\Exceptions\GatewayException;
use Kylin\Sms\Exceptions\InvalidPhoneNumberException;
use Kylin\Sms\Exceptions\GatewayNotFoundException;

try {
    $result = Sms::send('13800138000', '内容');
    
    if (!$result['success']) {
        // 处理发送失败
        logger()->error('短信发送失败', $result);
    }
} catch (InvalidPhoneNumberException $e) {
    // 手机号格式无效
    logger()->error('手机号无效: ' . $e->getMessage());
} catch (GatewayNotFoundException $e) {
    // 网关未找到
    logger()->error('网关未找到: ' . $e->getMessage());
} catch (GatewayException $e) {
    // 网关发送失败
    logger()->error('短信发送失败', [
        'gateway' => $e->getGateway(),
        'message' => $e->getMessage(),
        'context' => $e->getContext(),
    ]);
}
```

### 异常类型

| 异常类 | 说明 |
|--------|------|
| `SmsException` | 短信异常基类，所有短信异常的父类 |
| `GatewayException` | 网关异常，发送失败时抛出，包含网关名称和错误详情 |
| `GatewayNotFoundException` | 网关未找到异常，当使用未配置的网关时抛出 |
| `InvalidPhoneNumberException` | 手机号格式无效异常，手机号不符合中国大陆格式时抛出 |

## 自定义网关

### 创建自定义网关

继承 `BaseGateway` 类并实现必要的方法：

```php
<?php

namespace App\Sms\Gateways;

use Kylin\Sms\Gateways\BaseGateway;
use Kylin\Sms\Exceptions\GatewayException;

/**
 * 自定义短信网关
 * 
 * 支持自定义短信服务的发送功能
 */
class CustomGateway extends BaseGateway
{
    /**
     * 网关名称标识
     */
    protected static string $name = 'custom';

    /**
     * API 请求地址
     */
    protected const API_URL = 'https://api.example.com/sms/send';

    /**
     * API 密钥
     * 
     * @var string
     */
    protected string $apiKey;

    /**
     * 短信签名
     * 
     * @var string
     */
    protected string $signName;

    /**
     * 构造函数
     * 
     * 初始化自定义网关配置
     * 
     * @param array $config 网关配置数组
     */
    public function __construct(array $config = [])
    {
        parent::__construct($config);
        $this->apiKey = $config['api_key'] ?? '';
        $this->signName = $config['sign_name'] ?? '';
    }

    /**
     * 发送短信
     * 
     * 发送普通短信内容到指定手机号
     * 
     * @param string $to 接收手机号
     * @param string $content 短信内容
     * @param array $data 附加数据
     * @return array 发送结果
     */
    public function send(string $to, string $content, array $data = []): array
    {
        $signName = $data['sign_name'] ?? $this->signName;
        $text = '【' . $signName . '】' . $content;

        $params = [
            'api_key' => $this->apiKey,
            'mobile' => $this->formatPhone($to),
            'content' => $text,
        ];

        try {
            $response = $this->request('POST', self::API_URL, [
                'form_params' => $params,
            ]);
            return $this->parseResponse($response);
        } catch (GatewayException $e) {
            return $this->buildErrorResponse($e->getMessage(), $e->getCode(), $e->getContext());
        }
    }

    /**
     * 发送模板短信
     * 
     * 使用预定义模板发送短信
     * 
     * @param string $to 接收手机号
     * @param string $templateId 模板 ID
     * @param array $params 模板参数
     * @return array 发送结果
     */
    public function sendTemplate(string $to, string $templateId, array $params = []): array
    {
        $content = $templateId;
        foreach ($params as $key => $value) {
            $content = str_replace('{' . $key . '}', $value, $content);
        }
        return $this->send($to, $content);
    }

    /**
     * 批量发送短信
     * 
     * 向多个手机号发送相同内容的短信
     * 
     * @param array $recipients 接收手机号数组
     * @param string $content 短信内容
     * @param array $data 附加数据
     * @return array 发送结果
     */
    public function sendBatch(array $recipients, string $content, array $data = []): array
    {
        $results = [];
        foreach ($recipients as $recipient) {
            $results[] = $this->send($recipient, $content, $data);
        }
        return $this->buildSuccessResponse(['results' => $results]);
    }

    /**
     * 解析响应结果
     * 
     * 将 API 响应转换为标准化的结果格式
     * 
     * @param array $response API 响应
     * @return array 标准化的响应结果
     */
    protected function parseResponse(array $response): array
    {
        if (isset($response['code']) && $response['code'] === 0) {
            return $this->buildSuccessResponse([
                'message_id' => $response['message_id'] ?? '',
            ]);
        }

        return $this->buildErrorResponse(
            $response['message'] ?? '发送失败',
            $response['code'] ?? 500,
            $response
        );
    }
}
```

### 注册自定义网关

在服务提供者中注册：

```php
use Kylin\Sms\Facades\Sms;
use App\Sms\Gateways\CustomGateway;

// 方式一：使用 extend 方法
Sms::extend('custom', CustomGateway::class);

// 方式二：在配置文件中添加
// config/sms.php
'gateways' => [
    'custom' => [
        'driver' => 'custom',
        'api_key' => env('CUSTOM_SMS_API_KEY'),
        'sign_name' => env('CUSTOM_SMS_SIGN_NAME'),
    ],
],
```

## 配置文件说明

配置文件位于 `config/sms.php`，发布后可自定义配置。

### 完整配置文件

```php
<?php

/**
 * 短信服务配置文件
 * 
 * 支持国内主流短信服务商，包括：
 * - 阿里云、腾讯云、华为云、百度云、火山引擎
 * - 七牛云、网易云信、Ucloud、SendCloud
 * - 云片、容联云、融云、云之讯
 * - 螺丝帽、Submail、互亿无线、聚合数据
 * - 华信、253云通讯、创蓝云智
 * - 天毅无线、凯信通、短信宝、UE35
 * - Tiniyo、摩杜云、融合云、蜘蛛云
 * - 融合云信、天瑞云、时代互联
 * - 移动云MAS、电信天翼云、微趣云
 */

return [
    /*
    |--------------------------------------------------------------------------
    | 默认短信网关
    |--------------------------------------------------------------------------
    |
    | 指定默认使用的短信网关，当调用 send 方法时未指定网关则使用此配置
    |
    */
    'default' => env('SMS_GATEWAY', 'aliyun'),

    /*
    |--------------------------------------------------------------------------
    | 短信网关配置
    |--------------------------------------------------------------------------
    |
    | 各短信服务商的详细配置，包括 API 密钥、签名、端点等信息
    | 请根据实际使用的服务商填写对应的配置项
    |
    */
    'gateways' => [
        /*
        |----------------------------------------------------------------------
        | 阿里云短信
        |----------------------------------------------------------------------
        |
        | 阿里云短信服务，需要配置 AccessKey 和短信签名
        | 文档：https://help.aliyun.com/product/44282.html
        |
        */
        'aliyun' => [
            'driver' => 'aliyun',                                    // 驱动名称
            'access_key_id' => env('ALIYUN_ACCESS_KEY_ID', ''),      // AccessKey ID
            'access_key_secret' => env('ALIYUN_ACCESS_KEY_SECRET', ''), // AccessKey Secret
            'sign_name' => env('ALIYUN_SMS_SIGN_NAME', ''),          // 短信签名
            'region_id' => env('ALIYUN_SMS_REGION', 'cn-hangzhou'),  // 地域 ID
        ],

        /*
        |----------------------------------------------------------------------
        | 腾讯云短信
        |----------------------------------------------------------------------
        |
        | 腾讯云短信服务，需要配置 SecretId、SecretKey 和应用 ID
        | 文档：https://cloud.tencent.com/document/product/382
        |
        */
        'tencent' => [
            'driver' => 'tencent',                                   // 驱动名称
            'secret_id' => env('TENCENT_SECRET_ID', ''),             // SecretId
            'secret_key' => env('TENCENT_SECRET_KEY', ''),           // SecretKey
            'app_id' => env('TENCENT_SMS_APP_ID', ''),               // 应用 ID
            'sign_name' => env('TENCENT_SMS_SIGN_NAME', ''),         // 短信签名
            'region' => env('TENCENT_SMS_REGION', 'ap-guangzhou'),   // 地域
        ],

        /*
        |----------------------------------------------------------------------
        | 华为云短信
        |----------------------------------------------------------------------
        |
        | 华为云消息&短信服务，需要配置 AppKey、AppSecret 和发送方信息
        | 文档：https://support.huaweicloud.com/productdesc-msgsms/sms_01_0001.html
        |
        */
        'huawei' => [
            'driver' => 'huawei',                                    // 驱动名称
            'app_key' => env('HUAWEI_SMS_APP_KEY', ''),              // AppKey
            'app_secret' => env('HUAWEI_SMS_APP_SECRET', ''),        // AppSecret
            'sender' => env('HUAWEI_SMS_SENDER', ''),                // 发送方
            'signature' => env('HUAWEI_SMS_SIGNATURE', ''),          // 签名
            'endpoint' => env('HUAWEI_SMS_ENDPOINT', 'smsapi.cn-north-4.myhuaweicloud.com:443'), // 端点
        ],

        /*
        |----------------------------------------------------------------------
        | 云片短信
        |----------------------------------------------------------------------
        |
        | 云片网络短信服务，需要配置 API Key
        | 文档：https://www.yunpian.com/doc/zh_CN/intl/brief_intl.html
        |
        */
        'yunpian' => [
            'driver' => 'yunpian',                                   // 驱动名称
            'api_key' => env('YUNPIAN_API_KEY', ''),                 // API Key
            'sign_name' => env('YUNPIAN_SIGN_NAME', ''),             // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | Ucloud 短信
        |----------------------------------------------------------------------
        |
        | Ucloud 短信服务，需要配置公钥、私钥和项目 ID
        | 文档：https://docs.ucloud.cn/ussms/README
        |
        */
        'ucloud' => [
            'driver' => 'ucloud',                                    // 驱动名称
            'public_key' => env('UCLOUD_PUBLIC_KEY', ''),            // 公钥
            'private_key' => env('UCLOUD_PRIVATE_KEY', ''),          // 私钥
            'project_id' => env('UCLOUD_PROJECT_ID', ''),            // 项目 ID
            'sign_name' => env('UCLOUD_SMS_SIGN_NAME', ''),          // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | 七牛云短信
        |----------------------------------------------------------------------
        |
        | 七牛云短信服务，需要配置 AccessKey、SecretKey
        | 文档：https://developer.qiniu.com/sms
        |
        */
        'qiniu' => [
            'driver' => 'qiniu',                                     // 驱动名称
            'access_key' => env('QINIU_ACCESS_KEY', ''),             // AccessKey
            'secret_key' => env('QINIU_SECRET_KEY', ''),             // SecretKey
            'sign_name' => env('QINIU_SMS_SIGN_NAME', ''),           // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | SendCloud 短信
        |----------------------------------------------------------------------
        |
        | SendCloud 短信服务，需要配置 SMS User 和 SMS Key
        | 文档：http://www.sendcloud.net/doc/sms/
        |
        */
        'sendcloud' => [
            'driver' => 'sendcloud',                                 // 驱动名称
            'sms_user' => env('SENDCLOUD_SMS_USER', ''),             // SMS User
            'sms_key' => env('SENDCLOUD_SMS_KEY', ''),               // SMS Key
            'sign_name' => env('SENDCLOUD_SMS_SIGN_NAME', ''),       // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | Submail 短信
        |----------------------------------------------------------------------
        |
        | Submail 赛邮短信服务，需要配置 AppID 和 AppKey
        | 文档：https://www.mysubmail.com/documents
        |
        */
        'submail' => [
            'driver' => 'submail',                                   // 驱动名称
            'app_id' => env('SUBMAIL_APP_ID', ''),                   // AppID
            'app_key' => env('SUBMAIL_APP_KEY', ''),                 // AppKey
            'sign_name' => env('SUBMAIL_SMS_SIGN_NAME', ''),         // 短信签名
            'project_id' => env('SUBMAIL_PROJECT_ID', ''),           // 项目 ID
        ],

        /*
        |----------------------------------------------------------------------
        | 螺丝帽短信
        |----------------------------------------------------------------------
        |
        | 螺丝帽短信服务，需要配置 API Key
        | 文档：https://luosimao.com/docs/api/
        |
        */
        'luosimao' => [
            'driver' => 'luosimao',                                  // 驱动名称
            'api_key' => env('LUOSIMAO_API_KEY', ''),                // API Key
            'sign_name' => env('LUOSIMAO_SMS_SIGN_NAME', ''),        // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | 容联云通讯
        |----------------------------------------------------------------------
        |
        | 容联云通讯短信服务，需要配置 Account SID、Auth Token 和 App ID
        | 文档：https://www.yuntongxun.com/doc
        |
        */
        'ronglianyun' => [
            'driver' => 'ronglianyun',                               // 驱动名称
            'account_sid' => env('RONGLIANYUN_ACCOUNT_SID', ''),     // Account SID
            'auth_token' => env('RONGLIANYUN_AUTH_TOKEN', ''),       // Auth Token
            'app_id' => env('RONGLIANYUN_APP_ID', ''),               // App ID
            'sign_name' => env('RONGLIANYUN_SMS_SIGN_NAME', ''),     // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | 互亿无线
        |----------------------------------------------------------------------
        |
        | 互亿无线短信服务，需要配置用户名和密码
        | 文档：http://www.ihuyi.com/api/sms.html
        |
        */
        'huyi' => [
            'driver' => 'huyi',                                      // 驱动名称
            'username' => env('HUYI_USERNAME', ''),                  // 用户名
            'password' => env('HUYI_PASSWORD', ''),                  // 密码
            'sign_name' => env('HUYI_SMS_SIGN_NAME', ''),            // 短信签名
            'api_url' => env('HUYI_API_URL', 'https://106.ihuyi.com/webservice/sms.php'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 聚合数据
        |----------------------------------------------------------------------
        |
        | 聚合数据短信服务，需要配置 Key
        | 文档：https://www.juhe.cn/docs/api/id/54
        |
        */
        'juhe' => [
            'driver' => 'juhe',                                      // 驱动名称
            'key' => env('JUHE_KEY', ''),                            // Key
            'sign_name' => env('JUHE_SMS_SIGN_NAME', ''),            // 短信签名
            'tpl_id' => env('JUHE_TPL_ID', ''),                      // 模板 ID
        ],

        /*
        |----------------------------------------------------------------------
        | 百度云短信
        |----------------------------------------------------------------------
        |
        | 百度云短信服务，需要配置 Access Key、Secret Key 和服务端点
        | 文档：https://cloud.baidu.com/doc/SMS/index.html
        |
        */
        'baidu' => [
            'driver' => 'baidu',                                     // 驱动名称
            'access_key' => env('BAIDU_ACCESS_KEY', ''),             // Access Key
            'secret_key' => env('BAIDU_SECRET_KEY', ''),             // Secret Key
            'endpoint' => env('BAIDU_SMS_ENDPOINT', 'smsv3.bj.baidubce.com'), // 端点
            'sign_name' => env('BAIDU_SMS_SIGN_NAME', ''),           // 短信签名
            'template_code' => env('BAIDU_SMS_TEMPLATE_CODE', ''),   // 模板编码
        ],

        /*
        |----------------------------------------------------------------------
        | 华信短信平台
        |----------------------------------------------------------------------
        |
        | 华信短信平台，需要配置用户名和密码
        | 文档：http://www.huaxinsms.com/doc/
        |
        */
        'huaxin' => [
            'driver' => 'huaxin',                                    // 驱动名称
            'username' => env('HUAXIN_USERNAME', ''),                // 用户名
            'password' => env('HUAXIN_PASSWORD', ''),                // 密码
            'sign_name' => env('HUAXIN_SMS_SIGN_NAME', ''),          // 短信签名
            'api_url' => env('HUAXIN_API_URL', 'https://www.huaxinsms.cn/api/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 253云通讯（创蓝）
        |----------------------------------------------------------------------
        |
        | 253云通讯短信服务，需要配置账号和密码
        | 文档：https://www.253.com/docs
        |
        */
        'chuanglan253' => [
            'driver' => 'chuanglan253',                              // 驱动名称
            'account' => env('CHUANGLAN253_ACCOUNT', ''),            // 账号
            'password' => env('CHUANGLAN253_PASSWORD', ''),          // 密码
            'sign_name' => env('CHUANGLAN253_SMS_SIGN_NAME', ''),    // 短信签名
            'api_url' => env('CHUANGLAN253_API_URL', 'https://smssh1.253.com/msg/send/json'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 创蓝云智
        |----------------------------------------------------------------------
        |
        | 创蓝云智短信服务，需要配置账号和密码
        | 文档：https://zz.253.com/v5/doc
        |
        */
        'chuanglanyunzhi' => [
            'driver' => 'chuanglanyunzhi',                           // 驱动名称
            'account' => env('CHUANGLANYUNZHI_ACCOUNT', ''),         // 账号
            'password' => env('CHUANGLANYUNZHI_PASSWORD', ''),       // 密码
            'sign_name' => env('CHUANGLANYUNZHI_SMS_SIGN_NAME', ''), // 短信签名
            'api_url' => env('CHUANGLANYUNZHI_API_URL', 'https://api.253.com/open/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 融云
        |----------------------------------------------------------------------
        |
        | 融云短信服务，需要配置 App Key 和 App Secret
        | 文档：https://docs.rongcloud.cn/v4/5X/views/sms/note/intro.html
        |
        */
        'rongcloud' => [
            'driver' => 'rongcloud',                                 // 驱动名称
            'app_key' => env('RONGCLOUD_APP_KEY', ''),               // App Key
            'app_secret' => env('RONGCLOUD_APP_SECRET', ''),         // App Secret
            'sign_name' => env('RONGCLOUD_SMS_SIGN_NAME', ''),       // 短信签名
            'template_id' => env('RONGCLOUD_TEMPLATE_ID', ''),       // 模板 ID
        ],

        /*
        |----------------------------------------------------------------------
        | 天毅无线
        |----------------------------------------------------------------------
        |
        | 天毅无线短信服务，需要配置用户名和密码
        | 文档：http://www.ty-telecom.com/
        |
        */
        'tianyi' => [
            'driver' => 'tianyi',                                    // 驱动名称
            'username' => env('TIANYI_USERNAME', ''),                // 用户名
            'password' => env('TIANYI_PASSWORD', ''),                // 密码
            'sign_name' => env('TIANYI_SMS_SIGN_NAME', ''),          // 短信签名
            'api_url' => env('TIANYI_API_URL', 'http://api.ty-telecom.com/sms/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 网易云信
        |----------------------------------------------------------------------
        |
        | 网易云信短信服务，需要配置 App Key 和 App Secret
        | 文档：https://dev.yunxin.163.com/docs/api/sms/
        |
        */
        'netease' => [
            'driver' => 'netease',                                   // 驱动名称
            'app_key' => env('NETEASE_APP_KEY', ''),                 // App Key
            'app_secret' => env('NETEASE_APP_SECRET', ''),           // App Secret
            'sign_name' => env('NETEASE_SMS_SIGN_NAME', ''),         // 短信签名
            'template_id' => env('NETEASE_TEMPLATE_ID', ''),         // 模板 ID
        ],

        /*
        |----------------------------------------------------------------------
        | 云之讯
        |----------------------------------------------------------------------
        |
        | 云之讯短信服务，需要配置 Account SID 和 Auth Token
        | 文档：https://www.ucpaas.com/page/doc.jsp
        |
        */
        'yunzhixun' => [
            'driver' => 'yunzhixun',                                 // 驱动名称
            'account_sid' => env('YUNZHIXUN_ACCOUNT_SID', ''),       // Account SID
            'auth_token' => env('YUNZHIXUN_AUTH_TOKEN', ''),         // Auth Token
            'app_id' => env('YUNZHIXUN_APP_ID', ''),                 // App ID
            'sign_name' => env('YUNZHIXUN_SMS_SIGN_NAME', ''),       // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | 凯信通
        |----------------------------------------------------------------------
        |
        | 凯信通短信服务，需要配置用户名和密码
        | 文档：http://www.kxt-sms.com/
        |
        */
        'kaixintong' => [
            'driver' => 'kaixintong',                                // 驱动名称
            'username' => env('KAIXINTONG_USERNAME', ''),            // 用户名
            'password' => env('KAIXINTONG_PASSWORD', ''),            // 密码
            'sign_name' => env('KAIXINTONG_SMS_SIGN_NAME', ''),      // 短信签名
            'api_url' => env('KAIXINTONG_API_URL', 'http://www.kxt-sms.com/api/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | UE35.net
        |----------------------------------------------------------------------
        |
        | UE35 短信服务，需要配置用户名和密码
        | 文档：http://www.ue35.net/
        |
        */
        'ue35' => [
            'driver' => 'ue35',                                      // 驱动名称
            'username' => env('UE35_USERNAME', ''),                  // 用户名
            'password' => env('UE35_PASSWORD', ''),                  // 密码
            'sign_name' => env('UE35_SMS_SIGN_NAME', ''),            // 短信签名
            'api_url' => env('UE35_API_URL', 'http://www.ue35.net/api/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 短信宝
        |----------------------------------------------------------------------
        |
        | 短信宝短信服务，需要配置用户名和密码
        | 文档：http://www.smsbao.com/openapi/
        |
        */
        'smsbao' => [
            'driver' => 'smsbao',                                    // 驱动名称
            'username' => env('SMSBAO_USERNAME', ''),                // 用户名
            'password' => env('SMSBAO_PASSWORD', ''),                // 密码
            'sign_name' => env('SMSBAO_SMS_SIGN_NAME', ''),          // 短信签名
            'api_url' => env('SMSBAO_API_URL', 'https://api.smsbao.com/sms'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | Tiniyo
        |----------------------------------------------------------------------
        |
        | Tiniyo 短信服务，需要配置 Account SID 和 Auth Token
        | 文档：https://tiniyo.com/docs/
        |
        */
        'tiniyo' => [
            'driver' => 'tiniyo',                                    // 驱动名称
            'account_sid' => env('TINIYO_ACCOUNT_SID', ''),          // Account SID
            'auth_token' => env('TINIYO_AUTH_TOKEN', ''),            // Auth Token
            'sign_name' => env('TINIYO_SMS_SIGN_NAME', ''),          // 短信签名
        ],

        /*
        |----------------------------------------------------------------------
        | 摩杜云
        |----------------------------------------------------------------------
        |
        | 摩杜云短信服务，需要配置 Access Key ID 和 Access Key Secret
        | 文档：https://www.moduyun.com/doc/
        |
        */
        'moduyun' => [
            'driver' => 'moduyun',                                   // 驱动名称
            'access_key_id' => env('MODUYUN_ACCESS_KEY_ID', ''),     // Access Key ID
            'access_key_secret' => env('MODUYUN_ACCESS_KEY_SECRET', ''), // Access Key Secret
            'sign_name' => env('MODUYUN_SMS_SIGN_NAME', ''),         // 短信签名
            'template_code' => env('MODUYUN_TEMPLATE_CODE', ''),     // 模板编码
        ],

        /*
        |----------------------------------------------------------------------
        | 融合云（助通）
        |----------------------------------------------------------------------
        |
        | 融合云短信服务，需要配置用户名和密码
        | 文档：https://www.ztinfo.cn/
        |
        */
        'rongheyun' => [
            'driver' => 'rongheyun',                                 // 驱动名称
            'username' => env('RONGHEYUN_USERNAME', ''),             // 用户名
            'password' => env('RONGHEYUN_PASSWORD', ''),             // 密码
            'sign_name' => env('RONGHEYUN_SMS_SIGN_NAME', ''),       // 短信签名
            'api_url' => env('RONGHEYUN_API_URL', 'https://api.mix2.zthysms.com/v2/sendSmsTp'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 蜘蛛云
        |----------------------------------------------------------------------
        |
        | 蜘蛛云短信服务，需要配置 App ID 和 App Key
        | 文档：https://www.zhiziyun.com/
        |
        */
        'zhiziyun' => [
            'driver' => 'zhiziyun',                                  // 驱动名称
            'app_id' => env('ZHIZIYUN_APP_ID', ''),                  // App ID
            'app_key' => env('ZHIZIYUN_APP_KEY', ''),                // App Key
            'sign_name' => env('ZHIZIYUN_SMS_SIGN_NAME', ''),        // 短信签名
            'template_id' => env('ZHIZIYUN_TEMPLATE_ID', ''),        // 模板 ID
        ],

        /*
        |----------------------------------------------------------------------
        | 融合云信
        |----------------------------------------------------------------------
        |
        | 融合云信短信服务，需要配置用户名和密码
        | 文档：http://www.rhyx.cn/
        |
        */
        'rongheyunxin' => [
            'driver' => 'rongheyunxin',                              // 驱动名称
            'username' => env('RONGHEYUNXIN_USERNAME', ''),          // 用户名
            'password' => env('RONGHEYUNXIN_PASSWORD', ''),          // 密码
            'sign_name' => env('RONGHEYUNXIN_SMS_SIGN_NAME', ''),    // 短信签名
            'api_url' => env('RONGHEYUNXIN_API_URL', 'http://api.rhyx.cn/sms/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 天瑞云
        |----------------------------------------------------------------------
        |
        | 天瑞云短信服务，需要配置用户名和密码
        | 文档：http://www.tianruiyun.com/
        |
        */
        'tianruiyun' => [
            'driver' => 'tianruiyun',                                // 驱动名称
            'username' => env('TIANRUIYUN_USERNAME', ''),            // 用户名
            'password' => env('TIANRUIYUN_PASSWORD', ''),            // 密码
            'sign_name' => env('TIANRUIYUN_SMS_SIGN_NAME', ''),      // 短信签名
            'api_url' => env('TIANRUIYUN_API_URL', 'http://api.tianruiyun.com/sms/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 时代互联
        |----------------------------------------------------------------------
        |
        | 时代互联短信服务，需要配置用户名和密码
        | 文档：https://www.now.cn/
        |
        */
        'shidaihulian' => [
            'driver' => 'shidaihulian',                              // 驱动名称
            'username' => env('SHIDAIHULIAN_USERNAME', ''),          // 用户名
            'password' => env('SHIDAIHULIAN_PASSWORD', ''),          // 密码
            'sign_name' => env('SHIDAIHULIAN_SMS_SIGN_NAME', ''),    // 短信签名
            'api_url' => env('SHIDAIHULIAN_API_URL', 'http://api.now.cn/sms/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 火山引擎
        |----------------------------------------------------------------------
        |
        | 火山引擎短信服务，需要配置 Access Key ID 和 Access Key Secret
        | 文档：https://www.volcengine.com/docs/46/8646
        |
        */
        'volcengine' => [
            'driver' => 'volcengine',                                // 驱动名称
            'access_key_id' => env('VOLCENGINE_ACCESS_KEY_ID', ''),  // Access Key ID
            'access_key_secret' => env('VOLCENGINE_ACCESS_KEY_SECRET', ''), // Access Key Secret
            'sign_name' => env('VOLCENGINE_SMS_SIGN_NAME', ''),      // 短信签名
            'template_id' => env('VOLCENGINE_TEMPLATE_ID', ''),      // 模板 ID
            'region' => env('VOLCENGINE_REGION', 'cn-north-1'),      // 地域
        ],

        /*
        |----------------------------------------------------------------------
        | 移动云MAS（黑名单模式）
        |----------------------------------------------------------------------
        |
        | 中国移动云 MAS 短信服务，需要配置用户名、密码和企业代码
        | 文档：https://mas.10086.cn/
        |
        */
        'mas' => [
            'driver' => 'mas',                                       // 驱动名称
            'username' => env('MAS_USERNAME', ''),                   // 用户名
            'password' => env('MAS_PASSWORD', ''),                   // 密码
            'ec_name' => env('MAS_EC_NAME', ''),                     // 企业代码
            'sign_name' => env('MAS_SMS_SIGN_NAME', ''),             // 短信签名
            'api_url' => env('MAS_API_URL', 'https://mas.10086.cn/api/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 电信天翼云
        |----------------------------------------------------------------------
        |
        | 中国电信天翼云短信服务，需要配置用户名和密码
        | 文档：https://www.ctyun.cn/
        |
        */
        'ctyun' => [
            'driver' => 'ctyun',                                     // 驱动名称
            'username' => env('CTYUN_USERNAME', ''),                 // 用户名
            'password' => env('CTYUN_PASSWORD', ''),                 // 密码
            'sign_name' => env('CTYUN_SMS_SIGN_NAME', ''),           // 短信签名
            'template_id' => env('CTYUN_TEMPLATE_ID', ''),           // 模板 ID
            'api_url' => env('CTYUN_API_URL', 'https://api.ctyun.cn/sms/send'), // API 地址
        ],

        /*
        |----------------------------------------------------------------------
        | 微趣云
        |----------------------------------------------------------------------
        |
        | 微趣云短信服务，需要配置用户名和密码
        | 文档：https://www.weiquyun.com/
        |
        */
        'weiquyun' => [
            'driver' => 'weiquyun',                                  // 驱动名称
            'username' => env('WEIQUYUN_USERNAME', ''),              // 用户名
            'password' => env('WEIQUYUN_PASSWORD', ''),              // 密码
            'sign_name' => env('WEIQUYUN_SMS_SIGN_NAME', ''),        // 短信签名
            'api_url' => env('WEIQUYUN_API_URL', 'https://api.weiquyun.com/sms/send'), // API 地址
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | 短信模板配置
    |--------------------------------------------------------------------------
    |
    | 预定义的短信模板 ID 映射，方便统一管理各平台的模板
    | 使用时可通过模板名称获取对应平台的模板 ID
    |
    */
    'templates' => [
        'verification_code' => [
            'aliyun' => env('ALIYUN_SMS_TEMPLATE_CODE', ''),
            'tencent' => env('TENCENT_SMS_TEMPLATE_ID', ''),
            'huawei' => env('HUAWEI_SMS_TEMPLATE_ID', ''),
            'yunpian' => env('YUNPIAN_TEMPLATE_ID', ''),
            'qiniu' => env('QINIU_SMS_TEMPLATE_ID', ''),
            'baidu' => env('BAIDU_SMS_TEMPLATE_CODE', ''),
            'volcengine' => env('VOLCENGINE_TEMPLATE_ID', ''),
        ],
    ],
];
```

### 配置参数说明

| 参数 | 类型 | 说明 |
|------|------|------|
| `default` | string | 默认使用的短信网关 |
| `gateways` | array | 各短信服务商的配置集合 |
| `templates` | array | 预定义的短信模板 ID 映射 |

### 各服务商配置参数详解

**阿里云短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `access_key_id` | 是 | 阿里云 AccessKey ID |
| `access_key_secret` | 是 | 阿里云 AccessKey Secret |
| `sign_name` | 是 | 短信签名 |
| `region_id` | 否 | 地域 ID，默认 `cn-hangzhou` |

**腾讯云短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `secret_id` | 是 | 腾讯云 SecretId |
| `secret_key` | 是 | 腾讯云 SecretKey |
| `app_id` | 是 | 应用 ID |
| `sign_name` | 是 | 短信签名 |
| `region` | 否 | 地域，默认 `ap-guangzhou` |

**华为云短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `app_key` | 是 | 华为云 AppKey |
| `app_secret` | 是 | 华为云 AppSecret |
| `sender` | 是 | 发送方号码 |
| `signature` | 是 | 签名 |
| `endpoint` | 否 | 端点地址 |

**云片短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `api_key` | 是 | 云片 API Key |
| `sign_name` | 是 | 短信签名 |

**UCloud 短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `public_key` | 是 | UCloud 公钥 |
| `private_key` | 是 | UCloud 私钥 |
| `project_id` | 是 | 项目 ID |
| `sign_name` | 是 | 短信签名 |

**七牛云短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `access_key` | 是 | 七牛云 AccessKey |
| `secret_key` | 是 | 七牛云 SecretKey |
| `sign_name` | 是 | 短信签名 |

**SendCloud 短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `sms_user` | 是 | SendCloud SMS User |
| `sms_key` | 是 | SendCloud SMS Key |
| `sign_name` | 是 | 短信签名 |

**Submail 赛邮**
| 参数 | 必填 | 说明 |
|------|------|------|
| `app_id` | 是 | Submail AppID |
| `app_key` | 是 | Submail AppKey |
| `sign_name` | 是 | 短信签名 |
| `project_id` | 否 | 项目 ID |

**螺丝帽短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `api_key` | 是 | 螺丝帽 API Key |
| `sign_name` | 是 | 短信签名 |

**容联云通讯**
| 参数 | 必填 | 说明 |
|------|------|------|
| `account_sid` | 是 | 容联云 Account SID |
| `auth_token` | 是 | 容联云 Auth Token |
| `app_id` | 是 | App ID |
| `sign_name` | 是 | 短信签名 |

**互亿无线**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**聚合数据**
| 参数 | 必填 | 说明 |
|------|------|------|
| `key` | 是 | 聚合数据 Key |
| `sign_name` | 是 | 短信签名 |
| `tpl_id` | 是 | 模板 ID |

**百度云短信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `access_key` | 是 | 百度云 Access Key |
| `secret_key` | 是 | 百度云 Secret Key |
| `endpoint` | 是 | 服务端点 |
| `sign_name` | 是 | 短信签名 |
| `template_code` | 是 | 模板编码 |

**华信短信平台**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**253云通讯（创蓝）**
| 参数 | 必填 | 说明 |
|------|------|------|
| `account` | 是 | 账号 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**创蓝云智**
| 参数 | 必填 | 说明 |
|------|------|------|
| `account` | 是 | 账号 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**融云**
| 参数 | 必填 | 说明 |
|------|------|------|
| `app_key` | 是 | 融云 App Key |
| `app_secret` | 是 | 融云 App Secret |
| `sign_name` | 是 | 短信签名 |
| `template_id` | 是 | 模板 ID |

**天毅无线**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**网易云信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `app_key` | 是 | 网易云信 App Key |
| `app_secret` | 是 | 网易云信 App Secret |
| `sign_name` | 是 | 短信签名 |
| `template_id` | 是 | 模板 ID |

**云之讯**
| 参数 | 必填 | 说明 |
|------|------|------|
| `account_sid` | 是 | 云之讯 Account SID |
| `auth_token` | 是 | 云之讯 Auth Token |
| `app_id` | 是 | App ID |
| `sign_name` | 是 | 短信签名 |

**凯信通**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**UE35.net**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**短信宝**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**Tiniyo**
| 参数 | 必填 | 说明 |
|------|------|------|
| `account_sid` | 是 | Tiniyo Account SID |
| `auth_token` | 是 | Tiniyo Auth Token |
| `sign_name` | 是 | 短信签名 |

**摩杜云**
| 参数 | 必填 | 说明 |
|------|------|------|
| `access_key_id` | 是 | 摩杜云 Access Key ID |
| `access_key_secret` | 是 | 摩杜云 Access Key Secret |
| `sign_name` | 是 | 短信签名 |
| `template_code` | 是 | 模板编码 |

**融合云（助通）**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**蜘蛛云**
| 参数 | 必填 | 说明 |
|------|------|------|
| `app_id` | 是 | 蜘蛛云 App ID |
| `app_key` | 是 | 蜘蛛云 App Key |
| `sign_name` | 是 | 短信签名 |
| `template_id` | 是 | 模板 ID |

**融合云信**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**天瑞云**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**时代互联**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**火山引擎**
| 参数 | 必填 | 说明 |
|------|------|------|
| `access_key_id` | 是 | 火山引擎 Access Key ID |
| `access_key_secret` | 是 | 火山引擎 Access Key Secret |
| `sign_name` | 是 | 短信签名 |
| `template_id` | 是 | 模板 ID |
| `region` | 否 | 地域，默认 `cn-north-1` |

**移动云MAS**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `ec_name` | 是 | 企业代码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

**电信天翼云**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `template_id` | 是 | 模板 ID |
| `api_url` | 否 | API 地址 |

**微趣云**
| 参数 | 必填 | 说明 |
|------|------|------|
| `username` | 是 | 用户名 |
| `password` | 是 | 密码 |
| `sign_name` | 是 | 短信签名 |
| `api_url` | 否 | API 地址 |

## 常见问题

### 1. 手机号格式验证

本包默认验证中国大陆手机号格式（以 1 开头，第二位为 3-9，共 11 位数字）。如需支持其他格式，可以重写 `formatPhone` 方法。

### 2. 签名问题

不同服务商对签名的要求不同：
- **阿里云**：签名需要在控制台申请，发送时无需包含【】
- **云片**：签名需要在内容前加【签名】
- **螺丝帽**：签名需要在内容前加【签名】

### 3. 模板参数

不同服务商的模板参数格式：
- **阿里云**：`${code}` 格式
- **腾讯云**：`{1}`、`{2}` 数字索引格式
- **云片**：`#code#` 格式

### 4. 批量发送限制

不同服务商对批量发送有不同的限制：
- 阿里云：单次最多 1000 个号码
- 腾讯云：单次最多 200 个号码
- 其他服务商请参考官方文档

## 项目结构

```
packages/kylin/sms/
├── config/
│   └── sms.php                    # 配置文件
├── src/
│   ├── Channels/
│   │   └── SmsChannel.php         # Laravel 通知渠道
│   ├── Contracts/
│   │   └── GatewayInterface.php   # 网关接口定义
│   ├── Exceptions/
│   │   ├── GatewayException.php          # 网关异常
│   │   ├── GatewayNotFoundException.php  # 网关未找到异常
│   │   ├── InvalidPhoneNumberException.php # 无效手机号异常
│   │   └── SmsException.php              # 短信异常基类
│   ├── Facades/
│   │   └── Sms.php                # 门面类
│   ├── Gateways/
│   │   ├── AliyunGateway.php      # 阿里云网关
│   │   ├── TencentGateway.php     # 腾讯云网关
│   │   ├── HuaweiGateway.php      # 华为云网关
│   │   ├── BaiduGateway.php       # 百度云网关
│   │   ├── YunpianGateway.php     # 云片网关
│   │   ├── BaseGateway.php        # 网关基类
│   │   └── ...                    # 其他网关
│   ├── Messages/
│   │   └── SmsMessage.php         # 短信消息类
│   ├── SmsManager.php             # 短信管理器
│   └── SmsServiceProvider.php     # 服务提供者
├── tests/                         # 测试目录
├── composer.json                  # Composer 配置
└── README.md                      # 说明文档
```

## 更新日志

### v1.0.0 (2024-01-01)

- 初始版本发布
- 支持 35+ 短信服务商
- 集成 Laravel 通知系统
- 完善的异常处理机制
- 所有代码添加详细中文注释

## 贡献指南

欢迎提交 Issue 和 Pull Request。

### 开发环境搭建

```bash
# 克隆仓库
git clone https://github.com/kylin/sms.git

# 安装依赖
composer install

# 运行测试
composer test
```

### 代码规范

- 所有代码必须包含详细的中文注释
- 遵循 PSR-12 代码规范
- 新增网关必须继承 `BaseGateway` 类
- 新增方法必须包含完整的 PHPDoc 注释

## 开源协议

本包基于 [MIT 协议](LICENSE) 开源。

## 作者

- 王康 ([earl.k.wang@wangk.cn](mailto:earl.k.wang@wangk.cn))

## 致谢

感谢所有短信服务商提供的 API 支持。
