Laravel6 使用腾讯云短信-发送短信
Laravel6使用腾讯云短信
发送短信
新建 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 协议》,转载必须注明作者和本文链接