万商超信
短信发送模块(短信接口插件)
2021-12-10 03:44
- 支持目前市面多家服务商
- 一套写法兼容所有平台
- 简单配置即可灵活增减服务商
- 内置多种服务商轮询策略、支持自定义轮询策略
- 统一的返回值格式,便于日志与监控
- 自动轮询选择可用的服务商
- 更多等你去发现与改进...
平台支持
- 阿里云
- 云
- Submail
- 螺丝帽
- 阿里大于
- 容联云通讯
- 互亿无线
- 聚合数据
- SendCloud
- 百度云
环境需求
- PHP >= 5.6
安装
$ composer require "overtrue/easy-sms"
使用
use OvertrueEasySmsEasySms;
$config = [
// HTTP 请求的超时时间(秒)
'timeout' => 5.0,
// 默认发送配置
'default' => [
// 网关调用策略,默认:顺序调用
'strategy' => OvertrueEasySmsStrategiesOrderStrategy::class,
// 默认可用的发送网关
'gateways' => [
'yunpian', 'aliyun', 'alidayu',
],
],
// 可用的网关配置
'gateways' => [
'errorlog' => [
'file' => '/tmp/easy-sms.log',
],
'yunpian' => [
'api_key' => '824f0ff2f71cab52936axxxxxxxxxx',
],
'aliyun' => [
'access_key_id' => '',
'access_key_secret' => '',
'sign_name' => '',
],
'alidayu' => [
//...
],
],
];
$easySms = new EasySms($config);
$easySms->send(13188888888, [
'content' => '您的验证码为: 6379',
'template' => 'SMS_001',
'data' => [
'code' => 6379
],
]);
短信内容
由于使用多网关发送,所以一条短信要支持多平台发送,每家的发送方式不一样,但是我们抽象定义了以下公用属性:
- content 文字内容,使用在像云片类似的以文字内容发送的平台
- template 模板 ID,使用在以模板ID来发送短信的平台
- data 模板变量,使用在以模板ID来发送短信的平台
所以,在使用过程中你可以根据所要使用的平台定义发送的内容。[短信发送模块(短信接口插件)]。
发送网关
默认使用 default 中的设置来发送,如果某一条短信你想要覆盖默认的设置。在 send 方法中使用第三个参数即可:
$easySms->send(13188888888, [
'content' => '您的验证码为: 6379',
'template' => 'SMS_001',
'data' => [
'code' => 6379
],
], ['yunpian', 'juhe']); // 这里的网关配置将会覆盖全局默认值
返回值
由于使用多网关发送,所以返回值为一个数组,结构如下:
[
'yunpian' => [
'status' => 'success',
'result' => [...] // 平台返回值
],
'juhe' => [
'status' => 'erred',
'exception' => OvertrueEasySmsExceptionsGatewayErrorException 对象
],
//...
]
如果所选网关列表均发送失败时,将会抛出 OvertrueEasySmsExceptionsNoGatewayAvailableException 异常,你可以使用 $e->results 获取发送结果。
自定义网关
本拓展已经支持用户自定义网关,你可以很方便的配置即可当成与其它拓展一样的使用:
$config = [
...
'default' => [
'gateways' => [
'mygateway', // 配置你的网站到可用的网关列表
],
],
'gateways' => [
'mygateway' => [...], // 你网关所需要的参数,如果没有可以不配置
],
];
$easySms = new EasySms($config);
// 注册
$easySms->extend('mygateway', function($gatewayConfig){
// $gatewayConfig 来自配置文件里的 `gateways.mygateway`
return new MyGateway($gatewayConfig);
});
$easySms->send(13188888888, [
'content' => '您的验证码为: 6379',
'template' => 'SMS_001',
'data' => [
'code' => 6379
],
]);
定义短信
你可以根本发送场景的不同,定义不同的短信类,从而实现一处定义多处调用,你可以继承 OvertrueEasySmsMessage 来定义短信模型:
<?php
use OvertrueEasySmsMessage;
use OvertrueEasySmsContractsGatewayInterface;
use OvertrueEasySmsStrategiesOrderStrategy;
class OrderPaidMessage extends Message
{
protected $order;
protected $strategy = OrderStrategy::class; // 定义本短信的网关使用策略,覆盖全局配置中的 `default.strategy`
protected $gateways = ['alidayu', 'yunpian', 'juhe']; // 定义本短信的适用平台,覆盖全局配置中的 `default.gateways`
public function __construct($order)
{
$this->order = $order;
}
// 定义直接使用内容发送平台的内容
public function getContent(GatewayInterface $gateway = null)
{
return sprintf('您的订单:%s, 已经完成付款', $this->order->no);
}
// 定义使用模板发送方式平台所需要的模板 ID
public function getTemplate(GatewayInterface $gateway = null)
{
return 'SMS_003';
}
// 模板参数
public function getData(GatewayInterface $gateway = null)
{
return [
'order_no' => $this->order->no
];
}
}
更多自定义方式请参考:OvertrueEasySmsMessage
发送自定义短信:
$order = ...;
$message = new OrderPaidMessage($order);
$easySms->send(13188888888, $message);
各平台配置说明
阿里云
短信内容使用 template + data
'aliyun' => [
'access_key_id' => '',
'access_key_secret' => '',
'sign_name' => '',
],
阿里大于
短信内容使用 template + data
'alidayu' => [
'app_key' => '',
'app_secret' => '',
'sign_name' => '',
],
云片
短信内容使用 content
'yunpian' => [
'api_key' => '',
],
Submail
短信内容使用 data
'submail' => [
'app_id' => '',
'app_key' => '',
'project' => '',
],
螺丝帽
短信内容使用 content
'luosimao' => [
'api_key' => '',
],
容联云通讯
短信内容使用 template + data
'yuntongxun' => [
'app_id' => '',
'account_sid' => '',
'account_token' => '',
'is_sub_account' => false,
],
互亿无线
短信内容使用 content
'huyi' => [
'api_id' => '',
'api_key' => '',
],
聚合数据
短信内容使用 template + data
'juhe' => [
'app_key' => '',
],
SendCloud
短信内容使用 template + data
'sendcloud' => [
'sms_user' => '',
'sms_key' => '',
],
百度云
短信内容使用 template + data
'baidu' => [
'ak' => '',
'sk' => '',
'invoke_id' => '',
'domain' => '',
],