Подскажите как исправить баг в 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