Laravel6 使用騰訊雲簡訊-傳送簡訊

yunli發表於2020-05-12

傳送簡訊

新建 SmsRequestModel.php

mkdir app/Models/TencentCloud # win 系統請將 "/" 更改成 "\", 或直接手動建立資料夾
touch app/Models/TencentCloud/SmsRequest.php
/* app/Models/TencentCloud/SmsRequest.php */
<?php
namespace App\Http\Models\TencentCloud;

use TencentCloud\Sms\V20190711\Models\SendSmsRequest;

class SmsRequest
{
    /**
     * 傳送簡訊 SendSms
     *
     * @param String $sdkappid 簡訊應用ID: 簡訊SdkAppid在 [簡訊控制檯] 新增應用後生成的實際SdkAppid,示例如1400006666
     * @param String $sign 簡訊簽名內容: 使用 UTF-8 編碼,必須填寫已稽核通過的簽名,簽名資訊可登入 [簡訊控制檯] 檢視
     * @param Array $phoneNumbers 下發手機號碼,採用 e.164 標準,+[國家或地區碼][手機號]: 示例如:+8613711112222, 其中前面有一個+號 ,86為國家碼,13711112222為手機號,最多不要超過200個手機號
     * @param String $templdateId 模板 ID: 必須填寫已稽核通過的模板 ID。模板ID可登入 [簡訊控制檯] 檢視
     * @param Array $templateParams 模板引數: 若無模板引數,則設定為空
     * @param String $sessionContext 使用者的 session 內容: 可以攜帶使用者側 ID 等上下文資訊,server 會原樣返回
     * @param String $extend 簡訊碼號擴充套件號: 預設未開通,如需開通請聯絡 [sms helper]
     * @param String $senderId 國際/港澳臺簡訊 senderid: 國內簡訊填空,預設未開通,如需開通請聯絡 [sms helper]
     * @return void
     */
    public function sms(String $sdkappid = '', String $sign = '', Array $phoneNumbers = [], String $templdateId = '', Array $templateParams = [], String $sessionContext = '', String $extend = '0', String $senderId = '')
    {
        // 例項化一個 sms 傳送簡訊請求物件,每個介面都會對應一個request物件。
        $req = new SendSmsRequest();

        $req->SmsSdkAppid = $sdkappid;

        $req->Sign = $sign;

        $req->ExtendCode = $extend;

        $req->PhoneNumberSet = $phoneNumbers;

        $req->SenderId = $senderId;

        $req->SessionContext = $sessionContext;

        $req->TemplateID = $templdateId;

        $req->TemplateParamSet = $templateParams;

        return $req;
    }
}

新建 API 基類

首先來搭建一下基礎環境,建立一個基礎 Controller,此類作為所有 API 請求控制器的『基類』。

php artisan make:controller Api/Controller
/* app/Http/Controllers/Api/Controller.php */
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as BaseController;
class Controller extends BaseController
{
    //
}

新建傳送簡訊控制器

php artisan make:controller Api/SmsController
<?php
namespace App\Http\Controllers\Api;

use Illuminate\Support\Str;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use App\Http\Requests\Api\SendSmsRequest;
use App\Http\Models\TencentCloud\SmsRequest as SmsRequestModel;
use TencentCloud\Common\Exception\TencentCloudSDKException;

class SmsController extends Controller
{
    public function send(SendSmsRequest $request,SmsRequestModel $smsRequestModel)
    {
        try {
            $sms = app('tencentcloudSms');

            $phone = "+86" . $request->phone;

            $code = str_pad(random_int(1, 999999), 6, 0, STR_PAD_LEFT);

            $req = $smsRequestModel->sms(config('tencentcloud.sms.sdkappid'), config('tencentcloud.sms.sign'), [$phone], config('tencentcloud.sms.templateId'), [$code, "5"]);

            $resp = $sms->SendSms($req);

            list($SendStatusSet, $RequestId) = array_values(json_decode($resp->toJsonString(), true));
            Log::info($SendStatusSet);
            if ($SendStatusSet[0]['SerialNo'] &amp;&amp; $SendStatusSet[0]['Code'] === 'Ok') {
                Cache::put($RequestId, $SendStatusSet);
                return response()->json([
                    'key' => $RequestId,
                    'code' => 0,
                    'message' => 'Ok'
                ])->setStatusCode(201);
            } else {
                Log::info($SendStatusSet);
                return response()->json([
                    'key' => $RequestId,
                    'code' => $SendStatusSet[0]['Code'],
                    'message' => $SendStatusSet[0]['Message']
                ]);
            }

        } catch (TencentCloudSDKException $e) {
            abort(500, $e ?: '簡訊傳送異常');
        }
    }
}

新增路由

/* routes/api.php */
<?php

use Illuminate\Http\Request;

Route::prefix('v1')->namespace('Api')->name('api.v1.')->group(function () {
    // 傳送簡訊

    Route::post('sendsms', 'SmsController@send')

        ->name('sms.send');
});

建立API表單請求驗證類

通過手機號請求介面,獲得簡訊驗證碼。每當接收使用者提交的引數時,都需要對資料做驗證,以保證資料的準確性,接下來建立屬於 Api 的表單請求驗證類:
首先建立一個基類,方便做一些統一方法的封裝,對於介面的控制器,我們也統一放在 Api 目錄中。

 php artisan make:request Api/FormRequest
/* app/Http/Requests/Api/FormRequest.php */
<?php
namespace App\Http\Requests\Api;

use Illuminate\Foundation\Http\FormRequest as BaseFormRequest;

class FormRequest extends BaseFormRequest
{
    public function authorize()
    {
        return true;
    }
}


建立傳送簡訊的驗證類

php artisan make:request Api/SendSmsRequest
/* app/Http/Requests/Api/SendSmsRequest.php */
<?php

namespace App\Http\Requests\Api;

class SendSmsRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'phone' => [
                'required',
                'regex:/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199)\d{8}$/'
            ]
        ];
    }
}


必須提交 phone 引數,必須是一個合法的電話格式。

測試

通過 PostMan 測試一下:
輸入正確的手機號,可以正確傳送簡訊。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章