درود دوستان...
من فرم ورود موبایل با ایجکس نوشتم و شماره موبایل وارد می کنم کد otp ساخته میشه و این کد وارد می کنم عمل نمی کنه یعنی پیام فیلد رمز یک بار مصرف الزامی است را نشان میدهد و ثبت نمی کند.
از پیامک قاصدک استفاده می کنم.
کدهای زیر:
login.blade.php :
<x-app-layout>
@section('script')
<script>
let loginToken;
$('#checkOTPForm').hide();
$('#resendOTPButton').hide();
$('#LoginForm').submit(function (event) {
console.log($('#mobile').val());
event.preventDefault();
$.post("{{ url('/login') }}",
{
'_token' : "{{ csrf_token() }}",
'mobile' : $('#mobile').val()
},function(response, status){
console.log(response, status);
loginToken = response.login_token;
toastr.success(
'رمز یکبار مصرف برای شما ارسال شد',
{
timeOut: 5000
}
);
$('#LoginForm').fadeOut();
$('#checkOTPForm').fadeIn();
}).fail(function(response){
//console.log(response.responseJSON.errors.mobile[0]);
$('#mobileError').addClass('mt-2');
$('#mobileError').fadeIn();
$('#mobileErrorText').html(response.responseJSON.errors.mobile[0]);
})
});
$('#checkOTPForm').submit(function (event) {
event.preventDefault();
$.post("{{ url('/check-otp') }}",
{
'_token' : "{{ csrf_token() }}",
'otp' : $('#checkOTP').val(),
'login_token': loginToken
},function(response, status){
console.log(response, status);
$(location).attr('href' , "{{ route('home.index') }}");
}).fail(function(response){
console.log(response.responseJSON);
$('#checkOTPError').addClass('mt-2');
$('#checkOTPError').fadeIn();
$('#checkOTPErrorText').html(response.responseJSON.errors.otp[0]);
})
});
$('#resendOTPButton').click(function(event){
event.preventDefault();
$.post("{{ url('/resend-otp') }}",
{
'_token' : "{{ csrf_token() }}",
'login_token' : loginToken
} , function(response , status){
console.log(response , status);
loginToken = response.login_token;
toastr.success(
'رمز یکبار مصرف برای شما ارسال شد',
{
timeOut: 5000
}
);
$('#resendOTPButton').fadeOut();
timer();
$('#resendOTPTime').fadeIn();
}).fail(function(response){
console.log(response.responseJSON);
toastr.danger(
'مشکل در ارسال دوباره رمز یکبار مصرف، مجددا تلاش کنید',
{
timeOut: 5000
}
);
})
});
function timer() {
let time = "1:01";
let interval = setInterval(function() {
let countdown = time.split(':');
let minutes = parseInt(countdown[0], 10);
let seconds = parseInt(countdown[1], 10);
--seconds;
minutes = (seconds < 0) ? --minutes : minutes;
if (minutes < 0) {
clearInterval(interval);
$('#resendOTPTime').hide();
$('#resendOTPButton').fadeIn();
};
seconds = (seconds < 0) ? 59 : seconds;
seconds = (seconds < 10) ? '0' + seconds : seconds;
//minutes = (minutes < 10) ? minutes : minutes;
$('#resendOTPTime').html(minutes + ':' + seconds);
time = minutes + ':' + seconds;
}, 1000);
}
</script>
@endsection
<div class="row">
<div class="col-md-4 offset-md-4 mt-5">
<div class="card">
<div class="card-body">
<h1 class="fs-4 text-center fw-bold">ورود / عضویت</h1>
<form id="LoginForm">
<div class="mb-3">
<label for="exampleInput1" class="form-label">شماره همراه</label>
<input type="text" id="mobile" class="form-control text-center" id="exampleInput1">
<div id="mobileError">
<strong id="mobileErrorText" class="text-danger"></strong>
</div>
</div>
<button type="submit" class="btn btn-primary">ورود</button>
</form>
<form id="checkOTPForm">
<div class="mb-3">
<label for="exampleInput1" class="form-label">رمز یک بار مصرف</label>
<input type="number" id="ckeckOTP" class="form-control text-center" id="exampleInput1">
<div id="checkOTPError">
<strong id="checkOTPErrorText" class="text-danger"></strong>
</div>
</div>
<button type="submit" class="btn btn-primary">تایید کد</button>
<div>
<button id="resendOTPButton" type="submit">ارسال مجدد</button>
<span id="resendOTPTime"></span>
</div>
</form>
</div>
</div>
</div>
</div>
</x-app-layout>
AutnController.php
<?php
namespace App\Http\Controllers\Auth;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Exception;
use App\Notifications\OTPSms;
class AuthController extends Controller
{
public function login(Request $request)
{
if ($request->method() == 'GET') {
return view('auth.login');
}
$request->validate([
'mobile' => 'required'
]);
try {
$user = User::where('mobile', $request->mobile)->first();
$OTPCode = mt_rand(100000, 999999);
$loginToken = Hash::make('DCDCojncd@cdjn%!!ghnjrgtn&&');
if ($user) {
$user->update([
'otp' => $OTPCode,
'login_token' => $loginToken
]);
} else {
$user = User::Create([
'mobile' => $request->mobile,
'otp' => $OTPCode,
'login_token' => $loginToken
]);
}
$user->notify(new OTPSms($OTPCode));
return response(['login_token' => $loginToken], 200);
} catch (Exception $ex) {
return response(['errors' => $ex->getMessage()], 422);
}
}
public function checkOtp(Request $request)
{
$request->validate([
'otp' => 'required|digits:6',
'login_token' => 'required'
]);
try {
$user = User::where('login_token', $request->login_token)->firstOrFail();
if ($user->otp == $request->otp) {
auth()->login($user, $remember = true);
return response(['ورود با موفقیت انجام شد'], 200);
} else {
return response(['errors' => ['otp' => ['کد تاییدیه نادرست است']]], 422);
}
} catch (Exception $ex) {
return response(['errors' => $ex->getMessage()], 422);
}
}
public function resendOtp(Request $request)
{
$request->validate([
'login_token' => 'required'
]);
try {
$user = User::where('login_token', $request->login_token)->firstOrFail();
$OTPCode = mt_rand(100000, 999999);
$loginToken = Hash::make('DCDCojncd@cdjn%!!ghnjrgtn&&');
$user->update([
'otp' => $OTPCode,
'login_token' => $loginToken
]);
$user->notify(new OTPSms($OTPCode));
return response(['login_token' => $loginToken], 200);
} catch (Exception $ex) {
return response(['errors' => $ex->getMessage()], 422);
}
}
}
web.php :
Route::any('/login', [AuthController::class, 'login'])->name('login');
Route::post('/check-otp', [AuthController::class, 'checkOtp']);
Route::post('/resend-otp', [AuthController::class, 'resendOtp']);
عکس زیر:
اسم ایدی اینپوت کد تغییر بده و تست کن
برای قاصدک هم از داکیومنتش استفاده کن توکن میخواد و اسم template
سلام این اررور از ولیدیشن کنترلر هست چون otp ارسال نمیشه یا مقدار نداره
$('#checkOTP').val()
لاگ بگیرید ببینید مقدار داره موقع ارسال و بعد توی کنترلر dd بگیرید قبل ولیدیشن ببینید ارسال میشه یا نه
@miladghorbani006
بله مشکل از اعتبار سنجی checkOtp هست
dd توی کنترلر checkOtp به این شکل گرفتم:
dd($request->all());
نتیجه :
@miladghorbani006
حق با شماست
آی دی های اضافه حذف کردم...
وقت آزاد دارید دسترسی آنی دسک بدم؟
اسم ایدی اینپوت کد تغییر بده و تست کن
برای قاصدک هم از داکیومنتش استفاده کن توکن میخواد و اسم template
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