PhpSms

PhpSms


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

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

特點(diǎn)

支持發(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ù)商

服務(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'

快速上手

1. 配置

配置代理器所需參數(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ì)排除使用過的代理器悔醋。

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í)確保能通過模板和內(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();

3. 在laravel中使用

如果你只想單純的在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();

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

獲取

通過該方法還能獲取所有或指定代理器的調(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');

Sms::cleanScheme()

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

Sms::cleanConfig()

清空所有代理器的配置數(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”鉤子

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)定義過如何推送到隊(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ì)列。

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à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)語音通知

$sms->to($mobile)

設(shè)置發(fā)送給誰杯缺,并返回實(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í)例對象,$data必須為數(shù)組赞草。

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

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

$sms->content($text)

設(shè)置內(nèi)容短信的內(nèi)容,并返回實(shí)例對象搭独。一些內(nèi)置的代理器(如YunPian,Luosimao)使用的是內(nèi)容短信(即直接發(fā)送短信內(nèi)容)廊镜,那么就需要為它們設(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');

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

$sms->send()

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

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

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

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

代理器的高級(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)證碼驳癌,同上}]]);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颓鲜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乐严,更是在濱河造成了極大的恐慌昂验,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件占婉,死亡現(xiàn)場離奇詭異逆济,居然都是意外死亡磺箕,警方通過查閱死者的電腦和手機(jī)滞磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門击困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛛枚,你說我怎么就攤上這事脸哀。” “怎么了盲镶?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵溉贿,是天一觀的道長宇色。 經(jīng)常有香客問我,道長例隆,這世上最難降的妖魔是什么抢蚀? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任皿曲,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘博投。我一直安慰自己盯蝴,他們只是感情好捧挺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布翅睛。 她就那樣靜靜地躺著黑竞,像睡著了一般很魂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上法挨,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天凡纳,我揣著相機(jī)與錄音喊暖,去河邊找鬼。 笑死狞尔,一個(gè)胖子當(dāng)著我的面吹牛偏序,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豫缨,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼好芭,長吁一口氣:“原來是場噩夢啊……” “哼冲呢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敬拓,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤乘凸,失蹤者是張志新(化名)和其女友劉穎营勤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醒第,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠曼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年霞幅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了量瓜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍傲。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖试读,靈堂內(nèi)的尸體忽然破棺而出荠耽,到底是詐尸還是另有隱情,我是刑警寧澤倘屹,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布纽匙,位于F島的核電站拍谐,受9級(jí)特大地震影響赠尾,放射性物質(zhì)發(fā)生泄漏毅弧。R本人自食惡果不足惜够坐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望元咙。 院中可真熱鬧,春花似錦甲棍、人聲如沸感猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至序厉,卻和暖如春脂矫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捞奕。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拄轻,地道東北人颅围。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像恨搓,于是被迫代替她去往敵國和親院促。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

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