從零開始系列-Laravel編寫api服務介面:9.整合簡訊包

lixueyuan發表於2021-05-12

簡介

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 協議》,轉載必須註明作者和本文連結
程式設計兩年半,喜歡ctrl(唱、跳、rap、籃球)

相關文章