PhpSms

PhpSms


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

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

特点

支持发送均衡调度,可按代理器权重值均衡选择服务商发送。

支持语音验证码。

支持一个或多个备用代理器(服务商)。

允许推入队列,并自定义队列实现逻辑(与队列系统松散耦合)。

短信/语音发送前后钩子。

支持国内主流短信服务商

自定义代理器寄生代理器

服务商

服务商模板短信内容短信语音验证码最低消费最低消费单价

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/条

安装

composerrequire'toplan/phpsms:~1.6.0'

安装开发中版本:

composerrequire'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');useToplan\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,]

生成配置文件

phpartisanvendor: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会终止发送任务returntrue;});

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

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

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

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

更多细节请查看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){//发送语音验证码,同上}]]);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,049评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,471评论 25 707
  • Zabbix简介 Zabbix官方网站Zabbix中文文档 本文系统环境是CentOS7x86_64, Zabbi...
    Zhang21阅读 7,831评论 0 37
  • 2016年2月13日,一场倒春寒来的颇不合时宜,我生病了; 明天还要上班,我蜷缩在被窝里,一动也不动,我的确是生病...
    万米先生阅读 1,623评论 0 6
  • 怎么才能做到高效读书呢?尤其是读那些致用类图书,更需要好的方法才行,最近学习了一种可以高效的读书方法—便签读书法。...
    叮叮兔海马阅读 1,065评论 0 3