Подскажите как исправить баг в php скрипте платежной системы interkassa?

Сегодня на моем сайте игрок спокойно купил услугу за 0.95руб которая стоит 3000руб, как это он сделал я не могу понять! Помогите пожалуйста.

index.php статус оплаты

if (isset($_GET['pstatus'])) {
    switch ($_GET['pstatus']) {
        case 'success':
            MessageSend(3, 'Оплата успешно завершена, спасибо за покупку!', 'index.php');
            break;

        case 'waiting':
            MessageSend(2, 'Оплата не завершена, ожидание платежа...', 'index.php');
            break;

        case 'fail':
            MessageSend(1, 'Платёж отменён.', 'index.php');
            break;
    }
}

payment.php

<?php
define("TKM", true);
require(dirname(__FILE__) . "/engine.php");

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $username = TextSave(@$_POST['username']);
    $selid = (int)TextSave(@$_POST['selid']);
    $server = (int)TextSave(@$_POST['server']);
    $merchant = TextSave(@$_POST['merchant']);
    $phone = TextSave(@$_POST['phone']);

    $check_addon = explode("|", $merchant);
    $merchant = $check_addon['0'];

    if (empty($username) || $selid == 0 || $server < 0 || empty($merchant) || $check_addon['0'] == 'qiwi' && empty($phone)) {
        MessageSend(1, "Заполните все поля формы!", 'index.php');
    }

    if (!preg_match('/^' . U_REGEXP . '$/', $username)) {
        MessageSend(1, "Неверный ник!", 'index.php');
    }

    if (!empty($phone) && !preg_match('/^(7|77|373|40|8|9|10|375|1|55|962)[0-9]{6,12}$/', $phone)) {
        MessageSend(1, "Неверный номер телефона!", 'index.php');
    }

    if (!isset($check_addon['0']) || !isset($check_addon['1'])) {
        if (!${$merchant}['settings']['enable']) {
            MessageSend(1, "Платёжная система не включена!", 'index.php');
        }

        if (isset(${$merchant}['addon'])) {
            ${$merchant}['addon'] = ${$merchant}['addon']['default']['addon'];
        }
    } else {
        if (!${$merchant}['addon'][$check_addon['1']]['enable']) {
            MessageSend(1, "Платёжная система не включена!", 'index.php');
        }

        ${$merchant}['addon'] = ${$merchant}['addon'][$check_addon['1']]['addon'];
    }

    if (isset($_POST['server']) &&
        (int)$_POST['server'] <= (count($config['servers']) - 1) &&
        (int)$_POST['server'] >= 0
    ) {
        $server = (int)$_POST['server'];
    } else {
        MessageSend(1, "Выберите сервер!");
    }

    $row = $link->prepare("SELECT * FROM `mcraft_goods` WHERE `id` = ?");
    $row->execute(array($selid));

    if ($row) {
        $row = $row->fetch(PDO::FETCH_ASSOC);
    }

    if (empty($row['name'])) {
        MessageSend(1, "Неизвестный товар!", 'index.php');
    }

    if ($server != $row['server'] && $row['server'] != '*') {
        MessageSend(1, "Неизвестный товар!", 'index.php');
    }

    if (isset($_POST['dosubm']) && $row['dobuy'] == 1) {
        $dobuy = true;
    } else {
        $dobuy = false;
    }

    if ((int)$row['count'] <= 0 && $row['count'] != '-') {
        MessageSend(1, "Товар закончился!", 'index.php');
    }

    if ($row['cupon'] != NULL && $row['cupon'] > 0) {
        $t = ($row['cost'] * $row['cupon']) / 100;
        $cost = $row['cost'] - $t;
    } else $cost = $row['cost'];
    if ($dobuy) {
        $drow = $link->prepare("SELECT * FROM `mcraft_buyers` WHERE `username` = ? AND `server` = ? ORDER BY `cost` DESC");
        $drow->execute(array($username, $server));

        if ($drow) {
            $drow = $drow->fetch(PDO::FETCH_ASSOC);
        }

        if ($drow['good'] == $row['id']) {
            MessageSend(1, "У вас уже эта привелегия!", 'index.php');
        }

        $dobuyCheckGoods = $link->prepare("SELECT `dobuy` FROM `mcraft_goods` WHERE `id` = ?");
        $dobuyCheckGoods->execute(array($drow['good']));

        if ($dobuyCheckGoods) {
            $dobuyCheckGoods = $dobuyCheckGoods->fetch(PDO::FETCH_ASSOC)['dobuy'];
        }

        if (!empty($drow['id']) &&
            (@$dobuyCheckGoods == 1)
        ) {
            $cost -= (int)$drow['cost'];
        }
    }

    if (isset($_POST['cupon']) && !empty($_POST['cupon'])) {
        $cuponname = TextSave(@$_POST['cupon']);

        $crow = $link->prepare("SELECT * FROM `mcraft_cupons` WHERE `name` = ?");
        $crow->execute(array($cuponname));

        if ($crow) {
            $crow = $crow->fetch(PDO::FETCH_ASSOC);
        }

        if (empty($crow['name'])) {
            MessageSend(1, "Купон не действителен!", 'index.php');
        }

        if ($crow['count'] <= 0) {
            $delCupon = $link->prepare("DELETE FROM `mcraft_cupons` WHERE `name` = ?");
            $delCupon->execute(array($cuponname));
            MessageSend(1, "Купон не действителен!", 'index.php');
        }

        $t = ($cost * $crow['summ']) / 100;
        $cost = $cost - $t;

        if ($cost < 0) {
            MessageSend(1, "Цена должна быть больше 0!", 'index.php');
        }

        if ($crow['count'] > 1) {
            $updCupon = $link->prepare("UPDATE `mcraft_cupons` SET `count` = `count` - 1 WHERE `name` = ?");
            $updCupon->execute(array($cuponname));
        } else {
            $delCupon = $link->prepare("DELETE FROM `mcraft_cupons` WHERE `name` = ?");
            $delCupon->execute(array($cuponname));
        }
    }

    if ($cost < 0) {
        MessageSend(1, "Цена должна быть больше 0!", 'index.php');
    }

    $data = array(
        'goods_id' => $row['id'],
        'goods_name' => $row['name'],
        'goods_cost' => $row['cost'],
        'goods_cupon' => $row['cupon'],
        'cost' => $cost,
    );

    if ($dobuy) {
        $data['dobuy'] = true;
    }

    if (isset($cuponname)) {
        $data['cupon'] = $cuponname;
    }

    $data = @json_encode($data, JSON_UNESCAPED_UNICODE);

    $payment = new Payment;
    $payment->create($username, $data, $server);
    $payid = $payment->payment_id;
    $desc = 'Покупка товара ' . $row['name'];
    $desc_base64 = base64_encode($desc);

    if ($cost == 0) {
        $payment->select($payment->payment_id);
        $payment->give();
        MessageSend(3, "Вы успешно приобрели товар: " . $row['name'], 'index.php');
    }

    require_once(LD_PAYMENTS_DIR . '/' . $merchant . '/form.php');

    exit("Err.");
} else {
    exit("Hacking attempt!");
}

