环境需求

  PHP >= 5.6

  安装

  $ composer require "overtrue/easy-sms"

  使用

use Overtrue\EasySms\EasySms;

$config = [
   // HTTP 请求的超时时间(秒)
   'timeout' => 5.0,

   // 默认发送配置
   'default' => [
       // 网关调用策略,默认:顺序调用
       'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

       // 默认可用的发送网关
       'gateways' => [
           'yunpian', 'aliyun',
       ],
   ],
   // 可用的网关配置
   'gateways' => [
       'errorlog' => [
           'file' => '/tmp/easy-sms.log',
       ],
       'yunpian' => [
           'api_key' => '824f0ff2f71cab52936axxxxxxxxxx',
       ],
       'aliyun' => [
           'access_key_id' => '',
           'access_key_secret' => '',
           'sign_name' => '',
       ],
       //...
   ],
];

$easySms = new EasySms($config);

$easySms->send(13188888888, [
   'content'  => '您的验证码为: 6379',
   'template' => 'SMS_001',
   'data' => [
       'code' => 6379
   ],
]);

        短信内容

由于使用多网关发送,所以一条短信要支持多平台发送,每家的发送方式不一样,但是我们抽象定义了以下公用属性:

content 文字内容,使用在像云片类似的以文字内容发送的平台

template 模板 ID,使用在以模板ID来发送短信的平台

data 模板变量,使用在以模板ID来发送短信的平台

所以,在使用过程中你可以根据所要使用的平台定义发送的内容。

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);

        你也可以使包来返回对应的值:

$easySms->send(13188888888, [
   'content'  => function($gateway){
       return '您的验证码为: 6379';
   },
   'template' => function($gateway){
       return 'SMS_001';
   },
   'data' => function($gateway){
       return [
           'code' => 6379
       ];
   },
]);

        你可以根据 $gateway 参数类型来判断返回值,例如:

$easySms->send(13188888888, [
   'content'  => function($gateway){
       if ($gateway->getName() == 'yunpian') {
           return '云片专用验证码:1235';
       }
       return '您的验证码为: 6379';
   },
   'template' => function($gateway){
       if ($gateway->getName() == 'aliyun') {
           return 'TP2818';
       }
       return 'SMS_001';
   },
   'data' => function($gateway){
       return [
           'code' => 6379
       ];
   },
]);

        发送网关

        默认使用 default 中的设置来发送,如果某一条短信你想要覆盖默认的设置。在 send 方法中使用第三个参数即可:

$easySms->send(13188888888, [
   'content'  => '您的验证码为: 6379',
   'template' => 'SMS_001',
   'data' => [
       'code' => 6379
   ],
], ['yunpian', 'juhe']); // 这里的网关配置将会覆盖全局默认值

        返回值

        由于使用多网关发送,所以返回值为一个数组,结构如下:

[
   'yunpian' => [
       'gateway' => 'yunpian',
       'status' => 'success',
       'result' => [...] // 平台返回值
   ],
   'juhe' => [
       'gateway' => 'juhe',
       'status' => 'failure',
       'exception' => \Overtrue\EasySms\Exceptions\GatewayErrorException 对象
   ],
   //...
]

如果所选网关列表均发送失败时,将会抛出 Overtrue\EasySms\Exceptions\NoGatewayAvailableException 异常,你可以使用 $e->results 获取发送结果。

你也可以使用 $e 提供的更多便捷方法:

$e->getResults();               // 返回所有 API 的结果,结构同上
$e->getExceptions();            // 返回所有调用异常列表
$e->getException($gateway);     // 返回指定网关名称的异常对象
$e->getLastException();         // 获取最后一个失败的异常对象

更多使用详情:https://github.com/overtrue/easy-sms