アリババクラウドSMSredis
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 -m
、php
インストールされている拡張機能を表示します。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確認コードを保存し、有効期限を設定します
- redisプレフィックスと有効期限を構成します
<?php return [ "code_pre" => "sms_code_pre_", // key 前缀 "code_expire" => 60, // 失效时间 60 秒 ];
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; }
- SMS送信インターフェイスを再テストして
redis
、レコードが成功したかどうかを確認します
。PostmanでPOSTリクエストを送信するhttp://tp6.com/api/smscode
と、送信が成功したことが示されます。
携帯電話はSMS確認コードを受信し403777
、RDMを更新します。すでにレコードがあり、確認コードと有効期限が表示されます。時間は60
最初から減少します。縮小0
するとアクセスできなくなります。このキーを更新すると消えます。
6.SMS確認コードを確認します
ここでは、レコードの値cache("key")
を取得するために使用するだけで済みますradis
。レコードが見つからない場合は期限切れになります。期限切れになっていない場合は、等しいかどうかを判断します。