可能是目前最聪明、优雅的php短信发送库了。从此不再为各种原因造成的个别短信发送失败而烦忧!

phpsms的任务均衡调度功能由toplan/task-balancer提供。

GitHub地址:https://github.com/toplan/phpsms

特点

  • 支持发送均衡调度,可按代理器权重值均衡选择服务商发送。
  • 支持语音验证码。
  • 支持一个或多个备用代理器(服务商)。
  • 允许推入队列,并自定义队列实现逻辑(与队列系统松散耦合)。
  • 短信/语音发送前后钩子。
  • 支持国内主流短信服务商。
  • 自定义代理器和寄生代理器。

服务商

服务商 模板短信 内容短信 语音验证码 最低消费 最低消费单价
Luosimao × ¥850(1万条) ¥0.085/条
云片网络 × ¥55(1千条) ¥0.055/条
容联·云通讯 × 充值¥500 ¥0.055/条
SUBMAIL × × ¥100(1千条) ¥0.100/条
云之讯 × -- ¥0.050/条
聚合数据 × -- ¥0.035/条
阿里大鱼 × -- ¥0.045/条
SendCloud × -- ¥0.048/条

安装

composer require 'toplan/phpsms:~1.6.0'

安装开发中版本:

composer require 'toplan/phpsms:dev-master'

快速上手

1. 配置

  • 配置代理器所需参数

为你需要用到的短信服务商(即代理器)配置必要的参数。可以在config\phpsms.php中键为agents的数组中配置,也可以手动在程序中设置,示例如下:

