ThinkPHP6プロジェクトの基本操作(15.Alibaba Cloud SMS redisの実際の戦闘部分)

1. Alibaba Cloud SMSSDKをインストールします

Alibaba CloudSMSのデバッグ
AlibabaCloud SMS SDKPHPドキュメント
AlibabaCloud SMS SDKをインストールするには、AlibabaCloudの公式ドキュメントを参照してください。

composer require alibabacloud/sdk

インストールが完了すると、Alibaba Cloudの一般的な機能は、SMSモジュールだけでなく、ベンダーフォルダーに生成されます。
ここに写真の説明を挿入

2つ目は、プロジェクトライブラリにパッケージ化することです。

SMSモジュールは他のアプリケーションでも使用できるため、lib中央にカプセル化しcommon\lib、フォルダーの下にsms\AliSmsフォルダーを作成し、Alibaba Cloud SMSの機能をカプセル化しますAliSms
ここに写真の説明を挿入
最初にSMSをビジュアルデバッグページで送信できるかどうかをテストし、電話番号を入力してSMSを受信します。携帯電話番号、SignNameは署名の名前(SMSサービス-国内メッセージ-署名管理)、TemplateCodeはショートメッセージテンプレートの名前を入力します(SMSサービス-国内メッセージ-テンプレート管理):
ここに写真の説明を挿入
クリック发起调用してショートメッセージを受信たかどうかを確認します:
ここに写真の説明を挿入
送信に成功すると、右側に表示されますコードをlibライブラリに貼り付けてAliSms.php、構成ファイルにいくつかのパラメーターを書き込みました。

<?php
declare(strict_types=1);
namespace app\common\lib\sms\AliSms;

use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;

class AliSms
{
    
    
    /**
     * 阿里云发送短信
     * @param string $phone
     * @param int $code
     * @return bool
     * @throws ClientException
     */
    public static function sendCode(string $phone, int $code) : bool {
    
    
        if(empty($phone) || empty($code)){
    
    
            return false;
        }

        AlibabaCloud::accessKeyClient(config("aliyun.access_key_id"), config("aliyun.access_secret"))
            ->regionId(config("aliyun.region_id"))
            ->asDefaultClient();

        $templateParam = [
            "code" => $code
        ];

        try {
    
    
            $result = AlibabaCloud::rpc()
                ->product('Dysmsapi')
                // ->scheme('https') // https | http
                ->version('2017-05-25')
                ->action('SendSms')
                ->method('POST')
                ->host(config("aliyun.host"))
                ->options([
                    'query' => [
                        'RegionId' => config("aliyun.region_id"),
                        'PhoneNumbers' => $phone,
                        'SignName' => config("aliyun.sign_name"),
                        'TemplateCode' => config("aliyun.template_code"),
                        'TemplateParam' => json_encode($templateParam),
                    ],
                ])
                ->request();
            print_r($result->toArray());
        } catch (ClientException $e) {
    
    
            return false;
            // echo $e->getErrorMessage() . PHP_EOL;
        } catch (ServerException $e) {
    
    
            return false;
            // echo $e->getErrorMessage() . PHP_EOL;
        }
        return true;
    }
}

Business床:

<?php

declare(strict_types=1);
namespace app\common\business;
use app\common\lib\sms\AliSms\AliSms;

class Sms
{
    
    
    public static function sendCode(string $phoneNumber) : bool {
    
    

        $code = rand(100000, 999999);
        $sms = AliSms::sendCode($phoneNumber, $code);
        if($sms){
    
    
            // 需要记录redis及失效时间1分钟
        }

        return true;
    }
}

Controller床:

<?php
namespace app\api\controller;
use app\api\validate\User;
use app\BaseController;
use think\exception\ValidateException;
use app\common\business\Sms as SmsBus;

class Sms extends BaseController
{
    
    
    public function code(){
    
    
        $phoneNumber = input("param.phone_number","","trim");
        $data = [
            'phone_number' => $phoneNumber
        ];

        // 已采用自定义异常方法拦截,如果没有采用自定义拦截,需要try...catch
        validate(User::class)->scene("send_code")->check($data);

        /*try {
            validate(User::class)->scene("send_code")->check($data);
        }catch (ValidateException $e){
            return show(config("status.error"), $e->getError());
        }*/

        if(SmsBus::sendCode($phoneNumber)){
    
    
            return show(config("status.success"),"发送验证码成功");
        }
        return show(config("status.error"),"发送验证码失败");
    }
}

