ДеньгиOnline

2017-01-16 19:48:03

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

После получения подтверждения успешного завершения платежа от Платёжной системы ДеньгиOnline оповещают Проект о проведении платежа.

ДеньгиOnline оповещают Проект запросом в кодировке UTF-8 методом POST на URL оповещения о проведении платежа, указанный в Технических настройках проекта в Личном кабинете. В ответ ДеньгиOnline ожидают получить ответ в формате XML и кодировке UTF-8.

Таблица параметров запроса оповещения о проведении платежа 

Параметр Описание параметра Формат параметра Обязательность параметра
amount

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

Для получения оповещения об оплате в валюте выставленного счёта обратитесь через Личный кабинет ДеньгиOnline:https://clients.dengionline.com/

decimal(10.2),

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

Обязательный
init_order_currency Равен значению параметра paymentCurrency, приходящего от проекта при выставлении счёта в общем случае. Если параметр paymentCurrency не задан, то в init_order_currency указывается дефолтное значение валюты платежной системы. string(3) Обязательный
userid Идентификатор пользователя или заказа (равен nickname в запросе на выставление счёта) string (256) Обязательный
paymentid Уникальный идентификатор платежа в системе ДеньгиOnline. 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 в запросе на выставление счёта) string (30)
Обязательный
(если передавался при выставлении счёта)

Внимание! Параметр не используется для терминальных сетей
amount_transfer Сумма платежа в валюте расчёта с платежной системой. decimal(10,4) Необязательные информативные параметры, которые передаются в случае, если у проекта включена опция мультивалютного баланса.
В случае любых вопросов по поводу мультивалютных балансов, пожалуйста обратитесь к вашему менеджеру Отдела Продаж компании «Деньги Online»
currency_transfer Валюта расчёта с платежной системой char(3),
ISO 4217 alfa-3

Ответ на запросы Системы при оповещении о зачислении средств

На каждый запрос Системы от Проекта должен приходить ответ в формате XML и кодировке UTF-8. При отсутствии ответа на оповещение о зачислении средств Система будет повторять попытки оповестить Проект.

Период, в течение которого производятся запросы оповещения для каждого платежного метода, может быть разным и варьироваться от 1,5 часов до 1 недели. Частота запросов варьируется от 1 до 30 минут.

Внимание!

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

По ряду платежных методов в случае отсутствия/неполучения ответа от Проекта или получения ответа NO оповещения о зачислении денежных средств повторно не отправляются. Это обусловлено спецификой протоколов платежных систем.

Предусматривается следующая реализация проверки, не проводилась ли обработка операции с данным значением paymentid:

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

По стандартному протоколу оповещения проектов ДеньгиOnline не гарантируют, что на 1 платеж будет отправлено только одно оповещение о зачислении средств. Запросы от ДеньгиOnline с целью оповещения могут повторяться. Проект должен на своей стороне контролировать уникальность запросов и возвращать ответ в соответствии со статусом по данному платежу.

При ответе на оповещение о зачислении средств можно передать идентификатор платежа в системе Проекта (тэг id). Дополнительно можно также сообщить текущий курс игровой валюты, по которому платёж зачислен на внутриигровой счёт Пользователя (тэг course).

Таблица тэгов ответа на запросы Системы при оповещении о зачислении средств 

Параметр Описание параметра Формат параметра  Обязательность параметра
id Идентификатор платежа в базе Проекта string (64) нет
code

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

YES - идентификатор существует.

NO - идентификатор не существует.

YES/NO

регистрозависимый

Обязательный
comment Расшифровка кода ответа на запрос. 
Любой текст на усмотрение Проекта.
Текст будет отображаться в Личном кабинете ДеньгиOnline.
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', 'Платеж был успешно выполнен ранее.');
}
}