PhpSms

PhpSms


可能是目前最聰明、優(yōu)雅的php短信發(fā)送庫(kù)了。從此不再為各種原因造成的個(gè)別短信發(fā)送失敗而煩憂!

phpsms的任務(wù)均衡調(diào)度功能由toplan/task-balancer提供。

特點(diǎn)

支持發(fā)送均衡調(diào)度,可按代理器權(quán)重值均衡選擇服務(wù)商發(fā)送。

支持語(yǔ)音驗(yàn)證碼。

支持一個(gè)或多個(gè)備用代理器(服務(wù)商)。

允許推入隊(duì)列,并自定義隊(duì)列實(shí)現(xiàn)邏輯(與隊(duì)列系統(tǒng)松散耦合)。

短信/語(yǔ)音發(fā)送前后鉤子。

支持國(guó)內(nèi)主流短信服務(wù)商

自定義代理器寄生代理器

服務(wù)商

服務(wù)商模板短信內(nèi)容短信語(yǔ)音驗(yàn)證碼最低消費(fèi)最低消費(fèi)單價(jià)

Luosimao×√√¥850(1萬(wàn)條)¥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'

安裝開(kāi)發(fā)中版本:

composerrequire'toplan/phpsms:dev-master'

快速上手

1. 配置

配置代理器所需參數(shù)

為你需要用到的短信服務(wù)商(即代理器)配置必要的參數(shù)。可以在config\phpsms.php中鍵為agents的數(shù)組中配置,也可以手動(dòng)在程序中設(shè)置,示例如下:

//example:Sms::config(['Luosimao'=>[//短信API key'apikey'=>'your api key',//語(yǔ)音驗(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ā)送成功或無(wú)備用代理器可用。 值得注意的是,如果首次嘗試的是YunPian,那么備用代理器將會(huì)只使用YunTongXun,也就是會(huì)排除使用過(guò)的代理器。

2. Enjoy it!

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í)確保能通過(guò)模板和內(nèi)容方式發(fā)送,這樣做的好處是,可以兼顧到各種類型服務(wù)商Sms::make()->to($to)->template($templates)->data($tempData)->content($content)->send();// 語(yǔ)音驗(yàn)證碼Sms::voice('02343')->to($to)->send();// 語(yǔ)音驗(yàn)證碼兼容模版語(yǔ)音(如阿里大魚的文本轉(zhuǎn)語(yǔ)音)Sms::voice('02343')->template('Alidayu','your_tts_code')->data(['code'=>'02343'])->to($to)->send();

3. 在laravel中使用

如果你只想單純的在laravel中使用phpsms的功能可以按如下步驟操作, 當(dāng)然也為你準(zhǔn)備了基于phpsms開(kāi)發(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,然后在該文件中按提示配置。

使用

詳見(jiàn)API,示例:

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

API

API - 全局配置

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');

獲取

通過(guò)該方法還能獲取所有或指定代理器的調(diào)度方案,如:

//獲取所有的調(diào)度方案:$scheme=Sms::scheme();//獲取指定代理器的調(diào)度方案:$scheme['Luosimao']=Sms::scheme('Luosimao');

scheme靜態(tài)方法的更多使用方法見(jiàn)高級(jí)調(diào)度配置

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

設(shè)置/獲取代理器的配置數(shù)據(jù)。

代理器參數(shù)配置在應(yīng)用系統(tǒng)的整個(gè)運(yùn)行過(guò)程中都是能修改的,這點(diǎn)和調(diào)度配置有所不同。

設(shè)置

手動(dòng)設(shè)置代理器的配置數(shù)據(jù)(優(yōu)先級(jí)高于配置文件),如:

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

獲取

通過(guò)該方法還能獲取所有或指定代理器的配置參數(shù),如:

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

Sms::cleanScheme()

清空所有代理器的調(diào)度方案,請(qǐng)謹(jǐn)慎使用該接口。

Sms::cleanConfig()

清空所有代理器的配置數(shù)據(jù),請(qǐng)謹(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é)請(qǐng)查看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é)請(qǐng)查看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é)請(qǐng)查看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é)請(qǐng)查看task-balancer的“afterRun”鉤子

Sms::queue($enable, $handler)

該方法可以設(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)定義過(guò)如何推送到隊(duì)列,還可以繼續(xù)設(shè)置關(guān)閉/開(kāi)啟隊(duì)列:

Sms::queue(true);//開(kāi)啟隊(duì)列Sms::queue(false);//關(guān)閉隊(duì)列

獲取隊(duì)列啟用情況:

$enable=Sms::queue();//為true,表示當(dāng)前啟用了隊(duì)列。//為false,表示當(dāng)前關(guān)閉了隊(duì)列。

API - 發(fā)送相關(guān)

Sms::make()

