PhpSms 稳定可靠的php短信发送库
可能是目前最聪明、优雅的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);
$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键来指定类名。
- 示例:
寄生代理器
如果你既不想使用内置的代理器,也不想创建文件写自定义代理器,那么寄生代理器或许是个好的选择,无需定义代理器类,只需在调度配置时定义好发送短信和语音验证码的方式即可。
- 配置方式:
通过配置值中sendSms和voiceVerify键来设置发送短信和语音验证码的方式。
- 示例:
自定义代理器
- 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)代理器
公告
- 如果在使用队列相关功能时出现如下错误:
Todo list
- 可用代理器分组配置功能;短信发送时选择分组进行发送的功能。
Encourage
hi, guys! 如果喜欢或者要收藏,欢迎star。如果要提供意见和bug,欢迎issue或提交pr。
License
MIT
PhpSms 稳定可靠的php短信发送库的更多相关文章
- 短信发送接口被恶意访问的网络攻击事件(四)完结篇--搭建WAF清理战场
前言 短信发送接口被恶意访问的网络攻击事件(一)紧张的遭遇战险胜 短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本 ...
- 【SSH网上商城项目实战26】完成订单支付后的短信发送功能
转自: https://blog.csdn.net/eson_15/article/details/51475431 上一节我们使用了Java mail完成了给买家发送邮件的功能,还遗留一个功能,就 ...
- C#利用Web Service实现短信发送(转)
通过编程方式实现短信息的发送对很多人来说是一件比较烦杂的事情,目前一般的解决方法是通过计算机和手机的连线,通过可对手机编程的语言编写相关的手机短信息程序来实现,而这种方法对于一般人来说是很难达到的,因 ...
- [工具开发] 一信通 Web 短信发送客户端
一.简介 为了协助公司运营部对几家短信平台进行测试,我根据各自的接口文档编写了几个简单的短信发送客户端: 下面是一信通 Web 短信发送客户端,使用 HTTP GET 方法. 二.效果图 1. 首页 ...
- Android短彩信源码解析-短信发送流程(三)
3.短信pdu的压缩与封装 相关文章: ------------------------------------------------------------- 1.短信发送上层逻辑 2.短信发送f ...
- C# 编写短信发送Window服务
我们做项目过程中,一般都会有发送短信的需求.最常见的就是户注册或者登录时发送短信验证码.不同类型的短信发送,我们都可以放到到一张短信表中,然后通过一个定时的作业去执行短信发送.而定时作业的执行,我们就 ...
- 使用飞信api接口实现短信发送(只能发送好友)
找了很久才找到一个能用的飞信API接口(http://quanapi.sinaapp.com/fetion.php?u=飞信登录手机号&p=飞信登录密码&to=接收飞信的手机号& ...
- 功能:使用QQ号登陆,并加上微信和短信提醒,是否增量备份可选,阿里大鱼短信发送开发与测试,聚合数据(用JSON发短信,比较清楚)
微博就可以,所以其它软件也可以http://desktop.weibo.com/ http://blog.csdn.net/jueblog/article/details/14497181http:/ ...
- Android短彩信源码解析-短信发送流程(二)
转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...
随机推荐
- SequenceInputStream
SequenceInputStream从名字上看, 他是一个序列字节输入流 既然是个序列 那么意味着 SequenceInputStream装着许多的输入流 所以 可以用他来合并文件 Sequence ...
- Papa Parse – 超强大的多线程 CSV 文本解析库
Papa Parse 是一个与众不同的,在网页上运行的第一个多线程的 CSV 解析器.它可以解析千兆字节大小文件而不会导致浏览器崩溃.它能够正确地处理格式不正确或边缘的情况下的 CSV 文本.它可以分 ...
- 优秀案例:12个精美的设计工作室 & 设计公司网站
如果你正在为自己的作品集网站设计寻找灵感,那么学习设计机构 & 设计公司的网站是如何制作的是一个良好的开端.在这篇稳重,我们已经聚集了一组设计机构的优秀作品集网站,你可以借鉴很多设计理念.当你 ...
- 【iScroll源码学习00】模拟iScroll
前言 相信对移动端有了解的朋友对iScroll这个库非常熟悉吧,今天我们就来说下我们移动页面的iScroll化 iScroll是我们必学框架之一,我们这次先根据iScroll功能自己实现其功能,然后再 ...
- React入门--------顶层API
React.createClass 参数:config(object) 创建一个ReactClass(组件类),参数是一个对象且必须带有render属性方法,该方法必须返回一个封闭的容器(容器内可以由 ...
- 原生JS:Math对象详解
Math对象 本文参考MDN做的详细整理,方便大家参考MDN Math 也是一个内置对象, 为数学常量和数学函数提供了属性和方法,而不是一个函数对象. 与其它全局对象不同的是, Math 不是一个构造 ...
- swift学习笔记之-访问控制
//访问控制 import UIKit /*访问控制(Access Control) 1.访问控制可以限定其他源文件或模块中的代码对你的代码的访问级别.这个特性可以让我们隐藏代码的一些实现细节,并且可 ...
- 关于web软件信息安全问题防护资料的整理(三)
了解了web系统的安全威胁,那么我们应该怎样防范这些安全威胁呢? 1.时刻准备应战 Web应用系统所面临的威胁是非常严峻的.不管攻击的一方是采用单一形式的攻击,还是采用混合多种手段的混合攻击,作为防护 ...
- JSOM 对User的操作
一.操作当前用户 //Load current user info function LoadCurUser() { var curUser; curUser = curWeb.get_current ...
- 【代码笔记】iOS-点击cell时候的动画翻转
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...