天天看點

PhpSms 穩定可靠的php短信發送庫

可能是目前最聰明、優雅的PHP短信發送庫了。從此不再為各種原因造成的個别短信發送失敗而煩憂!

phpsms的任務均衡排程功能由toplan/task-balancer提供。

GitHub位址:https://github.com/toplan/phpsms

特點

  • 支援發送均衡排程,可按代理器權重值均衡選擇服務商發送。
  • 支援語音驗證碼。
  • 支援一個或多個備用代理器(服務商)。
  • 允許推入隊列,并自定義隊列實作邏輯(與隊列系統松散耦合)。
  • 短信/語音發送前後鈎子。
  • 支援國内主流短信服務商。
  • 自定義代理器和寄生代理器。

服務商

服務商 模闆短信 内容短信 語音驗證碼 最低消費 最低消費單價
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/條

安裝

composer require \'toplan/phpsms:~1.6.0\'        

安裝開發中版本:

composer require \'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\');  
use Toplan\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,  
]        
  • 生成配置檔案
php artisan vendor: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會終止發送任務  
    return true;  
});        
更多細節請檢視task-balancer的“beforeRun”鈎子

Sms::beforeAgentSend($handler [, $override]);

代理器發送前鈎子,示例:

Sms::beforeAgentSend(function($task, $driver, $prev, $index, $handlers){  
    //短信資料:  
    $smsData = $task->data;  
    //目前使用的代理器名稱:  
    $agentName = $driver->name;  
    //如果傳回false會停止使用目前代理器  
    return true;  
});        
更多細節請檢視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){  
            //發送語音驗證碼,同上  
        }  
    ]  
]);        

自定義代理器

  • step 1

配置項加入到config/phpsms.php中鍵為agents的數組裡。

//example:  
\'Foo\' => [  
    \'key\' => \'your api key\',  
    ...  
]        
  • step 2

建立一個繼承Toplan\PhpSms\Agent抽象類的代理器類,建議代理器類名為FooAgent,建議命名空間為Toplan\PhpSms。 如果類名不為FooAgent或者命名空間不為Toplan\PhpSms,在使用該代理器時則需要指定代理器類,詳見進階排程配置。

Change logs

v1.4.0

該系列版本相較與之前版本在api的設計上有些變動,具體如下:

  • 修改原enable靜态方法為scheme
  • 修改原agents靜态方法為config
  • 修改原cleanEnableAgents靜态方法為cleanScheme
  • 修改原cleanAgentsConfig靜态方法為cleanConfig
  • 去掉getEnableAgents和getAgentsConfig靜态方法

v1.5.0

  • 改進語音資訊的發送接口以适應阿裡大魚的通過文本轉語音和語音檔案id兩個接口的需求
  • 新加阿裡大魚(Alidayu)代理器

公告

  1. 如果在使用隊列相關功能時出現如下錯誤:
Fatal error:Maximum function nesting level of ‘100′ reached, aborting!  
可在/etc/php5/mods-available/xdebug.ini(Linux)中新加xdebug.max_nesting_level=500      

Todo list

  •  可用代理器分組配置功能;短信發送時選擇分組進行發送的功能。

Encourage

hi, guys! 如果喜歡或者要收藏,歡迎star。如果要提供意見和bug,歡迎issue或送出pr。

License

MIT

PhpSms 穩定可靠的php短信發送庫