ДеньгиOnline

2017-07-29 03:29:04

Оповещение о проведении платежа

Оповещение на URL

После получения уведомления об успешном завершении платежа от Платёжной системы Система оповещает Проект о проведении платежа.

Проекту необходимы:

  • URL оповещения о проведении платежа (указать в Технических настройках в Личном кабинете);
  • Обработчик, способный принять и распознать параметры запроса от Системы и ответить так, как того ожидает Система.

Параметры запроса от Системы в Проект

Система отсылает Проекту запрос на URL оповещения о проведении платежа, указанный в Технических настройках в Личном кабинете.

Для передачи параметров запроса используются следующие правила:

  • метод передачи - POST;
  • формат - XML;
  • кодировка - UTF-8.
Параметр Описание параметра Формат параметра Обязательность параметра
amount

Сумма платежа в рублях.

Если валюта оплаты — не рубли, конвертация происходит по курсу на день оплаты и оповещения и сумма платежа может отличаться от суммы счёта.

Для получения оповещения об оплате в валюте выставленного счёта обратитесь через Личный кабинет клиента Системы

decimal(10.2),

разделитель - точка.

Да
init_order_currency

Равен значению параметра paymentCurrency, приходящего от Проекта при выставлении счёта в общем случае

Если параметр paymentCurrency не задан, то в init_order_currency указывается дефолтное значение валюты платежной системы.

string(3)

ISO 4217 alfa-3

Да
userid Идентификатор пользователя или заказа (равен nickname в запросе на выставление счёта) string(256) Да
paymentid Уникальный идентификатор платежа в Системе int(30) Да
key

Контрольная подпись запроса. Формируется как хэш по алгоритму md5 от конкатенации следующих параметров:

  • значение параметра amount,
  • значение параметра userid,
  • значение параметра paymentid,
  • секретный ключ проекта
md5(amount.userid.
paymentid.секрет проекта)
Например: md5(5.00test_user123456
seсretkey)
Да
paymode Идентификатор платёжного метода (равен mode_type в запросе на выставление счёта) int(10) Да
userid_extra

Дополнительные сведения, необходимые для совершения платежа или сбора статистики на стороне Проекта (равен nick_extra в запросе на выставление счёта)

Внимание! Параметр не используется для терминальных сетей

string(500) Нет


orderid

Идентификатор платежа в системе Проекта (равен order_id в запросе на выставление счёта. Передается, если фигурирует в запросе)

Внимание! Параметр не используется для терминальных сетей

varchar(64)
Нет


amount_transfer Сумма платежа в валюте расчёта с платежной системой decimal(10,4)

Нет

Информативные параметры для проектов с опцией мультивалютного баланса

currency_transfer Валюта расчёта с платежной системой char(3),
ISO 4217 alfa-3

Параметры ответа Проекта

При отсутствии ответа на оповещение о зачислении средств Система будет повторять попытки оповестить Проект еще некоторое время: в зависимости от платежного метода период варьируется от 1,5 часов до 1 недели, а частота от 1 до 30 минут. Ряд платежных систем в силу специфики протоколов в случае отсутствия/неполучения ответа от Проекта или получения ответа NO не отправляют повторно оповещения о зачислении денежных средств.

Внимание!

Обработчик Проекта на странице оповещения о проведении платежа должен проверять входящие значения paymentid:

  1. Если запрос содержит paymentid, ранее зафиксированный в системе Проекта, ответ должен содержать предыдущий статус операции.
  2. Если значение paymentid зафиксировано впервые, ответ проекта должен отражать возможность приёма платежа.

Проект должен на своей стороне контролировать уникальность запросов и возвращать ответ в соответствии со статусом по данному платежу: запросы от Системы с целью оповещения могут повторяться.

Если значение HTTP Status в header ответа отлично от 200 (ОК), такой запрос будет обработан как ошибочный вне зависимости от его содержимого.

Для передачи параметров запроса используются следующие правила:

  • метод передачи - POST;
  • формат - XML;
  • кодировка - UTF-8.
Параметр Описание параметра Формат параметра Обязательность параметра
id Идентификатор платежа в базе Проекта string(64) Нет
code

Код ответа на запрос.

  • YES — идентификатор существует.
  • NO — идентификатор не существует
YES/NO (регистрозависимый) Да
comment Расшифровка кода ответа на запрос. Любой текст на усмотрение Проекта.Текст будет отображаться в Личном кабинете клиента Системы string(400) Нет

Пример ответа на запрос оповещения о зачислении средств

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <id>666666</id>
  <code>YES</code>
</result>

Пример минимального обработчика запросов Системы при оповещении о проведении платежа (PHP)

//Генерация ответа
function sendResponse($status, $message = ''){
    $response = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
    $response .= '<result>'."\n";
        $response .= '<code>'.$status.'</code>'."\n";
    $response .= '<comment>'.$message.'</comment>'."\n";
    $response .= '</result>';
    die($response);
}

//Проверка, не приходило ли оповещение о таком идентификаторе платежа ранее
function checkDuplicate($ODPaymentID){
    $sql = "SELECT status FROM billing_table WHERE od_payment_id = ".intval($ODPaymentID);
    $query = mysql_query($sql);
    if(mysql_num_rows($query) == 0){
        return FALSE;
    }
    $status = mysql_result($query, 0, 'status');

    //Платеж успешно выполнен ранее
    if($status == 'SUCCESS'){
        return TRUE;
    }
    else{
        return FALSE;
    }
}
$secretKey = 'IT\'S_A_PROJECT_SECRET_WORD';
$projectHash = md5($_POST['amount'].$_POST['userid'].$_POST['paymentid'].$secretKey);
if($projectHash != $_POST['key']){
    sendResponse('NO', 'Контрольная подпись запроса неверна.');
}

if(filter_var($_POST['amount'], FILTER_VALIDATE_FLOAT) && filter_var($_POST['paymentid'], FILTER_VALIDATE_INT) && floatval($_POST['amount']) > 0 && intval($_POST['paymentid']) > 0){

    //Запрос на проведение оплаты в проект
    if(!checkDuplicate($_POST['paymentid'])){
        //совершаем действия по начислению денежных средств пользователю
        //возвращаем текущий статус оплаты.
        sendResponse(..., 'Текущий статус платежа.');
    }
    else{ sendResponse('YES', 'Платеж был успешно выполнен ранее.');
    }
}