傳送簡訊
新建 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'] && $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 協議》,轉載必須註明作者和本文連結