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閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,816評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,702評論 25 708
  • Zabbix簡介 Zabbix官方網站Zabbix中文文檔 本文系統環境是CentOS7x86_64, Zabbi...
    Zhang21閱讀 8,045評論 0 37
  • 2016年2月13日,一場倒春寒來的頗不合時宜,我生病了; 明天還要上班,我蜷縮在被窩里,一動也不動,我的確是生病...
    萬米先生閱讀 1,706評論 0 6
  • 怎么才能做到高效讀書呢?尤其是讀那些致用類圖書,更需要好的方法才行,最近學習了一種可以高效的讀書方法—便簽讀書法。...
    叮叮兔海馬閱讀 1,154評論 0 3