Протокол взаимодействия с платежной системой — различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
Строка 125: | Строка 125: | ||
var Sign = Convert.ToBase64String(signHelper.GetSign(Data)); | var Sign = Convert.ToBase64String(signHelper.GetSign(Data)); | ||
− | + | == Отправка запроса и получение результата == | |
Пример исходного кода: | Пример исходного кода: | ||
requestData – объект, содержащий исходные данные для выполнения запроса к системе; | requestData – объект, содержащий исходные данные для выполнения запроса к системе; | ||
response – результат, который возвращает система. | response – результат, который возвращает система. | ||
− | //Отправляем запрос | + | // Отправляем запрос |
WebRequest webRequest = WebRequest.Create(url.Text); | WebRequest webRequest = WebRequest.Create(url.Text); | ||
webRequest.Method = "POST"; | webRequest.Method = "POST"; | ||
Строка 141: | Строка 141: | ||
sendStream.Close(); | sendStream.Close(); | ||
WebResponse res = webRequest.GetResponse(); | WebResponse res = webRequest.GetResponse(); | ||
− | + | // Получаем результаты | |
− | //Получаем результаты | ||
var ReceiveStream = res.GetResponseStream(); | var ReceiveStream = res.GetResponseStream(); | ||
var sr = new StreamReader(ReceiveStream, Encoding.UTF8); | var sr = new StreamReader(ReceiveStream, Encoding.UTF8); | ||
var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); | var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); | ||
− | + | == Запрос на проверку доступности платежной системы == | |
− | Для проверки доступности платежной системы необходимо отправить запрос с Operation = 0 и с пустым полем Data на адрес платежной системы. | + | Для проверки доступности платежной системы необходимо отправить запрос с Operation = 0 и с пустым полем Data на адрес платежной системы. В данном примере приведены все операции – от формирования запроса, до его подписи и отправки в систему. |
− | В данном примере приведены все операции – от формирования запроса, до его подписи и отправки в систему. | ||
Пример исходного кода: | Пример исходного кода: | ||
− | //Создаем запрос | + | |
− | var request = new AbonentPaysystemRequest() | + | //Создаем запрос |
+ | var request = new AbonentPaysystemRequest() | ||
{ | { | ||
SignedData = new RequestSignedData() | SignedData = new RequestSignedData() | ||
Строка 162: | Строка 161: | ||
Sign = "", | Sign = "", | ||
}; | }; | ||
− | + | //Подписываем | |
− | + | var cert = new X509Certificate2(Path, Password); | |
− | + | var signHelper = new RSASignHelper(cert); | |
− | + | requestData.Sign = Convert.ToBase64String(signHelper.GetSign(requestData.SignedData.ToJson())); | |
− | + | //Отправляем запрос | |
− | + | WebRequest webRequest = WebRequest.Create(url.Text); | |
− | + | webRequest.Method = "POST"; | |
− | + | webRequest.Timeout = 100000; | |
− | + | webRequest.ContentType = "application/json"; | |
− | + | var sentData = Encoding.UTF8.GetBytes(requestData.ToJson()); | |
− | + | webRequest.ContentLength = sentData.Length; | |
− | + | var sendStream = webRequest.GetRequestStream(); | |
− | + | sendStream.Write(sentData, 0, sentData.Length); | |
− | + | sendStream.Close(); | |
− | + | WebResponse res = webRequest.GetResponse(); | |
− | + | //Получаем результаты | |
− | + | var ReceiveStream = res.GetResponseStream(); | |
− | + | var sr = new StreamReader(ReceiveStream, Encoding.UTF8); | |
− | + | var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); | |
− | + | == Запрос на получение списка услуг == | |
Пример исходного кода: | Пример исходного кода: | ||
− | //Создаем запрос | + | // Создаем запрос |
− | var request = new AbonentPaysystemRequest() | + | var request = new AbonentPaysystemRequest() |
{ | { | ||
SignedData = new RequestSignedData() | SignedData = new RequestSignedData() | ||
Строка 195: | Строка 194: | ||
Sign = "", | Sign = "", | ||
}; | }; | ||
− | + | // Подписываем | |
− | + | ………… | |
− | + | // Отправляем запрос | |
− | + | ………… | |
− | + | // Получаем результаты | |
− | + | var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); | |
− | + | // Отображаем результаты | |
− | + | var paymentDestinations = PaymentDestinations.FromJson(response.SignedData.Data); | |
− | + | == Запрос на получение информации по лицевому счету == | |
Пример исходного кода: | Пример исходного кода: | ||
− | // | + | //С оздаем запрос |
− | var request = new AbonentPaysystemRequest() | + | var request = new AbonentPaysystemRequest() |
{ | { | ||
SignedData = new RequestSignedData() | SignedData = new RequestSignedData() | ||
Строка 217: | Строка 216: | ||
Sign = "", | Sign = "", | ||
}; | }; | ||
− | //Формируем лицевой счет для запроса | + | // Формируем лицевой счет для запроса |
− | var account = new AbonentAccount() | + | var account = new AbonentAccount() |
{ | { | ||
Account = “00000000”, | Account = “00000000”, | ||
SupplierId = 1, | SupplierId = 1, | ||
}; | }; | ||
− | //Передаем лицевой счет в запрос | + | // Передаем лицевой счет в запрос |
request.SignedData.Data = account.ToJson(); | request.SignedData.Data = account.ToJson(); | ||
Строка 234: | Строка 233: | ||
//Отображаем результаты | //Отображаем результаты | ||
var paymentDestinations = PaymentDestinations.FromJson(response.SignedData.Data); | var paymentDestinations = PaymentDestinations.FromJson(response.SignedData.Data); | ||
− | + | == Запрос на проведение платежа == | |
Пример исходного кода: | Пример исходного кода: | ||
− | //Создаем запрос | + | // Создаем запрос |
− | var request = new AbonentPaysystemRequest() | + | var request = new AbonentPaysystemRequest() |
{ | { | ||
SignedData = new RequestSignedData() | SignedData = new RequestSignedData() | ||
Строка 247: | Строка 246: | ||
Sign = "", | Sign = "", | ||
}; | }; | ||
− | //Формируем платеж | + | // Формируем платеж |
− | var pay = new Pay | + | var pay = new Pay |
{ | { | ||
Enlistments = new List<Enlistment>(), | Enlistments = new List<Enlistment>(), | ||
Id = Guid.NewGuid(), | Id = Guid.NewGuid(), | ||
}; | }; | ||
− | + | pay.PayDateTime = DateTime.Now; | |
− | + | pay.Enlistments.Add(new Enlistment() | |
{ | { | ||
Account = PayAccount.Text, | Account = PayAccount.Text, | ||
Строка 262: | Строка 261: | ||
Id = Guid.NewGuid(), | Id = Guid.NewGuid(), | ||
}); | }); | ||
− | //Передаем платеж в запрос | + | // Передаем платеж в запрос |
− | + | request.SignedData.Data = pay.ToJson(); | |
− | + | // Подписываем | |
− | + | ………… | |
− | + | // Отправляем запрос | |
− | + | ………… | |
− | + | // Получаем результаты | |
− | + | var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); | |
− | + | == Запрос на проверку статуса платежа == | |
− | |||
Пример исходного кода: | Пример исходного кода: | ||
− | //Создаем запрос | + | // Создаем запрос |
− | var request = new AbonentPaysystemRequest() | + | var request = new AbonentPaysystemRequest() |
{ | { | ||
SignedData = new RequestSignedData() | SignedData = new RequestSignedData() | ||
Строка 284: | Строка 282: | ||
Sign = "", | Sign = "", | ||
}; | }; | ||
− | //Передаем ID платежа в запрос | + | // Передаем ID платежа в запрос |
− | + | request.SignedData.Data = Id; | |
− | + | //Подписываем | |
− | + | ………… | |
− | + | //Отправляем запрос | |
− | + | ………… | |
− | + | //Получаем результаты | |
− | + | var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); | |
− |
Версия 16:29, 19 августа 2014
В данном документе описан регламент технического взаимодействия платежной системы «Абонент» с программным обеспечением агента по приему платежей по протоколу HTTP(S).
Документ предназначен для разработчиков программного обеспечения работающего на стороне агентов по приему платежей.
Содержание
- 1 Термины и определения
- 2 Алгоритм взаимодействия с системой
- 3 Общее описание допустимых запросов к системе
- 4 Общая структура взаимодействия
- 4.1 Библиотека для формирования запросов к системе
- 4.2 Подпись данных с помощью библиотеки
- 4.3 Отправка запроса и получение результата
- 4.4 Запрос на проверку доступности платежной системы
- 4.5 Запрос на получение списка услуг
- 4.6 Запрос на получение информации по лицевому счету
- 4.7 Запрос на проведение платежа
- 4.8 Запрос на проверку статуса платежа
Термины и определения
Система – платежная система «Абонент».
Агент – организация, осуществляющая прием оплаты через платежную систему «Абонент».
Алгоритм взаимодействия с системой
Взаимодействие с системой осуществляется в режиме запрос – ответ. Инициатором связи является клиентское ПО агента.
Для начала взаимодействия с системой агентом должны быть получены сертификат цифровой подписи и код клиента по приему платежей. Эти данные выдаются при подключении к системе. Запрещается передача этих сведений третьим лицам.
Общее описание допустимых запросов к системе
В функционал программного обеспечения работающего на стороне агента по приему платежей входит:
- Возможность выполнения запроса проверки доступности системы.
- Возможность получения списка доступных услуг.
- Возможность получения информации по лицевому счету для проведения платежа.
- Возможность проведения оплаты по указанному лицевому счету и по указанной услуге.
На каждый запрос система возвращает результат выполнения запроса и описание результата выполнения. В случае ошибки, система вернет также расширенное описание ошибки.
Допустимы следующие результаты выполнения операций:
- 0 – запрос успешно обработан;
- -1 – некорректная подпись;
- -2 – версия протокола не поддерживается;
- -3 – произошла ошибка обработки запроса.
Кроме того, по определенным типам запросов система может возвращать выходные параметры.
Набор входных и выходных параметров по каждому типу запроса описан в следующих разделах.
Проверить соединение
- Входные параметры – код клиента.
- Выходные параметры – отсутствуют.
Получить список услуг
- Входные параметры – код клиента.
- Выходные параметры:
- Код услуги или ресурса (в дальнейшем используется для формирования платежа).
- Наименование услуги или ресурса.
- Код организации, оказывающей услугу или поставляющей ресурс.
- Наименование организации, оказывающей услугу или поставляющей ресурс.
- Код типа лицевого счета, используемый для идентификации плательщика.
- Наименование типа лицевого счета, используемого для идентификации плательщика.
- Реквизиты организации для перечисления средств.
- Дополнительные поля для формирования платежа.
Получить данные по абоненту
- Входные параметры:
- Код типа лицевого счета.
- Лицевой счет.
- Выходные параметры:
- Код типа лицевого счета.
- Лицевой счет абонента.
- Список альтернативных лицевых счетов абонента с указанием типа.
- Список услуг абонента с информацией для приема платежа (текущая задолженность, признак наличия счетчика, последние показания счетчика и дата их съема, текущий тариф).
Зарегистрировать платеж
- Входные параметры:
- Уникальный номер платежа (Guid).
- Дата/время.
- Примечание.
- Другая информация.
- Зачисления - список сумм оплат, с разбивкой по услугам, с указанием для каждой услуги:
- Кода типа лицевого счета.
- Лицевого счета.
- Кода услуги.
- Суммы платежа.
- Дополнительные параметры (текущие показания счетчика, оплачиваемы объем и т.д.).
- Выходные параметры – результат обработки (поставлен в очередь, отклонен и т.д.)
Проверить статус платежа
- Входные параметры – уникальный номер платежа (Guid).
- Выходные параметры: список зачислений с указанием результатов обработки по каждому из зачислений (отправлено поставщику услуг/находится в очереди на обработку/ошибка и т.д.).
Общая структура взаимодействия
Инициатором обмена является ПО агента по приему платежей. Запросы посылаются через интернет, по протоколу HTTP(S) методом POST. Данные передаются в JSON-формате. Каждый запрос обязательно должен быть подписан с помощью ЭЦП агента.
Запрос должен содержать следующие поля:
- ProtocolVersion – версия протокола, строка.
- DataFormat- формат данных в поле Data. В настоящее время поддерживается только формат JSON, что соответствует значению 0 в данном поле.
- SignedData – подписываемые данные, структура
- ClientId – код клиента платежной системы, целое. Данный код выдается при подключении к платежной системе.
- Operation – тип операции, целое. Подробнее каждый тип операции будет рассмотрен ниже.
- Data – данные для выполнения операции, объект в JSON-формате.
- Sign – электронно-цифровая подпись, строка base64.
Библиотека для формирования запросов к системе
Для упрощения доступа к системе разработана специальная библиотека классов. Исходный код библиотеки на языке C# приведен в приложении к данному описанию.
Библиотека состоит из следующих основных классов.
Классы общего назначения:
- AbonentPaysystemRequest – запрос к платежной системе;
- AbonentPaysystemResponse – ответ от платежной системы;
- ExchangeResult – результат выполнения операции;
- RequestSignedData – входные данные для запроса;
- ResponseSignedData – выходные данные;
- RSASignHelper – класс, позволяющий подписывать данные с помощью сертификата.
Классы для проведения платежей:
- Pay – платеж;
- Enlistment – зачисление.
Классы для получения информации по абоненту:
- Abonent – абонент;
- AbonentAccount – сведения о лицевом счете абонента, с привязкой к поставщику услуг;
- AbonentBalance – информация по услуге (долги, показания счетчика и т.д.).
Классы для получения списка услуг:
- PaymentDestination – услуга.
Подпись данных с помощью библиотеки
Пример исходного кода для подписи строки:
// Открываем файл сертификата var cert = new X509Certificate2(Path, Password); // Создаем класс для выполнения подписи var signHelper = new RSASignHelper(cert); // Выполняем подпись с помощью класса-помощника var Sign = Convert.ToBase64String(signHelper.GetSign(Data));
Отправка запроса и получение результата
Пример исходного кода: requestData – объект, содержащий исходные данные для выполнения запроса к системе; response – результат, который возвращает система.
// Отправляем запрос WebRequest webRequest = WebRequest.Create(url.Text); webRequest.Method = "POST"; webRequest.Timeout = 100000; webRequest.ContentType = "application/json"; var sentData = Encoding.UTF8.GetBytes(requestData.ToJson()); webRequest.ContentLength = sentData.Length; var sendStream = webRequest.GetRequestStream(); sendStream.Write(sentData, 0, sentData.Length); sendStream.Close(); WebResponse res = webRequest.GetResponse(); // Получаем результаты var ReceiveStream = res.GetResponseStream(); var sr = new StreamReader(ReceiveStream, Encoding.UTF8); var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd());
Запрос на проверку доступности платежной системы
Для проверки доступности платежной системы необходимо отправить запрос с Operation = 0 и с пустым полем Data на адрес платежной системы. В данном примере приведены все операции – от формирования запроса, до его подписи и отправки в систему. Пример исходного кода:
//Создаем запрос var request = new AbonentPaysystemRequest() { SignedData = new RequestSignedData() { ClientId = 1, Operation = OperationType.Check, }, ProtocolVersion = "v.1.0.0", Sign = "", }; //Подписываем var cert = new X509Certificate2(Path, Password); var signHelper = new RSASignHelper(cert); requestData.Sign = Convert.ToBase64String(signHelper.GetSign(requestData.SignedData.ToJson())); //Отправляем запрос WebRequest webRequest = WebRequest.Create(url.Text); webRequest.Method = "POST"; webRequest.Timeout = 100000; webRequest.ContentType = "application/json"; var sentData = Encoding.UTF8.GetBytes(requestData.ToJson()); webRequest.ContentLength = sentData.Length; var sendStream = webRequest.GetRequestStream(); sendStream.Write(sentData, 0, sentData.Length); sendStream.Close(); WebResponse res = webRequest.GetResponse(); //Получаем результаты var ReceiveStream = res.GetResponseStream(); var sr = new StreamReader(ReceiveStream, Encoding.UTF8); var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd());
Запрос на получение списка услуг
Пример исходного кода:
// Создаем запрос var request = new AbonentPaysystemRequest() { SignedData = new RequestSignedData() { ClientId = 1, Operation = OperationType.GetPaymentDestinations, }, ProtocolVersion = "v.1.0.0", Sign = "", }; // Подписываем ………… // Отправляем запрос ………… // Получаем результаты var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); // Отображаем результаты var paymentDestinations = PaymentDestinations.FromJson(response.SignedData.Data);
Запрос на получение информации по лицевому счету
Пример исходного кода:
//С оздаем запрос var request = new AbonentPaysystemRequest() { SignedData = new RequestSignedData() { ClientId = 1, Operation = OperationType.GetAccountInfo, }, ProtocolVersion = "v.1.0.0", Sign = "", }; // Формируем лицевой счет для запроса var account = new AbonentAccount() { Account = “00000000”, SupplierId = 1, }; // Передаем лицевой счет в запрос request.SignedData.Data = account.ToJson();
//Подписываем ………… //Отправляем запрос ………… //Получаем результаты var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd()); //Отображаем результаты var paymentDestinations = PaymentDestinations.FromJson(response.SignedData.Data);
Запрос на проведение платежа
Пример исходного кода:
// Создаем запрос var request = new AbonentPaysystemRequest() { SignedData = new RequestSignedData() { ClientId = 1, Operation = OperationType.GetAccountInfo, }, ProtocolVersion = "v.1.0.0", Sign = "", }; // Формируем платеж var pay = new Pay { Enlistments = new List<Enlistment>(), Id = Guid.NewGuid(), }; pay.PayDateTime = DateTime.Now; pay.Enlistments.Add(new Enlistment() { Account = PayAccount.Text, PaymentDestinationId = 1, PAmmount = 0, CAmmount = 0, Id = Guid.NewGuid(), }); // Передаем платеж в запрос request.SignedData.Data = pay.ToJson(); // Подписываем ………… // Отправляем запрос ………… // Получаем результаты var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd());
Запрос на проверку статуса платежа
Пример исходного кода:
// Создаем запрос var request = new AbonentPaysystemRequest() { SignedData = new RequestSignedData() { ClientId = 1, Operation = OperationType.GetAccountInfo, }, ProtocolVersion = "v.1.0.0", Sign = "", }; // Передаем ID платежа в запрос request.SignedData.Data = Id; //Подписываем ………… //Отправляем запрос ………… //Получаем результаты var response = AbonentPaysystemResponse.FromJson(sr.ReadToEnd());