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'] &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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!