//example:
Sms::config(['Luosimao' => [//短信API key'apikey' => 'your api key',//语音验证API key'voiceApikey' => 'your voice api key',],'YunPian'  => [//用户唯一标识,必须'apikey' => 'your api key',]
]);
  • 配置代理器调度方案

可在config\phpsms.php中键为scheme的数组中配置。也可以手动在程序中设置,示例如下:

//example:
Sms::scheme([//被使用概率为2/3'Luosimao' => '20',//被使用概率为1/3,且为备用代理器'YunPian' => '10 backup',//仅为备用代理器'YunTongXun' => '0 backup',
]);

调度方案解析: 如果按照以上配置,那么系统首次会尝试使用Luosimao或YunPian发送短信,且它们被使用的概率分别为2/3和1/3。 如果使用其中一个代理器发送失败,那么会启用备用代理器,按照配置可知备用代理器有YunPian和YunTongXun,那么会依次调用直到发送成功或无备用代理器可用。 值得注意的是,如果首次尝试的是YunPian,那么备用代理器将会只使用YunTongXun,也就是会排除使用过的代理器。

2. Enjoy it!

require('path/to/vendor/autoload.php');
use Toplan\PhpSms\Sms;// 接收人手机号
$to = '1828****349';
// 短信模版
$templates = ['YunTongXun' => 'your_temp_id','SubMail'    => 'your_temp_id'
];
// 模版数据
$tempData = ['code' => '87392','minutes' => '5'
];
// 短信内容
$content = '【签名】这是短信内容...';// 只希望使用模板方式发送短信,可以不设置content(如:云通讯、Submail、Ucpaas)
Sms::make()->to($to)->template($templates)->data($tempData)->send();// 只希望使用内容方式放送,可以不设置模板id和模板data(如:云片、luosimao)
Sms::make()->to($to)->content($content)->send();// 同时确保能通过模板和内容方式发送,这样做的好处是,可以兼顾到各种类型服务商
Sms::make()->to($to)->template($templates)->data($tempData)->content($content)->send();// 语音验证码
Sms::voice('02343')->to($to)->send();// 语音验证码兼容模版语音(如阿里大鱼的文本转语音)
Sms::voice('02343')->template('Alidayu', 'your_tts_code')->data(['code' => '02343'])->to($to)->send();

3. 在laravel中使用

如果你只想单纯的在laravel中使用phpsms的功能可以按如下步骤操作, 当然也为你准备了基于phpsms开发的laravel-sms

  • 在config/app.php中引入服务提供器
//服务提供器
'providers' => [...Toplan\PhpSms\PhpSmsServiceProvider::class,
]//别名
'aliases' => [...'PhpSms' => Toplan\PhpSms\Facades\Sms::class,
]
  • 生成配置文件
php artisan vendor:publish

生成的配置文件为config/phpsms.php,然后在该文件中按提示配置。

  • 使用

详见API,示例:

PhpSms::make()->to($to)->content($content)->send();

API

API - 全局配置

Sms::scheme([$name[, $scheme]])

设置/获取代理器的调度方案。

调度配置在调度系统启动后(创建Sms实例时会自动启动)就不能修改。

  • 设置

手动设置代理器调度方案(优先级高于配置文件),如:

Sms::scheme(['Luosimao' => '80 backup''YunPian' => '100 backup'
]);
//或
Sms::scheme('Luosimao', '80 backup');
Sms::scheme('YunPian', '100 backup');
  • 获取

通过该方法还能获取所有或指定代理器的调度方案,如:

//获取所有的调度方案:
$scheme = Sms::scheme();//获取指定代理器的调度方案:
$scheme['Luosimao'] = Sms::scheme('Luosimao');

scheme静态方法的更多使用方法见高级调度配置

Sms::config([$name[, $config][, $override]]);

设置/获取代理器的配置数据。

代理器参数配置在应用系统的整个运行过程中都是能修改的,这点和调度配置有所不同。

  • 设置

手动设置代理器的配置数据(优先级高于配置文件),如:

Sms::config(['YunPian' => ['apikey' => ...,]
]);
//或
Sms::config('YunPian', ['apikey' => ...,
]);
  • 获取

通过该方法还能获取所有或指定代理器的配置参数,如:

//获取所有的配置:
$config = Sms::config();//获取指定代理器的配置:
$config['Luosimao'] = Sms::config('Luosimao');

Sms::cleanScheme()

清空所有代理器的调度方案,请谨慎使用该接口。

Sms::cleanConfig()

清空所有代理器的配置数据,请谨慎使用该接口。

Sms::beforeSend($handler[, $override]);

发送前钩子,示例:

Sms::beforeSend(function($task, $prev, $index, $handlers){//获取短信数据$smsData = $task->data;...//如果返回false会终止发送任务return true;
});

更多细节请查看task-balancer的“beforeRun”钩子

Sms::beforeAgentSend($handler [, $override]);

代理器发送前钩子,示例:

Sms::beforeAgentSend(function($task, $driver, $prev, $index, $handlers){//短信数据:$smsData = $task->data;//当前使用的代理器名称:$agentName = $driver->name;//如果返回false会停止使用当前代理器return true;
});

更多细节请查看task-balancer的“beforeDriverRun”钩子

Sms::afterAgentSend($handler [, $override]);

代理器发送后钩子,示例:

Sms::afterAgentSend(function($task, $result, $prev, $index, $handlers){//$result为代理器的发送结果数据$agentName = $result['driver'];...
});

更多细节请查看task-balancer的“afterDriverRun”钩子

Sms::afterSend($handler [, $override]);

发送后钩子,示例:

Sms::afterSend(function($task, $result, $prev, $index, $handlers){//$result为发送后获得的结果数组$success = $result['success'];...
});

更多细节请查看task-balancer的“afterRun”钩子

Sms::queue($enable, $handler)

该方法可以设置是否启用队列以及定义如何推送到队列。

$handler匿名函数可使用的参数:

  • $sms : Sms实例
  • $data : Sms实例中的短信数据,等同于$sms->getData()

定义如何推送到队列:

//自动启用队列
Sms::queue(function($sms, $data){//define how to push to queue....
});//第一个参数为true,启用队列
Sms::queue(true, function($sms, $data){//define how to push to queue....
});//第一个参数为false,暂时关闭队列
Sms::queue(false, function($sms, $data){//define how to push to queue....
});

如果已经定义过如何推送到队列,还可以继续设置关闭/开启队列:

Sms::queue(true);//开启队列
Sms::queue(false);//关闭队列

获取队列启用情况:

$enable = Sms::queue();
//为true,表示当前启用了队列。
//为false,表示当前关闭了队列。

API - 发送相关

Sms::make()

生成发送短信的sms实例,并返回实例。

$sms = Sms::make();//创建实例的同时设置短信内容:
$sms = Sms::make('【签名】这是短信内容...');//创建实例的同时设置短信模版:
$sms = Sms::make('YunTongXun', 'your_temp_id');
//或
$sms = Sms::make(['YunTongXun' => 'your_temp_id','SubMail' => 'your_temp_id',...
]);

Sms::voice()

生成发送语音验证码的sms实例,并返回实例。

$sms = Sms::voice();//创建实例的同时设置验证码/语音文件ID
$sms = Sms::voice($code);
  • 如果你使用Luosimao语音验证码,还需用在配置文件中Luosimao选项中设置voiceApikey。
  • 语音文件ID即是在服务商配置的语音文件的唯一编号,比如阿里大鱼语音通知的voice_code。
  • 模版语音是另一种语音请求方式,它是通过模版ID和模版数据进行的语音请求,比如阿里大鱼的文本转语音通知。

$sms->to($mobile)

设置发送给谁,并返回实例。

$sms->to('1828*******');

$sms->template($templates)

指定代理器设置模版id或批量设置,并返回实例。

//设置指定服务商的模板id
$sms->template('YunTongXun', 'your_temp_id')->template('SubMail', 'your_temp_id');//一次性设置多个服务商的模板id
$sms->template(['YunTongXun' => 'your_temp_id','SubMail' => 'your_temp_id',...
]);

$sms->data($data)

设置模板短信的模板数据,并返回实例对象, $data必须为数组。

$sms->data(['code' => $code,'minutes' => $minutes
]);

通过 template 和 data 方法的组合除了可以实现模版短信的数据填充,还可以实现模版语音的数据填充。

$sms->content($text)

设置内容短信的内容,并返回实例对象。一些内置的代理器(如YunPian,Luosimao)使用的是内容短信(即直接发送短信内容),那么就需要为它们设置短信内容。

$sms->content('【签名】这是短信内容...');

$sms->getData([$key])

获取Sms实例中的短信数据,不带参数时返回所有数据,其结构如下:

['type'         => ...,'to'           => ...,'templates'    => [...],'content'      => ...,'templateData' => [...],'voiceCode'    => ...,
]

$sms->agent($name)

临时设置发送时使用的代理器(不会影响备用代理器的正常使用),并返回实例,$name为代理器名称。

$sms->agent('YunPian');

通过该方法设置的代理器将获得绝对优先权,但只对当前短信实例有效。

$sms->send()

请求发送短信/语音验证码。

//会遵循是否使用队列:
$result = $sms->send();//忽略是否使用队列:
$result = $sms->send(true);

$result数据结构请参看task-balancer

高级调度配置

代理器的高级调度配置可以通过配置文件(config/phpsms.php)中的scheme项目配置,也可以通过scheme静态方法设置。 值得注意的是,高级调度配置的值的数据结构是数组。

指定代理器类

如果你自定义了一个代理器,类名不为FooAgent或者命名空间不为Toplan\PhpSms,那么你还可以在调度配置时指定你的代理器使用的类。

  • 配置方式:

通过配置值中agentClass键来指定类名。

  • 示例:
Sms::scheme('agentName', ['10 backup','agentClass' => 'My\Namespace\MyAgentClass'
]);

寄生代理器

如果你既不想使用内置的代理器,也不想创建文件写自定义代理器,那么寄生代理器或许是个好的选择,无需定义代理器类,只需在调度配置时定义好发送短信和语音验证码的方式即可。

  • 配置方式:

通过配置值中sendSms和voiceVerify键来设置发送短信和语音验证码的方式。

  • 示例:
Sms::scheme(['agentName' => ['20 backup','sendSms' => function($agent, $to, $content, $tempId, $tempData){//获取配置(如果设置了的话):$key = $agent->key;...//内置方法:Agent::sockPost(...);Agent::curl(...);...//更新发送结果:$agent->result(Agent::SUCCESS, true);$agent->result(Agent::INFO, 'some info');$agent->result(Agent::CODE, 'your code');},'voiceVerify' => function($agent, $to, $code, $tempId, $tempData){//发送语音验证码,同上}]
]);

自定义代理器

  • step 1

配置项加入到config/phpsms.php中键为agents的数组里。

//example:
'Foo' => ['key' => 'your api key',...
]
  • step 2

新建一个继承Toplan\PhpSms\Agent抽象类的代理器类,建议代理器类名为FooAgent,建议命名空间为Toplan\PhpSms。 如果类名不为FooAgent或者命名空间不为Toplan\PhpSms,在使用该代理器时则需要指定代理器类,详见高级调度配置。

Change logs

v1.4.0

该系列版本相较与之前版本在api的设计上有些变动,具体如下:

  • 修改原enable静态方法为scheme

  • 修改原agents静态方法为config

  • 修改原cleanEnableAgents静态方法为cleanScheme

  • 修改原cleanAgentsConfig静态方法为cleanConfig

  • 去掉getEnableAgents和getAgentsConfig静态方法

v1.5.0

  • 改进语音信息的发送接口以适应阿里大鱼的通过文本转语音和语音文件id两个接口的需求
  • 新加阿里大鱼(Alidayu)代理器

公告

  1. 如果在使用队列相关功能时出现如下错误:
Fatal error:Maximum function nesting level of ‘100′ reached, aborting!

可在/etc/php5/mods-available/xdebug.ini(Linux)中新加xdebug.max_nesting_level=500

Todo list

  • 可用代理器分组配置功能;短信发送时选择分组进行发送的功能。

Encourage

hi, guys! 如果喜欢或者要收藏,欢迎star。如果要提供意见和bug,欢迎issue或提交pr。

License

MIT

PhpSms 稳定可靠的php短信发送库相关推荐

  1. BaoCms短信发送失败问题解答

    BAOCMS(又称生活宝系统)是一款本地生活电商O2O门户系统,程序是基于PHP+mysql开发,系统安全稳定,支持二次开发,目前BAOCMS已经成为国内使用最多.功能最强大.性能最稳定的本地电商生活 ...

  2. Solarwinds如何配置告警短信?(短信发送设置流程)

    SolarWinds是一款专业的网络安全管理软件产品,SolarWinds正在改变各类规模的企业监控和管理其企业网络的方式.如何更快.更准确的将告警通知推送给运维及其他指定人员,短信因其速度快.强展现 ...

  3. 【阿里云】短信服务 无认证 测试版本 附带短信发送工具类

    一.注册阿里云账号并登录阿里云(阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台) 二.找到云短信服务 直接搜索短信,并进入到短信控制台 三.正文 1.绑定测试手机号 测试版存在限制 发送手机 ...

  4. 吉信通让短信发送更安全

    随着人们物质生活水平的提高越来越多的消费者开始重视商家的售后服务体验,而对于商家来说,做好与顾客的沟通就是提高服务质量的不二法宝,因此不少商户采用短信的方法与顾客保持沟通.但吉信通相关负责人表示,由于 ...

  5. 【瑞吉外卖】day08:短信发送、手机验证码登录

    目录 4. 短信发送​编辑 4.1 短信服务介绍 4.2 阿里云短信服务介绍 4.3 阿里云短信服务准备 4.4 代码开发 5. 手机验证码登录 5.1 需求分析 5.2 数据模型 5.3 前端页面分 ...

  6. cmpp2.0 php,CMPP20ERR:短信发送状态回执错误码、返回值信息、错误原因

    达信通为企业客户提供消息发送服务,提供短信验证码.短信通知以及营销短信等多种服务,满足企业各种基础服务和运营活动需求.验证码短信:向手机下发验证码,确认用户的真实性和安全性,如用户登录.手机解绑:短信 ...

  7. 短信营销时短信发送失败的原因有哪些?

    短信营销已经成为一种新型的营销方式,具有发送精准.到达率高.成本低等优点.短信平台有很多人用过,但是在实际操作中,很多人会遇到自己辛苦编辑的短信内容却发送不出去/失败的情况,这到底是什么原因呢? 1. ...

  8. java spring-boot-starter-mail邮件和阿里云华为云短信发送全套

    短信API都是需要对接平台的,平台会提供参考代码比较简单,但是邮件是免费的,除了springboot,还能用javaxmail(我记得是,大家可以查查资料) 文章目录 前言 一.spring-boot ...

  9. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

最新文章

  1. IDEA/Git 设置多个push远程仓库或者同时提交多个push仓库
  2. 使用克隆配置任务配置边缘传输服务器角色
  3. jsp页面之间跳转的数据传递
  4. python一个函数可以有参数也可以没有参数_python 传入任意多个参数(方法调用可传参或不传参)...
  5. 短视频未来3年的规模为3万亿元
  6. python中test_在python中生成py.test测试
  7. spring mvc教程_Spring MVC教程
  8. Mysql允许root用户远程访问
  9. 【开发随笔】以强化学习环境 gym 库为例:为什么日常中我应该试图标准化接口?
  10. python中pass的用法_python学习之getpass模块使用
  11. 32.Linux/Unix 系统编程手册(上) -- 线程:线程取消
  12. cstring 的GetBuffer() 和 ReleaseBuffer()
  13. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)...
  14. Android Studio项目编码设置为GBK或UTF-8  中文乱码 和 Eclipse项目编码设置
  15. 利用Chrome Headless模式网页转PDF
  16. python zip 函数
  17. 双臂14轴机器人YuMi
  18. element-ui中el-dialog使用技巧
  19. 如何在IDEA设置Java类和方法的注释模板?
  20. 交流耦合仪表放大器(AC-Coupled Instrumentation Amplifier)

热门文章

  1. 缓和曲线06七次四项式
  2. Kurento实战之一:KMS部署和体验
  3. Motorola E6 DIY
  4. 3262. 黑心啤酒厂
  5. 鸿蒙磅礴不可以涯际夕,五年级:《中华成语千字文》节选
  6. 大连 oracle培训,大连哪里培训java专业(Java的数据类型)
  7. pg数据类型及数据类型转换
  8. 项目管理案例:棋到中局,总经理与研发总监的对弈【转】
  9. C语言,输入月份号,输出该月的英文名
  10. 博客摘录「 npm nrm安装后报错」2023年4月17日