ルーティングファイルを定義します。
api.php

<?php

use think\facade\Route;

Route::rule('smscode', 'sms/code','POST');

例外メソッドインターセプトリファレンスの定義:ThinkPHP6プロジェクトの基本操作(13.実際の戦闘プロジェクトでのカスタム例外処理の概要、エラーページおよびAPIエラー)

3、radisレコード検証コード

1.redisサービスをインストールします

公式サイトからダウンロード:https//redis.io/download
ご使用のシステムに合わせてredisサービスをインストールし、電源を入れてください。
ウィンドウをダブルクリックすると、redis-server.exe次のインターフェイスが表示され、サービスが開始されます。
ここに写真の説明を挿入

Tips: 这个窗口不要关闭哦,否则服务就关掉了!

2.ビジュアルredis管理ソフトウェア

初心者はnavcat、データベースを表示するのと同じように、視覚化ツールを介してredisによって管理されるデータを表示できます。
RDM公式ウェブサイト:https//rdm.dev/
(公式ウェブサイトは有料ですが、私たち中国人学生は何をすべきかを知っている必要があるので、これ以上は言いません...)
ここに写真の説明を挿入

3.PHPインストールredis拡張機能

コンソールに入力してphp -mphpインストールされている拡張機能表示します。redis拡張機能が見つかった場合は、インストールする必要はありません。
コンソールにphp -iビューPHP Extension Build情報を入力し、対応するredis拡張バージョンをダウンロードします
。redisダウンロード公式ウェブサイト

Zend Extension Build => API320190902,NTS,VC15
PHP Extension Build => API20190902,NTS,VC15

次に、それをphp拡張ディレクトリに配置します。D:\phpstudy_pro\Extensions\php\php7.4.3nts\ext一般的な統合環境にはこのファイルがありphp.ini、ファイル内の構成を確認しますredis

extension=php_redis.dll

php拡張機能を開きredisます:
ここに写真の説明を挿入

4.キャッシュredisを構成します

ThinkPHPデフォルトではファイルキャッシュを使用します。検証コードを送信するためのインターフェイスはapiアプリケーションで記述されているため、cache構成ファイルをapiアプリケーションconfigディレクトリにコピーし、構成を変更しました。

<?php

// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------

return [
    // 默认缓存驱动
    'default' => env('cache.driver', 'redis'),

    // 缓存连接方式配置
    'stores'  => [
        'file' => [
            // 驱动方式
            'type'       => 'File',
            // 缓存保存目录
            'path'       => '',
            // 缓存前缀
            'prefix'     => '',
            // 缓存有效期 0表示永久缓存
            'expire'     => 0,
            // 缓存标签前缀
            'tag_prefix' => 'tag:',
            // 序列化机制 例如 ['serialize', 'unserialize']
            'serialize'  => [],
        ],
        // 更多的缓存连接
        'redis' => [
            'host' => '127.0.0.1',
            'port' => 6379,
            'type' => 'redis',
        ]
    ],
];

5. RedisはSMS確認コードを保存し、有効期限を設定します

  1. redisプレフィックスと有効期限を構成します
    <?php
    
    return [
        "code_pre" => "sms_code_pre_", // key 前缀
        "code_expire" => 60, // 失效时间 60 秒
    ];
    
  2. Businessレイヤーコードを変更する
    public static function sendCode(string $phoneNumber) : bool {
          
          
        $code = rand(100000, 999999);
        $sms = AliSms::sendCode($phoneNumber, $code);
        if($sms){
          
          
            // 需要记录redis及失效时间1分钟
            cache(config("redis.code_pre").$phoneNumber, $code, config("redis.code_expire"));
        }
    
        return $sms;
    }
    
  3. SMS送信インターフェイスを再テストしてredis、レコードが成功したかどうかを確認します
    。PostmanでPOSTリクエストを送信するhttp://tp6.com/api/smscodeと、送信が成功したことが示されます。
    ここに写真の説明を挿入
    携帯電話はSMS確認コードを受信し403777、RDMを更新します。すでにレコードがあり、確認コードと有効期限が表示されます。時間は60最初から減少します。縮小0するとアクセスできなくなります。このキーを更新すると消えます。
    ここに写真の説明を挿入

6.SMS確認コードを確認します

ここでは、レコードの値cache("key")を取得するために使用するだけで済みますradis。レコードが見つからない場合は期限切れになります。期限切れになっていない場合は、等しいかどうかを判断します。

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/zy1281539626/article/details/110913448