feat: implement secure OTP-based payout workflow with dynamic fee calculation and improved authentication checks

This commit is contained in:
Hamza-Ayed
2026-07-19 01:51:39 +03:00
parent 5e80c886a0
commit 085b180bdb
11 changed files with 252 additions and 193 deletions
+20 -24
View File
@@ -59,18 +59,19 @@ try {
// 3. Encrypt data to query
// 4. Verify based on user type
try {
$encryptedPhoneSearch = $encryptionHelper->encryptData($phone_number);
if ($user_type === 'admin') {
$sql = "SELECT * FROM token_verification_admin
WHERE expiration_time >= NOW() AND verified = 0";
WHERE expiration_time >= NOW() AND verified = 0 AND phone_number = ?";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->execute([$encryptedPhoneSearch]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$matchedRow = null;
foreach ($rows as $row) {
$decryptedPhone = $encryptionHelper->decryptData($row['phone_number']);
$decryptedToken = $encryptionHelper->decryptData($row['token']);
if ($decryptedPhone === $phone_number && $decryptedToken === $token_code) {
if ($decryptedToken === $token_code) {
$matchedRow = $row;
break;
}
@@ -101,16 +102,15 @@ try {
}
} elseif ($user_type === 'service') {
$sql = "SELECT `id`, `phone_number`, `token_code` FROM `phone_verification_service`
WHERE `expiration_time` > NOW() AND `is_verified` = 0";
WHERE `expiration_time` > NOW() AND `is_verified` = 0 AND `phone_number` = ?";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->execute([$encryptedPhoneSearch]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$matchedRowId = null;
foreach ($rows as $row) {
$decryptedPhone = $encryptionHelper->decryptData($row['phone_number']);
$decryptedToken = $encryptionHelper->decryptData($row['token_code']);
if ($decryptedPhone === $phone_number && $decryptedToken === $token_code) {
if ($decryptedToken === $token_code) {
$matchedRowId = $row['id'];
break;
}
@@ -128,16 +128,15 @@ try {
} elseif ($user_type === 'driver') {
if ($context === 'token_change') {
$sql = "SELECT `id`, `phone_number`, `token` FROM `token_verification_driver`
WHERE `expiration_time` > NOW() AND `verified` = 0";
WHERE `expiration_time` > NOW() AND `verified` = 0 AND `phone_number` = ?";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->execute([$encryptedPhoneSearch]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$matchedRowId = null;
foreach ($rows as $row) {
$decryptedPhone = $encryptionHelper->decryptData($row['phone_number']);
$decryptedToken = $encryptionHelper->decryptData($row['token']);
if ($decryptedPhone === $phone_number && $decryptedToken === $token_code) {
if ($decryptedToken === $token_code) {
$matchedRowId = $row['id'];
break;
}
@@ -154,16 +153,15 @@ try {
}
} else {
$sql = "SELECT `id`, `phone_number`, `token_code` FROM `phone_verification`
WHERE `expiration_time` > NOW() AND `is_verified` = 0";
WHERE `expiration_time` > NOW() AND `is_verified` = 0 AND `phone_number` = ?";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->execute([$encryptedPhoneSearch]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$matchedRowId = null;
foreach ($rows as $row) {
$decryptedPhone = $encryptionHelper->decryptData($row['phone_number']);
$decryptedToken = $encryptionHelper->decryptData($row['token_code']);
if ($decryptedPhone === $phone_number && $decryptedToken === $token_code) {
if ($decryptedToken === $token_code) {
$matchedRowId = $row['id'];
break;
}
@@ -210,16 +208,15 @@ try {
} else {
if ($context === 'token_change') {
$sql = "SELECT `id`, `phone_number`, `token` FROM `token_verification`
WHERE `expiration_time` > NOW() AND `verified` = 0";
WHERE `expiration_time` > NOW() AND `verified` = 0 AND `phone_number` = ?";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->execute([$encryptedPhoneSearch]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$matchedRowId = null;
foreach ($rows as $row) {
$decryptedPhone = $encryptionHelper->decryptData($row['phone_number']);
$decryptedToken = $encryptionHelper->decryptData($row['token']);
if ($decryptedPhone === $phone_number && $decryptedToken === $token_code) {
if ($decryptedToken === $token_code) {
$matchedRowId = $row['id'];
break;
}
@@ -236,16 +233,15 @@ try {
}
} else {
$sql = "SELECT `id`, `phone_number`, `token` FROM `phone_verification_passenger`
WHERE `expiration_time` > NOW() AND `verified` = 0";
WHERE `expiration_time` > NOW() AND `verified` = 0 AND `phone_number` = ?";
$stmt = $con->prepare($sql);
$stmt->execute();
$stmt->execute([$encryptedPhoneSearch]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$matchedRowId = null;
foreach ($rows as $row) {
$decryptedPhone = $encryptionHelper->decryptData($row['phone_number']);
$decryptedToken = $encryptionHelper->decryptData($row['token']);
if ($decryptedPhone === $phone_number && $decryptedToken === $token_code) {
if ($decryptedToken === $token_code) {
$matchedRowId = $row['id'];
break;
}