簡介
laravel 簡訊包有幾個比較優秀的如
參考:部落格:透過 Laravel 訊息通知使用 EasySms 簡訊服務,讓你的程式碼更簡潔
包:https://github.com/overtrue/easy-sms
下面介紹我們現在在用的包 laravel-sms
同樣也非常強大
文件地址 https://github.com/toplan/laravel-sms
根據文件,下面是簡單用法:
1.安裝
見 github 官方文件。
大部分按照官方文件即可。下面是一些注意事項官方文件也有,不過容易忽略。
測試發簡訊的時候官方會提供
透過以下方式可以檢視驗證碼的傳送情況
官方路由:
http[s]://your-domain/laravel-sms/info
or 自定義路由
if ('local' === config('app.env')) {
Route::any('sms', '\\Toplan\\Sms\\SmsController@getInfo');
}
注意:如果是api應用(無session)需要在上述地址後面加上?access_token=xxxx
2.傳送一般簡訊(驗證碼)
public function verify_code_test_template(Request $request)
{
//$mobile = "15012422751";
$mobile = $request->mobile;
$sms = new \Toplan\Sms\SmsManager($mobile, ['mobile' => $mobile, 'template' => 'login']);
$res = $sms->validateSendable();
if (!$res['success']) {
return $this->response->array($res)->setStatusCode(422);
}
$res = $sms->validateFields();
if (!$res['success']) {
return $this->response->array($res)->setStatusCode(422);
}
$res = $sms->requestVerifySms();
Sms::queue(true);
return $this->response->array($res);
}
3.傳送模板簡訊(自定義簡訊)
/**
* 測試傳送模板訊息
*/
public function sendTemplate()
{
$sms = new \Toplan\Sms\SmsManager('token', ['mobile' => '15012422751', 'type' => '1', 'template' => 'nopass', 'number' => '15222', 'application' => '網際網路醫院-醫生']);
$result = $sms->validateSendable();
if (!$result['success']) {
return $this->response->array($result);
}
$result = $sms->validateFields();
if (!$result['success']) {
return $this->response->array($result);
}
$result = $sms->requestVerifySms();
return $this->response->array($result);
}
4.驗證簡訊
// 驗證簡訊
public function verification(Request $request)
{
//驗證資料
// $key = config('laravel-sms.storage.prefix', 'laravel_sms');
// $state = \Cache::get('laravel_sms._state');
// $state2 = \Cache::get('laravel_sms.'.$request->mobile.'._state');
// dump($state);
// dump($state2);
$validator = Validator::make($request->all(), [
'mobile' => 'required|is_mobile|confirm_mobile_not_change|confirm_rule:mobile_required',
'verifyCode' => 'required|verify_code',
], [
'mobile.required' => '手機號不能為空1',
'mobile.confirm_mobile_not_change' => '手機號已變更,請重新傳送驗證碼',
'mobile.confirm_rule' => '手機號不能為空2',
'verifyCode.required' => '驗證碼不能為空',
'verifyCode.verify_code' => '驗證碼錯誤',
]);
if ($validator->fails()) {
//驗證失敗後建議清空儲存的傳送狀態,防止使用者重複試錯
SmsManager::forgetState();
return $this->response->errorUnauthorized('驗證失敗');
}
return $this->response->array(['message' => '驗證成功']);
}
5.配置檔案
.env
# 阿里·雲通訊 < 匯醫培 下子賬號 sms >
ALIYUN_MNS_ACCESS_KEY_ID=#####
ALIYUN_MNS_ACCESS_KEY_SECRET=*****
ALIYUN_MNS_TOPIC=sms.topic-cn-shenzhen
ALIYUN_MNS_SIGN=****
ALIYUN_MNS_REGION_ID=cn-shenzhen
ALIYUN_MNS_TEMPLATE=SMS_190788952
SMS_DRIVER=Aliyun
laravel-sms.php
<?php
return [
/*
|--------------------------------------------------------------------------
| 內建路由
|--------------------------------------------------------------------------
|
| 如果是 web 應用建議 middleware 為 ['web', ...]
| 如果是 api 應用建議 middleware 為 ['api', ...]
|
*/
'route' => [
'enable' => true,
'prefix' => 'laravel-sms',
'middleware' => ['api'],
],
/*
|--------------------------------------------------------------------------
| 請求間隔
|--------------------------------------------------------------------------
|
| 單位:秒
|
*/
'interval' => 60,
/*
|--------------------------------------------------------------------------
| 資料驗證管理
|--------------------------------------------------------------------------
|
| 設定從客戶端傳來的需要驗證的資料欄位(`field`)
|
| - isMobile 是否為手機號欄位
| - enable 是否開啟驗證
| - default 預設靜態驗證規則
| - staticRules 靜態驗證規則
|
*/
'validation' => [
'mobile' => [
'isMobile' => true,
'enable' => true,
'default' => 'mobile_required',
'staticRules' => [
'mobile_required' => 'required|is_mobile',
'check_mobile_unique' => 'required|is_mobile|unique:users,mobile',
'check_mobile_exists' => 'required|is_mobile|exists:users',
'doctor_register' => 'required|is_mobile|unique:doctors,mobile',
'hospital_register' => 'required|is_mobile|unique:organs,tel',
],
],
],
/*
|--------------------------------------------------------------------------
| 驗證碼管理
|--------------------------------------------------------------------------
|
| - length 驗證碼長度
| - validMinutes 驗證碼有效時間長度,單位為分鐘
| - repeatIfValid 如果原驗證碼還有效,是否重複使用原驗證碼
| - maxAttempts 驗證碼最大嘗試驗證次數,超過該數值驗證碼自動失效,0或負數則不啟用
|
*/
'code' => [
'length' => 6,
'validMinutes' => 5,
'repeatIfValid' => false,
'maxAttempts' => 0,
],
/*
|--------------------------------------------------------------------------
| 驗證碼簡訊通用內容
|--------------------------------------------------------------------------
|
| 如需快取配置,則需使用 `Toplan\Sms\SmsManger::closure($closure)` 方法進行配置
|
*/
'content' => function ($code, $minutes, $input) {
return '【signature】您的驗證碼是' . $code . ',有效期為' . $minutes . '分鐘,請儘快驗證。';
},
/*
|--------------------------------------------------------------------------
| 驗證碼簡訊模版
|--------------------------------------------------------------------------
|
| 每項資料的值可以為以下三種之一:
|
| - 字串/數字
| 如: 'YunTongXun' => '簡訊模版id'
|
| - 陣列
| 如: 'Alidayu' => ['簡訊模版id', '語音模版id'],
|
| - 匿名函式 $input 請求引數 $type string verify_sms簡訊驗證碼 voice_verify語音驗證碼
| 如: 'YunTongXun' => function ($input, $type) {
| return $input['isRegister'] ? 'registerTempId' : 'commonId';
| }
|
| 如需快取配置,則需使用 `Toplan\Sms\SmsManger::closure($closure)` 方法對匿名函式進行配置
|
*/
'templates' => [
// SMS_xxxxxxxxx 提交驗證碼,引數: code -> 驗證碼、number -> 4位手機尾號
'Aliyun' => function ($input, $type) {
if (isset($input['template'])) {
switch ($input['template']) {
// 根據簡訊模板業務邏輯來
case 'case_submit':
case 'rx_submit':
return 'SMS_xxxxxxxx';
break;
case "pass": // 透過
return 'SMS_xxxxxxxxx';
case "nopass": //不透過
return 'SMS_xxxxxxxxx';
case "login": //登入
return 'SMS_xxxxxxxxx';
case "updateAppointmentTime":
return 'SMS_xxxxxxxxx';
default:
return env('ALIYUN_MNS_TEMPLATE', 'SMS_xxxxxxxxx');
}
}
return env('ALIYUN_MNS_TEMPLATE', 'SMS_xxxxxxxxx');
},
],
/*
|--------------------------------------------------------------------------
| 模版資料管理
|--------------------------------------------------------------------------
|
| 每項資料的值可以為以下兩種之一:
|
| - 基本資料型別
| 如: 'minutes' => 5
|
| - 匿名函式(如果該函式不返回任何值,即表示不使用該項資料)
| 如: 'serialNumber' => function ($code, $minutes, $input, $type) {
| return $input['serialNumber'];
| }
| 如: 'hello' => function ($code, $minutes, $input, $type) {
| //不返回任何值,那麼hello將會從模版資料中移除 :)
| }
|
| 如需快取配置,則需使用 `Toplan\Sms\SmsManger::closure($closure)` 方法對匿名函式進行配置
|
*/
'data' => [
'code' => function ($code) {
return $code;
},
'minutes' => function ($code, $minutes) {
return $minutes;
},
'number' => function ($code, $minutes, $input, $type) {
if (isset($input['template'])) {
switch ($input['template']) {
// 提交處方或提交病例驗證碼
case 'case_submit':
case 'rx_submit':
case 'pass':
return $input['number'];
break;
}
}
},
'application' => function ($code, $minutes, $input, $type) {
if (isset($input['template']) && in_array($input['template'], ['pass', 'nopass'])) {
return $input['application'];
}
},
'hospital' => function ($code, $minutes, $input, $type) {
if (isset($input['template']) && in_array($input['template'], ['updateAppointmentTime'])) {
return $input['hospital'];
}
},
'checks' => function ($code, $minutes, $input, $type) {
if (isset($input['template']) && in_array($input['template'], ['updateAppointmentTime'])) {
return $input['checks'];
}
},
'check_time' => function ($code, $minutes, $input, $type) {
if (isset($input['template']) && in_array($input['template'], ['updateAppointmentTime'])) {
return $input['check_time'];
}
},
],
/*
|--------------------------------------------------------------------------
| 儲存系統配置
|--------------------------------------------------------------------------
|
| driver:
| 儲存方式,是一個實現了'Toplan\Sms\Storage'介面的類的類名,
| 內建可選的值有'Toplan\Sms\SessionStorage'和'Toplan\Sms\CacheStorage',
| 如果不填寫driver,那麼系統會自動根據內建路由的屬性(route)中middleware的配置值選擇儲存器driver:
| - 如果中介軟體含有'web',會選擇使用'Toplan\Sms\SessionStorage'
| - 如果中介軟體含有'api',會選擇使用'Toplan\Sms\CacheStorage'
|
| prefix:
| 儲存key的prefix
|
| 內建driver的個性化配置:
| - 在laravel專案的'config/session.php'檔案中可以對'Toplan\Sms\SessionStorage'進行更多個性化設定
| - 在laravel專案的'config/cache.php'檔案中可以對'Toplan\Sms\CacheStorage'進行更多個性化設定
|
*/
'storage' => [
'driver' => '',
'prefix' => 'laravel_sms',
],
/*
|--------------------------------------------------------------------------
| 是否資料庫記錄傳送日誌
|--------------------------------------------------------------------------
|
| 若需開啟此功能,需要先生成一個內建的'laravel_sms'表
| 執行'php artisan migrate'命令可以自動生成
|
*/
'dbLogs' => true,
/*
|--------------------------------------------------------------------------
| 佇列任務
|--------------------------------------------------------------------------
|
*/
'queueJob' => 'Toplan\Sms\SendReminderSms',
/*
|--------------------------------------------------------------------------
| 驗證碼模組提示資訊
|--------------------------------------------------------------------------
|
*/
'notifies' => [
// 頻繁請求無效的提示
'request_invalid' => '請求無效,請在%s秒後重試',
// 驗證碼簡訊傳送失敗的提示
'sms_sent_failure' => '簡訊驗證碼傳送失敗,請稍後重試',
// 語音驗證碼傳送傳送成功的提示
'voice_sent_failure' => '語音驗證碼請求失敗,請稍後重試',
// 驗證碼簡訊傳送成功的提示
'sms_sent_success' => '簡訊驗證碼傳送成功,請注意查收',
// 語音驗證碼傳送傳送成功的提示
'voice_sent_success' => '語音驗證碼傳送成功,請注意接聽',
],
];
本作品採用《CC 協議》,轉載必須註明作者和本文連結