Файл: upload/core/functions/payment.php
Строк: 72
<?php
function InsertPay($usId, $amount)
{
dbquery("START TRANSACTION");
// 1. Проверяем пользователя
$us = FetchAssoc(dbquery("SELECT * FROM users WHERE id = ? FOR UPDATE", [$usId]));
if (!$us) {
dbquery("ROLLBACK");
return false;
}
$order = OrderGenKey();
// 2. Создаём запись о платеже
if (function_exists('ModulePay')) {
insertTransaction($amount, $usId, 2, 1, 1, $order);
}
dbquery("COMMIT");
// 3. Передаём управление модулю
if (function_exists('ModulePay')) {
ModulePay($order, $us, $amount);
} else {
showAlert('Ошибка', 'fail', 'Модуль платежей не найден');
ReloadPage();
exit;
}
return true;
}
function InsertPayOut($us, $requisites, $summ, $order, $stade, $commission)
{
// 1. Начинаем транзакцию
dbquery("START TRANSACTION");
// 2. Блокируем строку пользователя (исключает параллельные запросы)
$usId = FetchAssoc(dbquery("SELECT `id`, `k_money` FROM `users` WHERE id=? FOR UPDATE", [$us]));
if (!$usId) {
dbquery("ROLLBACK");
return false;
}
// 3. Проверяем баланс
if ($summ > getAvailableBalance($usId['id'], $usId['k_money'])) {
dbquery("ROLLBACK");
return false;
}
// 5. Пытаемся создать payout
$insert = dbquery("INSERT INTO payout SET summ=?, us=?, k_time=?, stade=?, k_order=?, requisites=?, commiss=?, answer=?", [$summ, $us, time(), $stade, $order, $requisites, $commission, '']);
if (!$insert) {
dbquery("ROLLBACK");
return false;
}
// 6. Создаём транзакцию и выполняем списание
insertTransaction($summ, $us, 2, 0, 2, $order);
$payoutMoney = dbquery("UPDATE users SET k_money = k_money - ? WHERE id = ?", [$summ, $us]);
if (!$payoutMoney) {
dbquery("ROLLBACK");
return false;
}
// 8. Фиксируем
dbquery("COMMIT");
ReloadPage();
exit();
}
function ConfirmPayout($payoutId)
{
dbquery("START TRANSACTION");
// 1. Получаем payout в статусе 0 (ожидание)
$po = FetchAssoc(dbquery("SELECT * FROM payout WHERE id = ? AND stade = 0 FOR UPDATE", [$payoutId]));
if (!$po) {
dbquery("ROLLBACK");
return false;
}
// 2. Получаем пользователя
$us = FetchAssoc(dbquery("SELECT * FROM users WHERE id = ?", [$po['us']]));
if (!$us) {
dbquery("ROLLBACK");
return false;
}
// 3. Считаем комиссию и сумму к выплате
$commissionData = Commission($po['summ'], $po['commiss']);
$commiss = $commissionData['commission'];
$userProfit = $commissionData['profit']; // сумма, которую нужно отправить на карту
dbquery("COMMIT");
// 4. Передаём управление модулю выплат
// Модуль сам делает выплату, обновляет payout, транзакции и комиссию
if (function_exists('ModulePayout')) {
ModulePayout($po, $us, $userProfit, $commiss);
} else {
updateTransactions($po['us'], $po['k_order'], 0, 1, 2);
showAlert('Ошибка', 'fail', 'Модуль платежей не найден');
ReloadPage();
exit;
}
return true;
}
function DenyPayout($payoutId, $info_action)
{
// 1. Начинаем транзакцию
dbquery("START TRANSACTION");
// 2. Получаем payout в статусе 0 (ожидание)
$po = FetchAssoc(dbquery("SELECT * FROM payout WHERE id = ? AND stade = 0 FOR UPDATE", [$payoutId]));
if (!$po) {
dbquery("ROLLBACK");
return false;
}
// 3. Возвращаем деньги пользователю
$payoutMoney = dbquery("UPDATE users SET k_money = k_money + ? WHERE id = ?", [$po['summ'], $po['us']]);
if (!$payoutMoney) {
dbquery("ROLLBACK");
return false;
}
// 4. Обновляем payout
$uppo = dbquery("UPDATE payout SET stade = 2, answer=? WHERE id = ? AND stade = 0", [$info_action, $po['id']]);
if (!$uppo) {
dbquery("ROLLBACK");
return false;
}
// 5. Обновляем транзакцию списания (меняем статус на "возврат")
updateTransactions($po['us'], $po['k_order'], 4, 1, 2);
// 7. Фиксируем изменения
dbquery("COMMIT");
return true;
}
?>