生成發(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',...]);

Sms::voice()

生成發(fā)送語(yǔ)音驗(yàn)證碼的sms實(shí)例,并返回實(shí)例。

$sms=Sms::voice();//創(chuàng)建實(shí)例的同時(shí)設(shè)置驗(yàn)證碼/語(yǔ)音文件ID$sms=Sms::voice($code);

如果你使用Luosimao語(yǔ)音驗(yàn)證碼,還需用在配置文件中Luosimao選項(xiàng)中設(shè)置voiceApikey。

語(yǔ)音文件ID即是在服務(wù)商配置的語(yǔ)音文件的唯一編號(hào),比如阿里大魚語(yǔ)音通知的voice_code。

模版語(yǔ)音是另一種語(yǔ)音請(qǐng)求方式,它是通過(guò)模版ID和模版數(shù)據(jù)進(jìn)行的語(yǔ)音請(qǐng)求,比如阿里大魚的文本轉(zhuǎn)語(yǔ)音通知

$sms->to($mobile)

設(shè)置發(fā)送給誰(shuí),并返回實(shí)例。

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

$sms->template($templates)

指定代理器設(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',...]);

$sms->data($data)

設(shè)置模板短信的模板數(shù)據(jù),并返回實(shí)例對(duì)象,$data必須為數(shù)組。

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

通過(guò)template和data方法的組合除了可以實(shí)現(xiàn)模版短信的數(shù)據(jù)填充,還可以實(shí)現(xiàn)模版語(yǔ)音的數(shù)據(jù)填充。

$sms->content($text)

設(shè)置內(nèi)容短信的內(nèi)容,并返回實(shí)例對(duì)象。一些內(nèi)置的代理器(如YunPian,Luosimao)使用的是內(nèi)容短信(即直接發(fā)送短信內(nèi)容),那么就需要為它們?cè)O(shè)置短信內(nèi)容。

$sms->content('【簽名】這是短信內(nèi)容...');

$sms->getData([$key])

獲取Sms實(shí)例中的短信數(shù)據(jù),不帶參數(shù)時(shí)返回所有數(shù)據(jù),其結(jié)構(gòu)如下:

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

$sms->agent($name)

臨時(shí)設(shè)置發(fā)送時(shí)使用的代理器(不會(huì)影響備用代理器的正常使用),并返回實(shí)例,$name為代理器名稱。

$sms->agent('YunPian');

通過(guò)該方法設(shè)置的代理器將獲得絕對(duì)優(yōu)先權(quán),但只對(duì)當(dāng)前短信實(shí)例有效。

$sms->send()

請(qǐng)求發(fā)送短信/語(yǔ)音驗(yàn)證碼。

//會(huì)遵循是否使用隊(duì)列:$result=$sms->send();//忽略是否使用隊(duì)列:$result=$sms->send(true);

$result數(shù)據(jù)結(jié)構(gòu)請(qǐng)參看task-balancer

高級(jí)調(diào)度配置

代理器的高級(jí)調(diào)度配置可以通過(guò)配置文件(config/phpsms.php)中的scheme項(xiàng)目配置,也可以通過(guò)scheme靜態(tài)方法設(shè)置。 值得注意的是,高級(jí)調(diào)度配置的值的數(shù)據(jù)結(jié)構(gòu)是數(shù)組。

指定代理器類

如果你自定義了一個(gè)代理器,類名不為FooAgent或者命名空間不為Toplan\PhpSms,那么你還可以在調(diào)度配置時(shí)指定你的代理器使用的類。

配置方式:

通過(guò)配置值中agentClass鍵來(lái)指定類名。

示例:

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

寄生代理器

如果你既不想使用內(nèi)置的代理器,也不想創(chuàng)建文件寫自定義代理器,那么寄生代理器或許是個(gè)好的選擇,無(wú)需定義代理器類,只需在調(diào)度配置時(shí)定義好發(fā)送短信和語(yǔ)音驗(yàn)證碼的方式即可。

配置方式:

通過(guò)配置值中sendSms和voiceVerify鍵來(lái)設(shè)置發(fā)送短信和語(yǔ)音驗(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ǔ)音驗(yàn)證碼,同上}]]);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,552評(píng)論 25 708
  • Zabbix簡(jiǎn)介 Zabbix官方網(wǎng)站Zabbix中文文檔 本文系統(tǒng)環(huán)境是CentOS7x86_64, Zabbi...
    Zhang21閱讀 8,086評(píng)論 0 37
  • 2016年2月13日,一場(chǎng)倒春寒來(lái)的頗不合時(shí)宜,我生病了; 明天還要上班,我蜷縮在被窩里,一動(dòng)也不動(dòng),我的確是生病...
    萬(wàn)米先生閱讀 1,720評(píng)論 0 6
  • 怎么才能做到高效讀書呢?尤其是讀那些致用類圖書,更需要好的方法才行,最近學(xué)習(xí)了一種可以高效的讀書方法—便簽讀書法。...
    叮叮兔海馬閱讀 1,162評(píng)論 0 3