| Server IP : 95.46.96.79 / Your IP : 216.73.216.84 Web Server : Apache/2.4.41 (Ubuntu) System : Linux zaimer.uz 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 User : akslabs_uz_usr ( 1001) PHP Version : 7.4.3-4ubuntu2.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/sugurtatrip__usr95/data/www/sugurtatrip.uz/apiv1/user/Services/ |
Upload File : |
<?php
require_once __DIR__ . '/../Core/HttpClient.php';
require_once __DIR__ . '/../database/Database.php';
require_once __DIR__ . '/../Core/Logger.php';
require_once __DIR__ . '/../Models/ErrorCodes.php';
require_once __DIR__ . '/../Models/ErrorMessages.php';
// require_once __DIR__ . '/../Models/MessageTemplates.php';
class SMSConfirmationService
{
private $sms_service_url;
public function __construct()
{
$this->sms_service_url = $_ENV['SMS_SERVICE_URL'];
}
public function request_code($data) {
$lang = $data['lang'];
$code = $this->generateCode();
$result = [
'success' => false,
'data' => null,
'error' => null,
'error_message' => null
];
try {
$existing_user = $this->userExists($data['phone']);
$user_id = $existing_user ? $existing_user : null;
if (!$user_id) {
throw new \Exception(ErrorMessages::USER_NOT_FOUND);
}
$code_id = $this->createConfirmationCode($user_id, $code);
if (!$code_id) {
throw new \Exception(ErrorMessages::FAILED_CODE_CREATION);
}
$message_template = $lang === 'uz' ? $_ENV['SMS_TEMPLATE_UZ'] : $_ENV['SMS_TEMPLATE_RU'];
$sms_result = $this->sendSMS($data['phone'], $code, $message_template);
if ($sms_result['http_code'] !== 200) {
throw new \Exception(ErrorMessages::FAILED_SMS_SEND . ': ' . print_r($sms_result, true));
}
$result['success'] = true;
$result['data'] = [
'client_id' => $user_id,
'client_phone' => $data['phone'],
'code_id' => $code_id
];
} catch (\Exception $e) {
$result['error'] = $e->getCode();
$result['error_message'] = $e->getMessage();
}
return $result;
}
public function confirm_code($data) {
$result = [
'success' => false,
'data' => null,
'error' => null,
'error_message' => null
];
try {
$db = new Database();
$query = "SELECT * FROM sended_codes WHERE id = " . intval($data['codeId']);
$db_data = $db->query($query);
if ($db_data && $db_data->num_rows > 0) {
$row = $db_data->fetch_assoc();
if ($row['confirmed'] == 1) {
$result['error'] = ErrorCodes::CODE_CONFIRMED;
$result['error_message'] = ErrorMessages::CODE_CONFIRMED;
} else {
$timezone = new \DateTimeZone('UTC');
$created_at = new \DateTime($row['created_at'], $timezone);
$now = new \DateTime('now', $timezone);
$user_id = $row['client_id'];
$interval = $now->getTimestamp() - $created_at->getTimestamp();
if ($interval < 60) { // Check if created_at is not older than 1 minute (60 seconds)
if ($row['confirmation_code'] == $data['code']) {
// Mark the code as confirmed
$this->markCodeAsConfirmed($data['codeId']);
$result['success'] = true;
$result['data'] = ErrorCodes::CODE_CONFIRMED;
$result['user_id'] = $user_id;
$result['phone'] = $data['phone'];
} else {
$result['error'] = ErrorCodes::INVALID_CODE;
$result['error_message'] = ErrorMessages::INVALID_CODE;
}
} else {
$result['error'] = ErrorCodes::CODE_EXPIRED;
$result['error_message'] = ErrorMessages::CODE_EXPIRED;
}
}
} else {
$result['error'] = ErrorCodes::CODE_EXPIRED;
$result['error_message'] = ErrorMessages::CODE_EXPIRED;
}
} catch (\Exception $e) {
$result['error'] = "DB_ERROR";
$result['error_message'] = $e->getMessage();
} finally {
if (isset($db)) {
$db->close();
}
}
return $result;
}
private function createConfirmationCode($user_id, $code) {
$db = new Database();
$code_id = $db->addConfirmationCode($user_id, $code);
return $code_id;
}
private function generateCode() {
return rand(100000, 999999);
}
private function markCodeAsConfirmed($code_id) {
$db = new Database();
try {
$query = "UPDATE sended_codes SET confirmed = 1, confirmed_at = NOW() WHERE id = " . intval($code_id);
$db->query($query);
$result = true;
} catch (\Exception $e) {
$result = false;
} finally {
$db->close();
}
return $result;
}
private function userExists($phone) {
$db = new Database();
$query = "SELECT id FROM clients WHERE client_phone = '$phone'";
$result = $db->query($query);
if ($result && $result->num_rows > 0) {
$row = $result->fetch_assoc();
$db->close();
return $row['id'];
} else {
$db->close();
return false;
}
}
private function sendSMS($phone, $code, $message_template) {
$data = [
"messages" => [
[
"recipient" => $phone,
"template-id" => $message_template,
"message-id" => uniqid("msg_"),
"variables" => [
"code" => $code
]
]
]
];
$client = new HttpClient();
$response = $client->post(
$this->sms_service_url . "/send",
$data,
$_ENV['SMS_SERVICE_LOGIN'],
$_ENV['SMS_SERVICE_PASSWORD']
);
return $response;
}
}