可能是目前最聰明、優雅的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'
配置代理器所需參數
為你需要用到的短信服務商(即代理器)配置必要的參數。可以在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,也就是會排除使用過的代理器。
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();
如果你只想單純的在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();
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::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”鉤子
該方法可以設置是否啟用隊列以及定義如何推送到隊列。
$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,表示當前關閉了隊列。
生成發送短信的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實例,并返回實例。
$sms=Sms::voice();//創建實例的同時設置驗證碼/語音文件ID$sms=Sms::voice($code);
如果你使用Luosimao語音驗證碼,還需用在配置文件中Luosimao選項中設置voiceApikey。
語音文件ID即是在服務商配置的語音文件的唯一編號,比如阿里大魚語音通知的voice_code。
模版語音是另一種語音請求方式,它是通過模版ID和模版數據進行的語音請求,比如阿里大魚的文本轉語音通知。
設置發送給誰,并返回實例。
$sms->to('1828*******');
指定代理器設置模版id或批量設置,并返回實例。
//設置指定服務商的模板id$sms->template('YunTongXun','your_temp_id')->template('SubMail','your_temp_id');//一次性設置多個服務商的模板id$sms->template(['YunTongXun'=>'your_temp_id','SubMail'=>'your_temp_id',...]);
設置模板短信的模板數據,并返回實例對象,$data必須為數組。
$sms->data(['code'=>$code,'minutes'=>$minutes]);
通過template和data方法的組合除了可以實現模版短信的數據填充,還可以實現模版語音的數據填充。
設置內容短信的內容,并返回實例對象。一些內置的代理器(如YunPian,Luosimao)使用的是內容短信(即直接發送短信內容),那么就需要為它們設置短信內容。
$sms->content('【簽名】這是短信內容...');
獲取Sms實例中的短信數據,不帶參數時返回所有數據,其結構如下:
['type'=>...,'to'=>...,'templates'=>[...],'content'=>...,'templateData'=>[...],'voiceCode'=>...,]
臨時設置發送時使用的代理器(不會影響備用代理器的正常使用),并返回實例,$name為代理器名稱。
$sms->agent('YunPian');
通過該方法設置的代理器將獲得絕對優先權,但只對當前短信實例有效。
請求發送短信/語音驗證碼。
//會遵循是否使用隊列:$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){//發送語音驗證碼,同上}]]);