Папка payments где хранятся платежные системы, на данный момент это interkassa/form.php

<?php
if (!defined("TKM")) die("<pre>Access denied!</pre>");
exit(header("Location: https://sci.interkassa.com/?ik_co_id={$interkassa['settings']['shop_id']}&ik_pm_no=ID_{$payid}&ik_am={$cost}&ik_cur=RUB&ik_desc={$desc}"));

interkassa - result.php

<?php
define("TKM", true);
require(realpath("../../engine.php"));

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    function ikSign($params, $ikKey) {
        unset($params['ik_sign']);
        foreach ($params as $key => $value)
            if (!preg_match("/^ik_/is", $key))
                unset($params[$key]);

        ksort($params, SORT_STRING);
        array_push($params, $ikKey);
        $sign = implode(":", $params);
        $sign = base64_encode(md5($sign, true));
        return $sign;
    }

    $kassaId = trim($_POST['ik_co_id']);
    $PayID = trim(strip_tags($_POST['ik_pm_no']));
    $summ = intval($_POST['ik_am']);
    $paySystem = trim($_POST['ik_pw_via']);
    $payStatus = trim($_POST['ik_inv_st']);
    $sign = trim($_POST['ik_sign']);
    $ik_payment_timestamp = trim($_POST['ik_inv_prc']);
    $secretKey = $interkassa['settings']['secret_key'];
    $PayID = explode("_", $PayID);
    $PayID = $PayID['1'];

    if ($interkassa['settings']['testing'] && ($paySystem == "test_interkassa_test_xts")) {
        $secretKey = $interkassa['settings']['testing_key'];
    } elseif ($paySystem == "test_interkassa_test_xts") {
        exit("OK");
    }

    if ($kassaId != $interkassa['settings']['shop_id']) {
        exit("Not valid shop ID!");
    }

    if ($sign != ikSign($_POST, $secretKey)) {
        exit("Bad sign");
    }

    $payment = new Payment;
    $status = $payment->select($PayID, $summ);

    if (!$status) {
        exit($status);
    }

    $status = $payment->give();

    if (!$status) {
        exit($status);
    }
}

exit("OK");

и собсвенно говоря конфиг config.php

<?php
if (!defined("TKM")) die("<pre>Access denied!</pre>");
//Generated with love!
$interkassa = array (
  'name' => 'Interkassa',
  'settings' => 
  array (
    'enable' => true,
    'shop_id' => '43434',
    'secret_key' => '343434',
    'testing' => false,
    'testing_key' => '4pqFMtXvJfqQUrUZ',
  ),
  'summary' => 
  array (
    'shop_id' => 'ID Магазина',
    'secret_key' => 'Секретный ключ',
    'testing' => 'Принимать тестовые платежи?',
    'testing_key' => 'Ключ тестирования',
  ),
);
?>

Что может быть в данном скрипте не так? я так понимаю любой кто покупают услугу может изменить сумму в адресной строке? как так сделать что бы клиент не мог изменить сумму в адресной строке? или по api interkassa


Ответы (0 шт):