Пишем обработчик платежей Payeer для Фруктовой Фермы

pligin

Команда форума
Администратор
#1
Создаем в корне сайта файл payeer_merchant.php, кодировка либо Windows 1251 либо UTF-8 без BOM.

Определяем, что будем писать код PHP - первоначальное содержимое файла
Код:
<?php

?>
Для того, чтобы наш скрипт не запускался при посещении кем-либо делаем проверку IP адресов сервера оповещений Payeer
Код:
<?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');
}
?>
Если сервер оповещений прислал ID платежа и подпись ($_POST['m_operation_id']) && isset($_POST['m_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);
Далее формируем подпись из полученных данных от сервера оповещений Payeer и нашего секретного слова
Код:
    $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');
}
?>
Проверяем соответствие полученной подписи от сервера оповещений Payeer со сформированной нами, а также положительный статус платежа
Код:
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');
}
?>
Проверяем наличие ID платежа присланного сервером оповещений Payeer в нашей базе
Во всех фермах почему-то используют 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');
Далее проверяем на отсутствие платежа в базе и, если платежа нет, выдаем для Payeer ошибку
Код:
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');
}
?>
 
Последнее редактирование:

pligin

Команда форума
Администратор
#3
А что может быть если ошибка при проверке айпи адреса идёт ERROR IP ?
обращение к обработчику происходит с IP адреса, которого нет в функции проверки
Код:
185.71.65.92', '185.71.65.189', '149.202.17.210
посмотри в Payeer какие IP у их серверов
 
Сверху