gitdevstar / laravel-otp-validate
Laravel OTP 验证包,内置重试和重发机制。内置最大重试和最大重发阻止机制。OTP/安全码可以通过您选择的短信或电子邮件发送,支持用户自定义模板。
Requires
- php: ^7.1.8|^8.0
- aws/aws-sdk-php: ^3.179
- guzzlehttp/guzzle: ^7.0.1
- nesbot/carbon: ^2.22
Requires (Dev)
- orchestra/testbench: ^6.0@dev
README
本包旨在简化 OTP 验证流程的设置。无需麻烦,只需即插即用。按照以下步骤操作,您将能够获得一个完整的 OTP 验证系统。您可以将其用于后续的认证或电子商务生产销售、订单确认。
要求
安装
安装包
使用 composer 安装此包
composer require devstar/laravel-otp-validate
添加 Service Provider & Facade
对于 Laravel 5.5+
添加包后,服务提供者和门面将自动发现。
对于旧版本的 Laravel
将 ServiceProvider 添加到 config/app.php
文件中的 providers 数组中
Ferdous\OtpValidator\OtpValidatorServiceProvider::class
将 Facade 添加到 config/app.php
文件中的 aliases 数组中
'OtpValidator' => Ferdous\OtpValidator\OtpValidatorServiceProvider::class
发布配置
完成后,使用以下命令将配置发布到您的配置文件夹中
php artisan vendor:publish --provider="Ferdous\OtpValidator\OtpValidatorServiceProvider"
此命令将创建一个 config/otp.php
文件。
电子邮件配置
从 .env
文件中设置电子邮件配置。无需其他更改。
短信配置
由于短信网关使用不同的方法和额外的头和参数,您可能需要更新 otp.php
文件中的短信配置。
迁移数据库
运行以下命令以创建 otps 表。
php artisan migrate
它将创建一个包含所需列的 otps 表。
环境
将以下键值对添加到 Laravel 应用程序的 .env
文件中
# Basic OTP Configs
OTP_SERVICE='enabled'
OTP_TABLE_NAME='otps'
OTP_TIMEOUT=120
OTP_DIGIT=5
OTP_RESEND_SERVICE='enabled'
OTP_MAX_RETRY=2
OTP_MAX_RESEND=1
# Company and Service
OTP_SERVICE_NAME=
OTP_COMPANY_NAME=
# OTP via Email / SMS
OTP_SEND_BY_EMAIL=1
OTP_SEND_BY_SMS=1
# Email Configurations
OTP_EMAIL_FROM=
OTP_EMAIL_FROM_NAME=
OTP_EMAIL_SUBJECT=
# SMS Configurations
OTP_SMSC_URL='https://sms'
OTP_SMSC_METHOD=
OTP_COUNTRY_CODE=
OTP_SMSC_OVER_JSON=
OTP_SMSC_PARAM_TO_NAME=
OTP_SMSC_PARAM_MSG_NAME=
OTP_SMSC_USER=
OTP_SMSC_PASS=
AWS_SNS_VERSION=
AWS_SNS_KEY=
AWS_SNS_SECRET=
AWS_SNS_REGION=
定义
配置中的功能定义如下
- service : 启用/禁用 OTP 服务
- timeout: OTP 超时
- digit: OTP 数字
- resend-service: 启用/禁用重发服务
- max-retry: 单个请求的最大重试次数
- max-resend: 单个请求的最大重发次数
- service-name: 服务使用对象
- company-name: 公司名称
- send-by: 共享 OTP 的 3 种方式(电子邮件/短信/AWS SNS)
- email: 此密钥指定电子邮件所需的信息(例如,发件人、姓名、主题等。)
- sms: 使用短信网关发送短信。 (通用配置器)
在运行时定义“发送方式”
可以使用 config 方法在运行时设置 send-by [ SMS / Email / SNS ]。
config('otp.send-by.email', 1);
config('otp.send-by.sms', 0);
OTP 请求模板
模板文件发布后,打开 resources/views/vendor/template-otp/
示例控制器
运行以下命令以创建控制器。
php artisan make:controller OtpController
以下是在 OtpController 中调用 OTP 验证器的示例。
namespace App\Http\Controllers; use Ferdous\OtpValidator\Object\OtpRequestObject; use Ferdous\OtpValidator\OtpValidator; use Ferdous\OtpValidator\Object\OtpValidateRequestObject; class OtpController extends Controller { /** * @return array */ public function requestForOtp() { return OtpValidator::requestOtp( new OtpRequestObject('1432', 'buy-shirt', '01711084714', 'ferdousul.haque@gmail.com') ); } /** * @param Request $request * @return array */ public function validateOtp(Request $request) { $uniqId = $request->input('uniqueId'); $otp = $request->input('otp'); return OtpValidator::validateOtp( new OtpValidateRequestObject($uniqId,$otp) ); } /** * @param Request $request * @return array */ public function resendOtp(Request $request) { $uniqueId = $request->input('uniqueId'); return OtpValidator::resendOtp($uniqueId); } }
将以下内容添加到 routes/web.php
文件中。
Route::get('/test/otp-request', 'OtpController@requestForOtp');
Route::get('/test/otp-validate', 'OtpController@validateOtp');
Route::get('/test/otp-resend', 'OtpController@resendOtp');
响应/错误描述
以下表格描述了响应中生成的错误代码及其对应的含义。
{ "code": 201, "message": "OTP Sent to the recipient", "uniqueId": 1432, "type": "buy-shirt" }
请求 OTP 响应代码
OTP 验证响应代码
许可证
MIT
特别感谢
- Nahid Bin Azhar 提供反馈。
支持
- 对于任何错误,请帮助我们创建问题。
- 对于任何安装或配置问题,请随时联系我。 ferdousul.haque@gmail.com
特色文章
示例 SMS 网关配置
Muthofun
如果您尝试集成孟加拉国最受欢迎的 SMS 网关之一,Muthofun 是我国的一个流行的大规模 SMS 网关。以下是 Muthofun SMS 网关的示例配置
'smsc' => [ 'url' => env('OTP_SMSC_URL'), 'method' => env('OTP_SMSC_METHOD', 'GET'), 'add_code' => env('OTP_COUNTRY_CODE',null), 'json' => env('OTP_SMSC_OVER_JSON',1), 'headers' => [], 'params' => [ 'send_to_param_name' => env('OTP_SMSC_PARAM_TO_NAME','number'), 'msg_param_name' => env('OTP_SMSC_PARAM_MSG_NAME','msg'), 'others' => [ 'user' => env('OTP_SMSC_USER'), 'password' => env('OTP_SMSC_PASS'), 'unicode' => 1 ], ] ];
.env 文件将如下所示
OTP_SMSC_URL='http://clients.muthofun.com:8901/esmsgw/sendsms.jsp?'
OTP_SMSC_METHOD='GET'
OTP_COUNTRY_CODE='88'
OTP_SMSC_OVER_JSON=0
OTP_SMSC_PARAM_TO_NAME='mobiles'
OTP_SMSC_PARAM_MSG_NAME='sms'
OTP_SMSC_USER='YourUserName'
OTP_SMSC_PASS='YourPassWord'
Infobip
以下是如何集成知名的 SMS 网关 Infobip 的示例。
使用 GET 方法
'smsc' => [ 'url' => env('OTP_SMSC_URL'), 'method' => env('OTP_SMSC_METHOD', 'GET'), 'add_code' => env('OTP_COUNTRY_CODE',null), 'json' => env('OTP_SMSC_OVER_JSON',1), 'headers' => [], 'params' => [ 'send_to_param_name' => env('OTP_SMSC_PARAM_TO_NAME','number'), 'msg_param_name' => env('OTP_SMSC_PARAM_MSG_NAME','msg'), 'others' => [ 'username' => env('OTP_SMSC_USER'), 'password' => env('OTP_SMSC_PASS'), 'from' => 'InfoSMS', 'flash' => true ], ] ];
.env 文件将如下所示
OTP_SMSC_URL='https://{baseUrl}/sms/1/text/query?'
OTP_SMSC_METHOD='GET'
OTP_COUNTRY_CODE='88'
OTP_SMSC_OVER_JSON=0
OTP_SMSC_PARAM_TO_NAME='to'
OTP_SMSC_PARAM_MSG_NAME='text'
OTP_SMSC_USER='YourUserName'
OTP_SMSC_PASS='YourPassWord'
msg91
以下是如何集成 msg91 SMS 网关的示例。
使用 GET 方法
'smsc' => [ 'url' => env('OTP_SMSC_URL'), 'method' => env('OTP_SMSC_METHOD', 'GET'), 'add_code' => env('OTP_COUNTRY_CODE',null), 'json' => env('OTP_SMSC_OVER_JSON',1), 'headers' => [], 'params' => [ 'send_to_param_name' => env('OTP_SMSC_PARAM_TO_NAME','number'), 'msg_param_name' => env('OTP_SMSC_PARAM_MSG_NAME','msg'), 'others' => [ 'authkey' => 'YourAuthKey', 'sender' => 'YourSenderId', 'route' => '1', 'country' => '88', ], ], 'wrapper' => 'sms', ];
.env 文件将如下所示
OTP_SMSC_URL='https://control.msg91.com/api/v2/sendsms?'
OTP_SMSC_METHOD='POST'
OTP_COUNTRY_CODE='88'
OTP_SMSC_OVER_JSON=1
OTP_SMSC_PARAM_TO_NAME='to'
OTP_SMSC_PARAM_MSG_NAME='text'
OTP_SMSC_USER='YourUserName'
OTP_SMSC_PASS='YourPassWord'
使用 AWS 简单通知服务 (SNS)
以下是与 AWS SNS 集成的示例步骤。
创建具有适当策略权限的 IAM 用户。转到 IAM 服务并创建您的应用程序用户;请确保记录其 AWS 密钥和 AWS 密码值,并将其放入您的环境文件中。从那里为该用户或其组添加以下策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSendingSMSMessages",
"Effect": "Allow",
"Action": [
"sns:Publish",
"sns:SetSMSAttributes",
"sns:CheckIfPhoneNumberIsOptedOut"
],
"Resource": [
"*"
]
}
]
}
在此,我们设置了发布、设置 SMS 属性和检查退订的能力,并将其应用于通配符资源而不是特定主题,因为我们将直接向电话号码发送通知而不是向 SNS 主题发送。