可能是目前最聰明、優(yōu)雅的php短信發(fā)送庫了姜挺。從此不再為各種原因造成的個(gè)別短信發(fā)送失敗而煩憂本谜!
phpsms的任務(wù)均衡調(diào)度功能由toplan/task-balancer提供。
支持發(fā)送均衡調(diào)度溜在,可按代理器權(quán)重值均衡選擇服務(wù)商發(fā)送。
支持語音驗(yàn)證碼仆葡。
支持一個(gè)或多個(gè)備用代理器(服務(wù)商)志笼。
允許推入隊(duì)列沿盅,并自定義隊(duì)列實(shí)現(xiàn)邏輯(與隊(duì)列系統(tǒng)松散耦合)纫溃。
短信/語音發(fā)送前后鉤子紊浩。
支持國內(nèi)主流短信服務(wù)商。
服務(wù)商模板短信內(nèi)容短信語音驗(yàn)證碼最低消費(fèi)最低消費(fèi)單價(jià)
Luosimao×√√¥850(1萬條)¥0.085/條
云片網(wǎng)絡(luò)×√√¥55(1千條)¥0.055/條
容聯(lián)·云通訊√×√充值¥500¥0.055/條
SUBMAIL√××¥100(1千條)¥0.100/條
云之訊√×√--¥0.050/條
聚合數(shù)據(jù)√×√--¥0.035/條
阿里大魚√×√--¥0.045/條
SendCloud√×√--¥0.048/條
composerrequire'toplan/phpsms:~1.6.0'
安裝開發(fā)中版本:
composerrequire'toplan/phpsms:dev-master'
配置代理器所需參數(shù)
為你需要用到的短信服務(wù)商(即代理器)配置必要的參數(shù)箍铲△尥郑可以在config\phpsms.php中鍵為agents的數(shù)組中配置小染,也可以手動(dòng)在程序中設(shè)置,示例如下:
//example:Sms::config(['Luosimao'=>[//短信API key'apikey'=>'your api key',//語音驗(yàn)證API key'voiceApikey'=>'your voice api key',],'YunPian'=>[//用戶唯一標(biāo)識(shí),必須'apikey'=>'your api key',]]);
配置代理器調(diào)度方案
可在config\phpsms.php中鍵為scheme的數(shù)組中配置岛都。也可以手動(dòng)在程序中設(shè)置振峻,示例如下:
//example:Sms::scheme([//被使用概率為2/3'Luosimao'=>'20',//被使用概率為1/3扣孟,且為備用代理器'YunPian'=>'10 backup',//僅為備用代理器'YunTongXun'=>'0 backup',]);
調(diào)度方案解析:如果按照以上配置,那么系統(tǒng)首次會(huì)嘗試使用Luosimao或YunPian發(fā)送短信鸽斟,且它們被使用的概率分別為2/3和1/3。 如果使用其中一個(gè)代理器發(fā)送失敗剩燥,那么會(huì)啟用備用代理器立倍,按照配置可知備用代理器有YunPian和YunTongXun口注,那么會(huì)依次調(diào)用直到發(fā)送成功或無備用代理器可用。 值得注意的是娇斑,如果首次嘗試的是YunPian澈段,那么備用代理器將會(huì)只使用YunTongXun,也就是會(huì)排除使用過的代理器悔醋。
require('path/to/vendor/autoload.php');useToplan\PhpSms\Sms;// 接收人手機(jī)號(hào)$to='1828****349';// 短信模版$templates=['YunTongXun'=>'your_temp_id','SubMail'=>'your_temp_id'];// 模版數(shù)據(jù)$tempData=['code'=>'87392','minutes'=>'5'];// 短信內(nèi)容$content='【簽名】這是短信內(nèi)容...';// 只希望使用模板方式發(fā)送短信,可以不設(shè)置content(如:云通訊芬骄、Submail鹦聪、Ucpaas)Sms::make()->to($to)->template($templates)->data($tempData)->send();// 只希望使用內(nèi)容方式放送,可以不設(shè)置模板id和模板data(如:云片泽本、luosimao)Sms::make()->to($to)->content($content)->send();// 同時(shí)確保能通過模板和內(nèi)容方式發(fā)送,這樣做的好處是,可以兼顧到各種類型服務(wù)商Sms::make()->to($to)->template($templates)->data($tempData)->content($content)->send();// 語音驗(yàn)證碼Sms::voice('02343')->to($to)->send();// 語音驗(yàn)證碼兼容模版語音(如阿里大魚的文本轉(zhuǎn)語音)Sms::voice('02343')->template('Alidayu','your_tts_code')->data(['code'=>'02343'])->to($to)->send();
如果你只想單純的在laravel中使用phpsms的功能可以按如下步驟操作, 當(dāng)然也為你準(zhǔn)備了基于phpsms開發(fā)的laravel-sms
在config/app.php中引入服務(wù)提供器
//服務(wù)提供器'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();
Sms::scheme([$name[, $scheme]])
設(shè)置/獲取代理器的調(diào)度方案。
調(diào)度配置在調(diào)度系統(tǒng)啟動(dòng)后(創(chuàng)建Sms實(shí)例時(shí)會(huì)自動(dòng)啟動(dòng))就不能修改遵倦。
設(shè)置
手動(dòng)設(shè)置代理器調(diào)度方案(優(yōu)先級(jí)高于配置文件)骇吭,如:
Sms::scheme(['Luosimao'=>'80 backup''YunPian'=>'100 backup']);//或Sms::scheme('Luosimao','80 backup');Sms::scheme('YunPian','100 backup');
獲取
通過該方法還能獲取所有或指定代理器的調(diào)度方案,如:
//獲取所有的調(diào)度方案:$scheme=Sms::scheme();//獲取指定代理器的調(diào)度方案:$scheme['Luosimao']=Sms::scheme('Luosimao');
scheme靜態(tài)方法的更多使用方法見高級(jí)調(diào)度配置
Sms::config([$name[, $config][, $override]]);
設(shè)置/獲取代理器的配置數(shù)據(jù)棘脐。
代理器參數(shù)配置在應(yīng)用系統(tǒng)的整個(gè)運(yùn)行過程中都是能修改的蛀缝,這點(diǎn)和調(diào)度配置有所不同目代。
設(shè)置
手動(dòng)設(shè)置代理器的配置數(shù)據(jù)(優(yōu)先級(jí)高于配置文件),如:
Sms::config(['YunPian'=>['apikey'=>...,]]);//或Sms::config('YunPian', ['apikey'=>...,]);
獲取
通過該方法還能獲取所有或指定代理器的配置參數(shù)在讶,如:
//獲取所有的配置:$config=Sms::config();//獲取指定代理器的配置:$config['Luosimao']=Sms::config('Luosimao');
清空所有代理器的調(diào)度方案构哺,請謹(jǐn)慎使用該接口战坤。
清空所有代理器的配置數(shù)據(jù),請謹(jǐn)慎使用該接口碟嘴。
Sms::beforeSend($handler[, $override]);
發(fā)送前鉤子娜扇,示例:
Sms::beforeSend(function($task,$prev,$index,$handlers){//獲取短信數(shù)據(jù)$smsData=$task->data;...//如果返回false會(huì)終止發(fā)送任務(wù)returntrue;});
更多細(xì)節(jié)請查看task-balancer的“beforeRun”鉤子
Sms::beforeAgentSend($handler [, $override]);
代理器發(fā)送前鉤子栅组,示例:
Sms::beforeAgentSend(function($task,$driver,$prev,$index,$handlers){//短信數(shù)據(jù):$smsData=$task->data;//當(dāng)前使用的代理器名稱:$agentName=$driver->name;//如果返回false會(huì)停止使用當(dāng)前代理器returntrue;});
更多細(xì)節(jié)請查看task-balancer的“beforeDriverRun”鉤子
Sms::afterAgentSend($handler [, $override]);
代理器發(fā)送后鉤子笑窜,示例:
Sms::afterAgentSend(function($task,$result,$prev,$index,$handlers){//$result為代理器的發(fā)送結(jié)果數(shù)據(jù)$agentName=$result['driver'];...});
更多細(xì)節(jié)請查看task-balancer的“afterDriverRun”鉤子
Sms::afterSend($handler [, $override]);
發(fā)送后鉤子排截,示例:
Sms::afterSend(function($task,$result,$prev,$index,$handlers){//$result為發(fā)送后獲得的結(jié)果數(shù)組$success=$result['success'];...});
更多細(xì)節(jié)請查看task-balancer的“afterRun”鉤子
該方法可以設(shè)置是否啟用隊(duì)列以及定義如何推送到隊(duì)列。
$handler匿名函數(shù)可使用的參數(shù):
$sms: Sms實(shí)例
$data: Sms實(shí)例中的短信數(shù)據(jù)脱吱,等同于$sms->getData()
定義如何推送到隊(duì)列:
//自動(dòng)啟用隊(duì)列Sms::queue(function($sms,$data){//define how to push to queue....});//第一個(gè)參數(shù)為true,啟用隊(duì)列Sms::queue(true,function($sms,$data){//define how to push to queue....});//第一個(gè)參數(shù)為false,暫時(shí)關(guān)閉隊(duì)列Sms::queue(false,function($sms,$data){//define how to push to queue....});
如果已經(jīng)定義過如何推送到隊(duì)列箱蝠,還可以繼續(xù)設(shè)置關(guān)閉/開啟隊(duì)列:
Sms::queue(true);//開啟隊(duì)列Sms::queue(false);//關(guān)閉隊(duì)列
獲取隊(duì)列啟用情況:
$enable=Sms::queue();//為true,表示當(dāng)前啟用了隊(duì)列垦垂。//為false,表示當(dāng)前關(guān)閉了隊(duì)列。
生成發(fā)送短信的sms實(shí)例间校,并返回實(shí)例憔足。
$sms=Sms::make();//創(chuàng)建實(shí)例的同時(shí)設(shè)置短信內(nèi)容:$sms=Sms::make('【簽名】這是短信內(nèi)容...');//創(chuàng)建實(shí)例的同時(shí)設(shè)置短信模版:$sms=Sms::make('YunTongXun','your_temp_id');//或$sms=Sms::make(['YunTongXun'=>'your_temp_id','SubMail'=>'your_temp_id',...]);
生成發(fā)送語音驗(yàn)證碼的sms實(shí)例酒繁,并返回實(shí)例。
$sms=Sms::voice();//創(chuàng)建實(shí)例的同時(shí)設(shè)置驗(yàn)證碼/語音文件ID$sms=Sms::voice($code);
如果你使用Luosimao語音驗(yàn)證碼揭绑,還需用在配置文件中Luosimao選項(xiàng)中設(shè)置voiceApikey洗做。
語音文件ID即是在服務(wù)商配置的語音文件的唯一編號(hào)彰居,比如阿里大魚語音通知的voice_code陈惰。
模版語音是另一種語音請求方式,它是通過模版ID和模版數(shù)據(jù)進(jìn)行的語音請求抬闯,比如阿里大魚的文本轉(zhuǎn)語音通知。
設(shè)置發(fā)送給誰杯缺,并返回實(shí)例睡榆。
$sms->to('1828*******');
指定代理器設(shè)置模版id或批量設(shè)置,并返回實(shí)例塘揣。
//設(shè)置指定服務(wù)商的模板id$sms->template('YunTongXun','your_temp_id')->template('SubMail','your_temp_id');//一次性設(shè)置多個(gè)服務(wù)商的模板id$sms->template(['YunTongXun'=>'your_temp_id','SubMail'=>'your_temp_id',...]);
設(shè)置模板短信的模板數(shù)據(jù)亲铡,并返回實(shí)例對象,$data必須為數(shù)組赞草。
$sms->data(['code'=>$code,'minutes'=>$minutes]);
通過template和data方法的組合除了可以實(shí)現(xiàn)模版短信的數(shù)據(jù)填充锭硼,還可以實(shí)現(xiàn)模版語音的數(shù)據(jù)填充檀头。
設(shè)置內(nèi)容短信的內(nèi)容,并返回實(shí)例對象搭独。一些內(nèi)置的代理器(如YunPian,Luosimao)使用的是內(nèi)容短信(即直接發(fā)送短信內(nèi)容)廊镜,那么就需要為它們設(shè)置短信內(nèi)容嗤朴。
$sms->content('【簽名】這是短信內(nèi)容...');
獲取Sms實(shí)例中的短信數(shù)據(jù),不帶參數(shù)時(shí)返回所有數(shù)據(jù)股缸,其結(jié)構(gòu)如下:
['type'=>...,'to'=>...,'templates'=>[...],'content'=>...,'templateData'=>[...],'voiceCode'=>...,]
臨時(shí)設(shè)置發(fā)送時(shí)使用的代理器(不會(huì)影響備用代理器的正常使用)敦姻,并返回實(shí)例歧杏,$name為代理器名稱。
$sms->agent('YunPian');
通過該方法設(shè)置的代理器將獲得絕對優(yōu)先權(quán)旺入,但只對當(dāng)前短信實(shí)例有效眨业。
請求發(fā)送短信/語音驗(yàn)證碼。
//會(huì)遵循是否使用隊(duì)列:$result=$sms->send();//忽略是否使用隊(duì)列:$result=$sms->send(true);
$result數(shù)據(jù)結(jié)構(gòu)請參看task-balancer
代理器的高級(jí)調(diào)度配置可以通過配置文件(config/phpsms.php)中的scheme項(xiàng)目配置,也可以通過scheme靜態(tài)方法設(shè)置聘殖。 值得注意的是行瑞,高級(jí)調(diào)度配置的值的數(shù)據(jù)結(jié)構(gòu)是數(shù)組血久。
如果你自定義了一個(gè)代理器,類名不為FooAgent或者命名空間不為Toplan\PhpSms讹蘑,那么你還可以在調(diào)度配置時(shí)指定你的代理器使用的類筑舅。
配置方式:
通過配置值中agentClass鍵來指定類名。
示例:
Sms::scheme('agentName', ['10 backup','agentClass'=>'My\Namespace\MyAgentClass']);
如果你既不想使用內(nèi)置的代理器版仔,也不想創(chuàng)建文件寫自定義代理器蛮粮,那么寄生代理器或許是個(gè)好的選擇谜慌,無需定義代理器類畦娄,只需在調(diào)度配置時(shí)定義好發(fā)送短信和語音驗(yàn)證碼的方式即可。
配置方式:
通過配置值中sendSms和voiceVerify鍵來設(shè)置發(fā)送短信和語音驗(yàn)證碼的方式杖刷。
示例:
Sms::scheme(['agentName'=>['20 backup','sendSms'=>function($agent,$to,$content,$tempId,$tempData){//獲取配置(如果設(shè)置了的話):$key=$agent->key;...//內(nèi)置方法:Agent::sockPost(...);Agent::curl(...);...//更新發(fā)送結(jié)果:$agent->result(Agent::SUCCESS,true);$agent->result(Agent::INFO,'some info');$agent->result(Agent::CODE,'your code');},'voiceVerify'=>function($agent,$to,$code,$tempId,$tempData){//發(fā)送語音驗(yàn)證碼驳癌,同上}]]);