Создаем в корне сайта файл payeer_merchant.php, кодировка либо Windows 1251 либо UTF-8 без BOM.
Определяем, что будем писать код PHP - первоначальное содержимое файла
Для того, чтобы наш скрипт не запускался при посещении кем-либо делаем проверку IP адресов сервера оповещений Payeer
Мы будем запускать его при получении от сервера оповещений Payeer ID операции и подпись.
Добавляем в предыдущий код
Если сервер оповещений прислал ID платежа и подпись ($_POST['m_operation_id']) && isset($_POST['m_sign'])), начинаем проверку этих данных
Если секретное слово у Вас находится в файле _class.config.php, в данный момент уже нужно подключать классы, функции и базу игры
Далее формируем подпись из полученных данных от сервера оповещений Payeer и нашего секретного слова
В данный момент имеем код
Проверяем соответствие полученной подписи от сервера оповещений Payeer со сформированной нами, а также положительный статус платежа
Проверяем наличие ID платежа присланного сервером оповещений Payeer в нашей базе
Далее проверяем на отсутствие платежа в базе и, если платежа нет, выдаем для Payeer ошибку
Создаем массив данных платежа
Проверяем не оплачен ли уже данный платеж
Далее Вы производите начисление средств пользователю, бонусы, деревья, фрукты и т.п.
После Ваших кодов о зачислении средств поставьте в базе статус платежу на "оплачено"
В итоге получили код
Определяем, что будем писать код PHP - первоначальное содержимое файла
Код:
<?php
?>
Код:
<?php
if (!in_array($_SERVER['REMOTE_ADDR'], array('185.71.65.92', '185.71.65.189', '149.202.17.210'))) die('ERROR IP');
?>
Делаем чтобы наш скрипт пополнения запускался при наличии определенных данных. Также сделаем вывод ошибки при неполучении этих данных.die('ERROR IP') - останавливает выполнение скрипта и выдает текст 'ERROR IP' при несовпадении IP адреса
Мы будем запускать его при получении от сервера оповещений Payeer ID операции и подпись.
Добавляем в предыдущий код
Код:
if (isset($_POST['m_operation_id']) && isset($_POST['m_sign']))
{
}
else{
die('NO OPERATION ID OR SIGN');
}
Получаемdie('NO OPERATION ID OR SIGN'); - при отсутствии в оповещении сервера Payeer ID платежа либо подписи останавливает скрипт и выдает надпись 'NO OPERATION ID OR SIGN'.
Код:
<?php
if (!in_array($_SERVER['REMOTE_ADDR'], array('185.71.65.92', '185.71.65.189', '149.202.17.210'))) die('ERROR IP');
if (isset($_POST['m_operation_id']) && isset($_POST['m_sign']))
{
}
else{
die('NO OPERATION ID OR SIGN');
}
?>
Если секретное слово у Вас находится в файле _class.config.php, в данный момент уже нужно подключать классы, функции и базу игры
Код:
# Автоподгрузка классов
function __autoload($name){ include("classes/_class.".$name.".php");}
# Класс конфига
$config = new config;
# Функции
$func = new func;
# База данных
$db = new db($config->HostDB, $config->UserDB, $config->PassDB, $config->BaseDB);
Код:
$m_key = $config->secretW;
$arHash = array($_POST['m_operation_id'],
$_POST['m_operation_ps'],
$_POST['m_operation_date'],
$_POST['m_operation_pay_date'],
$_POST['m_shop'],
$_POST['m_orderid'],
$_POST['m_amount'],
$_POST['m_curr'],
$_POST['m_desc'],
$_POST['m_status'],
$m_key);
$sign_hash = strtoupper(hash('sha256', implode(':', $arHash)));
Код:
<?php
if (!in_array($_SERVER['REMOTE_ADDR'], array('185.71.65.92', '185.71.65.189', '149.202.17.210'))) die('ERROR IP');
if (isset($_POST['m_operation_id']) && isset($_POST['m_sign']))
{
# Автоподгрузка классов
function __autoload($name){ include("classes/_class.".$name.".php");}
# Класс конфига
$config = new config;
# Функции
$func = new func;
# База данных
$db = new db($config->HostDB, $config->UserDB, $config->PassDB, $config->BaseDB);
$m_key = $config->secretW;
$arHash = array($_POST['m_operation_id'],
$_POST['m_operation_ps'],
$_POST['m_operation_date'],
$_POST['m_operation_pay_date'],
$_POST['m_shop'],
$_POST['m_orderid'],
$_POST['m_amount'],
$_POST['m_curr'],
$_POST['m_desc'],
$_POST['m_status'],
$m_key);
$sign_hash = strtoupper(hash('sha256', implode(':', $arHash)));
}
else{
die('NO OPERATION ID OR SIGN');
}
?>
Код:
if ($_POST['m_sign'] == $sign_hash && $_POST['m_status'] == 'success')
{
}
echo $_POST['m_orderid'].'|error';
Теперь наш код выглядит следующим образомecho $_POST['m_orderid'].'|error'; - из документации Payeer. Данный текст об ошибке появляется при несоответсвии подписи либо при статусе платежа отличным от 'success'. Его считывает сервер оповещений Payeer и через некоторое время пытается выполнить повторный запрос к Вашему мерчанту.
Код:
<?php
if (!in_array($_SERVER['REMOTE_ADDR'], array('185.71.65.92', '185.71.65.189', '149.202.17.210'))) die('ERROR IP');
if (isset($_POST['m_operation_id']) && isset($_POST['m_sign']))
{
# Автоподгрузка классов
function __autoload($name){ include("classes/_class.".$name.".php");}
# Класс конфига
$config = new config;
# Функции
$func = new func;
# База данных
$db = new db($config->HostDB, $config->UserDB, $config->PassDB, $config->BaseDB);
$m_key = $config->secretW;
$arHash = array($_POST['m_operation_id'],
$_POST['m_operation_ps'],
$_POST['m_operation_date'],
$_POST['m_operation_pay_date'],
$_POST['m_shop'],
$_POST['m_orderid'],
$_POST['m_amount'],
$_POST['m_curr'],
$_POST['m_desc'],
$_POST['m_status'],
$m_key);
$sign_hash = strtoupper(hash('sha256', implode(':', $arHash)));
if ($_POST['m_sign'] == $sign_hash && $_POST['m_status'] == 'success')
{
}
echo $_POST['m_orderid'].'|error';
}
else{
die('NO OPERATION ID OR SIGN');
}
?>
Во всех фермах почему-то используют intval() для всех данных, которые должны быть целыми числами.
Почему мы так делать не будем:
- Описание функции;
- при формировании формы платежа Вы используете для получения ID платежа функцию $db->LastInsert(), которая возвращает ID последней вставленной записи в базу, т.е. ЦЕЛОЕ число;
- если произошла ошибка в передаче данных и отправилось в ID платежа вещественное число, то intval() приведет его к целому числу и скрипт в этом случае будет пытаться выполниться, а не выдать ошибку.
НАМ НУЖНА ОШИБКА, а не выполнение скрипта с неверными данными, поэтому мы ничего не будем делать с данной переменной.
Код:
$db->Query("SELECT * FROM db_payeer_insert WHERE id = '".$_POST['m_orderid']."'") or die('ERROR ORDER ID IN BASE');
Код:
if($db->NumRows() == 0){ echo $_POST['m_orderid'].'|error'; exit;}
Код:
$payeer_row = $db->FetchArray();
Код:
if($payeer_row['status'] > 0){ echo $_POST['m_orderid'].'|success'; exit;}
После Ваших кодов о зачислении средств поставьте в базе статус платежу на "оплачено"
Код:
$db->Query("UPDATE db_payeer_insert SET status = '1' WHERE id = '".$_POST['m_orderid']."'");
Код:
<?php
if (!in_array($_SERVER['REMOTE_ADDR'], array('185.71.65.92', '185.71.65.189', '149.202.17.210'))) die('ERROR IP');
if (isset($_POST['m_operation_id']) && isset($_POST['m_sign']))
{
# Автоподгрузка классов
function __autoload($name){ include("classes/_class.".$name.".php");}
# Класс конфига
$config = new config;
# Функции
$func = new func;
# База данных
$db = new db($config->HostDB, $config->UserDB, $config->PassDB, $config->BaseDB);
$m_key = $config->secretW;
$arHash = array($_POST['m_operation_id'],
$_POST['m_operation_ps'],
$_POST['m_operation_date'],
$_POST['m_operation_pay_date'],
$_POST['m_shop'],
$_POST['m_orderid'],
$_POST['m_amount'],
$_POST['m_curr'],
$_POST['m_desc'],
$_POST['m_status'],
$m_key);
$sign_hash = strtoupper(hash('sha256', implode(':', $arHash)));
if ($_POST['m_sign'] == $sign_hash && $_POST['m_status'] == 'success')
{
$db->Query("SELECT * FROM db_payeer_insert WHERE id = '".$_POST['m_orderid']."'") or die('ERROR ORDER ID IN BASE');
if($db->NumRows() == 0){ echo $_POST['m_orderid'].'|error'; exit;}
$payeer_row = $db->FetchArray();
if($payeer_row['status'] > 0){ echo $_POST['m_orderid'].'|success'; exit;}
//Ваши зачисления, бонусы и т.п.
$db->Query("UPDATE db_payeer_insert SET status = '1' WHERE id = '".intval($_POST['m_orderid'])."'");
echo $_POST['m_orderid'].'|success';
exit;
}
echo $_POST['m_orderid'].'|error';
}
else{
die('NO OPERATION ID OR SIGN');
}
?>
Последнее редактирование модератором:
nikitakuz046
Местный
- Сообщения
- 1
- Реакции
- 0
обращение к обработчику происходит с IP адреса, которого нет в функции проверкиnikitakuz046 написал(а):А что может быть если ошибка при проверке айпи адреса идёт ERROR IP ?
Код:
185.71.65.92', '185.71.65.189', '149.202.17.210