Стpуктуpы в api функциях. Введение. Получение подробной информации об алфавите

API предназначен для обеспечения взаимодействия производителей услуг с программно-техническим комплексом “Экспресс Платежи”. Конфиденциальность передаваемых данных обеспечивается протоколом TLS 1.0. Аутентификация производителя услуг осуществляется по уникальному API-ключу (токену). Целостность передаваемых данных (защита от MITM-атак) обеспечивается с помощью цифровой подписи алгоритмом HMAC-SHA1, который описан в стандарте RFC 2104 . Дополнительная защита выполняется путем разграничения доступа ip-адресам программного комплекса производителя услуг.

Взаимодействие производителей услуг с программно-техническим комплексом “Экспресс Платежи” осуществляется на клиент-серверной технологии RESTful. Производитель услуг выступает в роли клиента, отправляет HTTP-запросы на сервер API. Возможно использование методов GET, POST, DELETE в HTTP-запросе. Данные передаются в кодировке UTF-8. В ответ на HTTP-запрос сервер отправляет HTTP-ответ клиенту в JSON-формате.

Формат запроса

  • {version} – версия API;
  • token={token} – API-ключ (токен) доступа к серверу, который задается в личном кабинете;
  • signature={hash} – цифровая подпись запроса, которая формируется на основании секретного слова (задается в личном кабинете) и передаваемых данных. Данное поле является опциональным.

Возможные коды валют:

  • 974 – BYR;
  • 933 – BYN;

Формат ответа

Любой ответ от сервера представлен в JSON-формате. В случае успешного выполнения запроса возвращается необходимый набор ключей и значений, предназначенный для конкретного ответа на запрос.

Пример ответа при успешном выполнении операции получения списка счетов: {"Items":[{ "InvoiceNo":7, "AccountNo":"70", "Status":1, "Created":"20150101120000", "Expiration":"20150201", "Amount":100000.0, "Currency":933 },{ "InvoiceNo":8, "AccountNo":"80", "Status":3, "Created":"20150201120000", "Expiration":"20150301", "Amount":110000.0, "Currency":933 } ]}

В случае выполнения операции с ошибкой возвращается JSON-узел Error, содержащий:

  • Code – код ошибки выполнения операции;
  • Msg – сообщение об ошибке;
  • MsgCode – код сообщения об ошибке.
Пример ответа при ошибки выполнения запроса представлен ниже: "Error": { "Code": 500, "Msg": "Отменить можно только тот счет, который находится в статусе \"Ожидание\"", "MsgCode": 5000000 } Возможные коды ошибок о выполнении операций:
  • 400 – некорректный запрос;
  • 404 – ресурс не найден;
  • 500 – внутренняя ошибка севера.
Возможные коды сообщений выполнения операции:
  • 4000003 – Некорректный запрос
  • 4040001 – Платеж не найден
  • 4040002 – Счет на оплату не найден
  • 5000000 – Внутренняя ошибка по умолчанию

Включение API

Для работы программного комплекса производителя услуг через API “Экспресс Платежи” необходимо в личном кабинете разрешить использование API.

Для этого необходимо в личном кабинете:

  1. Перейти на вкладку “Услуги”
  2. Разрешить использование API для услуги (см. рисунок).

Система ЕРИП

Просмотр списка счетов по параметрам

Метод возвращает список выставленных счетов. Если входные параметры не заданы, то метод возвращает выставленные счета на последние 30 дней.

Метод: GET

URL: https://api.?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Поле Тип Описание
InvoiceNo Integer Номер счета на оплату
AccountNo String(30) Номер лицевого счета
Status Integer Статус счета на оплату:
  • 1 - Ожидает оплату
  • 2 - Просрочен
  • 3 - Оплачен
  • 4 - Оплачен частично
  • 5 - Отменен
Created String(14) Дата выставления счета. Формат - yyyyMMddHHmmss
Expiration String(12)
Amount Decimal(19,2) Сумма счета на оплату
Currency Integer Код валюты
CardInvoiceNo Integer Номер счета по карте (не обязательное. Возвращается только в случае, если выполнялась оплата счета по карте.)

Пример

Private const string NumberInvoice = "1"; public static void GetListInvoices() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, //Параметры фильтра являются опциональными, по умолчанию возврщает значения за последние 30 дней {"AccountNo", NumberInvoice}, {"From", "20000101" }, {"To", "21000101" }, {"Status", "1" } }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "get-list-invoices"); var url = AppSettings.ServiceUrl + "invoices?token=" + AppSettings.Token + "&signature=" + signature + "&From=20000101&To=21000101&AccountNo=" + NumberInvoice + "&Status=1"; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(url); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Просмотр списка счетов по параметрам function getListInvoices($token, $fromDate = "", $toDate = "", $status = "", $accountNo = "") { global $baseUrl; $url = $baseUrl . "invoices?token=" . $token . "&From=" . $fromDate . "&To=" . $toDate . "&AccountNo=" . $accountNo . "&Status=" . $status; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // //Параметры фильтра являются опциональными, по умолчанию возвращает значения за последние 30 дней // "AccountNo" => $accountNo, // "From" => $fromDate, // "To" => $toDate, // "Status" => $status //); // $signature = computeSignature($requestParams, "", "get-list-invoices"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } // Пример использования echo getListInvoices("a75b74cbcfe446509e8ee874f421bd64");

Выставление счета

Метод выставляет новый счет.

Метод: POST

URL: https://api.?token={Token}


Входные параметры

Поле Тип Описание
Token String(32) API-ключ производителя услуг
AccountNo String(30) Номер лицевого счета
Amount Decimal(19,2) Сумма счета на оплату.
Currency Integer Код валюты
Expiration String(12) Дата истечения срока действия выставления счета на оплату.
Форматы – yyyyMMdd, yyyyMMddHHmm
Info String(1024) Назначение платежа
Surname String(30) Фамилия
FirstName String(30) Имя
Patronymic String(30) Отчество
City String(30) Город
Street String(30) Улица
House String(18) Дом
Building String(10) Корпус
Apartment String(10) Квартира
IsNameEditable Integer При оплате разрешено изменять ФИО плательщика
0 – нет, 1 – да
IsAddressEditable Integer При оплате разрешено изменять адрес плательщика
0 – нет, 1 – да
IsAmountEditable Integer При оплате разрешено изменять сумму оплаты
0 – нет, 1 – да
EmailNotification String(255) Адрес электронной почты, на который будет
отправлено уведомление о выставлении счета
SmsPhone String(13) Номер мобильного телефона, на который будет
отправлено SMS-сообщение о выставлении счета

Обязательные поля

При выставлении счетов с 1-го июля 2016 года необходимо передавать новый код валюты 933 (BYN). Выставление счетов со старым кодом валюты 974 (BYR) будет завершаться с ошибкой.


Выходные параметры

Пример

Public static void AddInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"AccountNo", "123456"}, {"Amount", "10,10"}, {"Currency", "933"}, {"Expiration", "20160505"}, {"Info", "info"}, {"Surname", "Ivanov"}, {"FirstName", "Ivan"}, {"Patronymic", "Ivanovich"}, {"City", "Minsk"}, {"Street", "Frunze"}, {"House", "20"}, {"Building", "2"}, {"Apartment", "10"}, {"IsNameEditable", "0"}, {"IsAddressEditable", "0"}, {"IsAmountEditable", "0"}, {"EmailNotification", "[email protected]"}, {"SmsPhone", "+375291234567"}, }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "add-invoice"); using (var client = new WebClient()) { var url = AppSettings.ServiceUrl + "invoices?token=" + AppSettings.Token + "&signature=" + signature; var response = client.UploadValues(url, new NameValueCollection { {"AccountNo", "123456"}, {"Amount", "10,10"}, {"Currency", "933"}, {"Expiration", "20160505"}, {"Info", "info"}, {"Surname", "Ivanov"}, {"FirstName", "Ivan"}, {"Patronymic", "Ivanovich"}, {"City", "Minsk"}, {"Street", "Frunze"}, {"House", "20"}, {"Building", "2"}, {"Apartment", "10"}, {"IsNameEditable", "0"}, {"IsAddressEditable", "0"}, {"IsAmountEditable", "0"}, {"EmailNotification", "[email protected]"}, {"SmsPhone", "+375291234567"}, }); var data = AppSettings.DefaultEncoding.GetString(response); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка POST запроса function sendRequestPOST($url, $params) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } //Выставление счета function addInvoice($token, $numberAccount, $amount, $currency, $expiration = "", $info = "", $surname = "", $firstName = "", $patronymic = "", $city = "", $street = "", $house="", $building = "", $apartment = "", $isNameEditable = "", $isAddressEditable = "", $isAmountEditable = "", $emailNotification = "", $smsPhone = "") { global $baseUrl; $url = $baseUrl . "invoices?token=" . $token; /* Использование цифровой подписи $requestParams = array("Token" => $token, "AccountNo" => $numberAccount, "Amount" => $amount, "Currency" => $currency, "Expiration" => $expiration, "Info" => $info, "Surname" => $surname, "FirstName" => $firstName, "Patronymic" => $patronymic, "City" => $city, "Street" => $street, "House" => $house, "Building" => $building, "Apartment" => $apartment, "IsNameEditable" => $isNameEditable, "IsAddressEditable" => $isAddressEditable, "IsAmountEditable" => $isAmountEditable, "EmailNotification" => $emailNotification, "SmsPhone" => $smsPhone); $signature = computeSignature($requestParams, "", "add-invoice"); $url .= "&signature=" . $signature; */ $requestParams = array("AccountNo" => $numberAccount, "Amount" => $amount, "Currency" => $currency, "Expiration" => $expiration, "Info" => $info, "Surname" => $surname, "FirstName" => $firstName, "Patronymic" => $patronymic, "City" => $city, "Street" => $street, "House" => $house, "Building" => $building, "Apartment" => $apartment, "IsNameEditable" => $isNameEditable, "IsAddressEditable" => $isAddressEditable, "IsAmountEditable" => $isAmountEditable, "EmailNotification" => $emailNotification, "SmsPhone" => $smsPhone); return sendRequestPOST($url, $requestParams); } // Пример использования echo addInvoice("a75b74cbcfe446509e8ee874f421bd64", 1, "10,10", 933);

Детальная информация о счете

Метод возвращает детальную информацию о существующем счете.

Метод: GET

URL:


Входные параметры

Обязательные поля

Выходные параметры

Поле Тип Описание
AccountNo String(30) Номер лицевого счета
Status Integer Статус счета на оплату:
  • 1 - Ожидает оплату
  • 2 - Просрочен
  • 3 - Оплачен
  • 4 - Оплачен частично
  • 5 - Отменен
Created String(14) Дата/Время выставления счета. Формат - yyyyMMddHHmmss
Expiration String(12) Дата истечения срока действия выставления счета на оплату.
Форматы – yyyyMMdd, yyyyMMddHHmm
Amount Decimal(19,2) Сумма счета на оплату
Currency Integer Код валюты
Info String(1024) Назначение платежа
Surname String(30) Фамилия
FirstName String(30) Имя
Patronymic String(30) Отчество
City String(30) Город
Street String(30) Улица
House String(18) Дом
Building String(10) Корпус
Apartment String(10) Квартира
IsNameEditable Integer При оплате разрешено изменять ФИО плательщика 0 – нет, 1 – да
IsAddressEditable Integer При оплате разрешено изменять адрес плательщика 0 – нет, 1 – да
IsAmountEditable Integer При оплате разрешено изменять сумму оплаты 0 – нет, 1 – да

Пример

Private const string NumberInvoice = "1"; public static void GetDetailsInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"Id", NumberInvoice} }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "get-details-invoice"); using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(AppSettings.ServiceUrl + "invoices/" + NumberInvoice + "?token=" + AppSettings.Token + "&signature=" + signature); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Детальная информация о счете function getDetailsInvoice($numberInvoice, $token) { global $baseUrl; $url = $baseUrl . "invoices/" . $numberInvoice . "?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // "Id" => $numberInvoice //); // $signature = computeSignature($requestParams, "", "get-details-invoice"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } //Пример использования getDetailsInvoice(1, "a75b74cbcfe446509e8ee874f421bd64");

Статус счета

Метод возвращает текущий статус счета.

Метод: GET

URL: https://api./{InvoiceNo}/status?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Пример

Private const string NumberInvoice = "1"; public static void GetStatusInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"Id", NumberInvoice} }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "status-invoice"); var url = AppSettings.ServiceUrl + "invoices/" + NumberInvoice + "/status?token=" + AppSettings.Token + "&signature=" + signature; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(url); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Статус счета function getStatusInvoice($numberInvoice, $token) { global $baseUrl; $url = $baseUrl . "invoices/" . $numberInvoice . "/status?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // "Id" => $numberInvoice //); // $signature = computeSignature($requestParams, "", "status-invoice"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } //Пример использования echo getStatusInvoice(1, "a75b74cbcfe446509e8ee874f421bd64");

Отменить счет

Метод отменят счет к оплате. Операция возможна только для счетов со статусом “Ожидает оплату”.

Метод: DELETE

URL: https://api./{InvoiceNo}?token={Token}


Входные параметры

Обязательные поля

Пример

Private const string NumberInvoice = "1"; public static void CancelInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"Id", NumberInvoice} }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "cancel-invoice"); var url = AppSettings.ServiceUrl + "invoices/" + NumberInvoice + "?token=" + AppSettings.Token + "&signature=" + signature; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.UploadString(url, "DELETE", string.Empty); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка DELETE запроса function sendRequestDELETE($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Отменить счет function cancelInvoice($numberInvoice, $token) { global $baseUrl; $url = $baseUrl . "invoices/" . $numberInvoice . "?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // "Id" => $numberInvoice //); // $signature = computeSignature($requestParams, "", "cancel-invoice"); // $url .= "&signature=" . $signature; return sendRequestDELETE($url); } //Пример использования echo cancelInvoice(1, "a75b74cbcfe446509e8ee874f421bd64");

Получить список оплат

Метод возвращает список полученных оплат. Если входные параметры запроса не заданы, то метод возвращает список полученных оплат за последние 30 дней.

Метод: GET

URL: https://api.?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Пример

Private const string NumberPayment = "1022"; public static void GetListPayments() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, // Параметры фильтра являются опциональными. По умолчанию возвращает значения за последние 30 дней {"AccountNo", NumberPayment}, {"From", "20000101" }, {"To", "21000101" } }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "get-list-payments"); var url = AppSettings.ServiceUrl + "payments?token=" + AppSettings.Token + "&signature=" + signature + "&From=20000101&To=21000101&AccountNo=" + NumberPayment; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(url); Console.WriteLine(data); } }

Private static $baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса private static function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Получить список оплат public static function getListPayments($token, $fromDate = "", $toDate = "", $numberPayment = "") { global $baseUrl; $url = $baseUrl . "payments?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // //Параметры фильтра являются опциональными, по умолчанию возвращает значения за последние 30 дней // "AccountNo" => $numberPayment, // "From" => $fromDate, // "To" => $toDate, //); // $signature = computeSignature($requestParams, "", "get-list-payments"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } //Пример использования echo getListPayments("a75b74cbcfe446509e8ee874f421bd64");

Детальная информация об оплате

Метод возвращает детальную информацию о полученной оплате

Метод: GET

URL: https://api./{PaymentNo}?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Пример

Private const string NumberPayment = "1022"; public static void GetDetailsPayment() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"Id", NumberPayment} }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "get-details-payment"); using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(AppSettings.ServiceUrl + "payments/" + NumberPayment + "?token=" + AppSettings.Token + "&signature=" + signature); Console.WriteLine(data); } }

Private static $baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса private static function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Детальная информация об оплате function getDetailPayment($token, $numberPayment) { global $baseUrl; $url = $baseUrl . "payments/" . $numberPayment . "?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // "Id" => $numberPayment //); // $signature = computeSignature($requestParams, "", "get-details-payment"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } //Пример использования echo getDetailPayment("a75b74cbcfe446509e8ee874f421bd64", 1);

Интернет-эквайринг

Выставление счета по карте

Метод выставляет новый счет для оплаты через банковскую карту.

Метод: POST

URL: https://api.?token={Token}


Входные параметры

Поле Тип Описание
Token String(32) API-ключ производителя услуг
AccountNo String(30) Номер лицевого счета
Expiration String(8) Дата истечения срока действия выставленного счета на оплату. Формат - yyyyMMdd
Amount Decimal(19,2) Сумма счета на оплату. Сумма счета должна быть не менее 1,00 BYN.
Разделителем дробной и целой части является символ запятой
Currency Integer Код валюты
Info String(1024) Назначение платежа
ReturnUrl String(512) Адрес для перенаправления пользователя в случае успешной оплаты
FailUrl String(512) Адрес для перенаправления пользователя в случае неуспешной оплаты
Language String(2) Язык в кодировке ISO 639-1. Если не указан, будет использован язык по умолчанию
SessionTimeoutSecs Integer Продолжительность сессии в секундах.
В случае если параметр не задан, будет использовано значение 1200 секунд (20 минут).
Если в запросе присутствует параметр ExpirationDate, то значение параметра SessionTimeoutSecs не учитывается.
ExpirationDate String(32) Время жизни заказа. Формат yyyyMMddHHmmss. Если этот параметр не передаётся в запросе, то для определения времени жизни сессии используется SessionTimeoutSecs.

Обязательные поля

Выходные параметры

Пример

Public static void AddCardInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"AccountNo", "123456"}, {"Expiration", "20161224"}, {"Amount", "10,10"}, {"Currency", "933"}, {"Info", "info"}, {"ReturnUrl", "https://example.com/success"}, {"FailUrl", "https://example.com/fail"}, {"Language", "ru"}, {"SessionTimeoutSecs", "2000"}, {"ExpirationDate", "20161224235001"}, }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "add-card-invoice"); using (var client = new WebClient()) { var url = AppSettings.ServiceUrl + "cardinvoices?token=" + AppSettings.Token + "&signature=" + signature; var response = client.UploadValues(url, new NameValueCollection { {"AccountNo", "123456"}, {"Expiration", "20161224"}, {"Amount", "10,10"}, {"Currency", "933"}, {"Info", "info"}, {"ReturnUrl", "https://example.com/success"}, {"FailUrl", "https://example.com/fail"}, {"Language", "ru"}, {"SessionTimeoutSecs", 2000}, {"ExpirationDate", "20161224235001"}, }); var data = AppSettings.DefaultEncoding.GetString(response); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка POST запроса function sendRequestPOST($url, $params) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } //Выставление счета по карте function addInvoiceByCard($token, $accountNo, $amount, $currency, $info, $returnUrl, $failUrl, $expiration="", $language="", $pageView="", $sessionTimeoutSecs="", $expirationDate="") { global $baseUrl; $url = $baseUrl . "cardinvoices?token=" . $token; /*$requestParams = array("Token" => $token, "AccountNo" => $accountNo, "Expiration" => $expiration, "Amount" => $amount, "Currency" => $currency, "Info" => $info, "ReturnUrl" => $returnUrl, "FailUrl" => $failUrl, "Language" => $language, "SessionTimeoutSecs" => $sessionTimeoutSecs, "ExpirationDate" => $expirationDate);*/ // Использование цифровой подписи // $signature = computeSignature($requestParams, "", "add-card-invoice"); // $url .= "&signature=" . $signature; $requestParams = array("AccountNo" => $accountNo, "Expiration" => $expiration, "Amount" => $amount, "Currency" => $currency, "Info" => $info, "ReturnUrl" => $returnUrl, "FailUrl" => $failUrl, "Language" => $language, "SessionTimeoutSecs" => $sessionTimeoutSecs, "ExpirationDate" => $expirationDate); return sendRequestPOST($url, $requestParams); } // Пример использования echo addInvoiceByCard("a75b74cbcfe446509e8ee874f421bd64", "123456", "10,10", 933, "info", "https://example.com/success", "https://example.com/fail","20161224", "ru", 2000, "20161224235001");

Форма оплаты

Метод инициирует оплату по банковской карте и возвращает адрес для формы ввода данных банковской карты. Для оплаты выставленного счета необходимо передать в метод InvoiceId, полученный при вызове метода “Выставление счета по карте”.
После ввода данных банковской карты и успешного проведения платежа пользователь будет перенаправлен на адрес ReturnUrl, указанный при выставлении счета по карте. В случае ошибки проведения платежа пользователь будет перенаправлен на адрес FailUrl.

Метод: GET

URL: https://api./{CardInvoiceNo}/payment?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Пример

Private const string CardNumberInvoice = "100"; public static void PaymentCardInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"CardInvoiceNo", CardNumberInvoice}, }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "card-invoice-form"); var url = AppSettings.ServiceUrl + "cardinvoices/" + CardNumberInvoice + "/payment?token="+AppSettings.Token+"&signature="+signature; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(url); Console.WriteLine(data); } }

Private static $baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса private static function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Форма оплаты function getPaymentForm($token, $cardNumberInvoice) { global $baseUrl; $url = $baseUrl . "cardinvoices/" . $cardNumberInvoice . "/payment?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // "CardInvoiceNo" => $cardNumberInvoice //); // $signature = computeSignature($requestParams, "", "card-invoice-form"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } //Пример использования echo getPaymentForm("a75b74cbcfe446509e8ee874f421bd64","100");

Статус счета по карте

Метод возвращает статус счета по карте.

Метод: GET

URL: https://api./{CardInvoiceNo}/status?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Пример

Private const string CardNumberInvoice = "1674"; public static void StatusCardInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"CardInvoiceNo", CardNumberInvoice}, {"Language", "ru"}, }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "status-card-invoice"); var url = AppSettings.ServiceUrl + "cardinvoices/" + CardNumberInvoice + "/status?token=" + AppSettings.Token + "&signature=" + signature + "&language=ru"; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var data = client.DownloadString(url); Console.WriteLine(data); } }

Private static $baseUrl = "https://api.express-pay.by/v1/"; // Отправка GET запроса private static function sendRequestGET($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Статус счета по карте function getStatusCardInvoice($token, $InvoiceId, $language="") { global $baseUrl; $url = $baseUrl . "cardinvoices/" . $InvoiceId . "/status?token=" . $token; // Использование цифровой подписи // $requestParams = array(// "Token" => $token, // "CardInvoiceNo" => $InvoiceId, // "Language" => "ru" //); // $signature = computeSignature($requestParams, "", "status-card-invoice"); // $url .= "&signature=" . $signature; return sendRequestGET($url); } //Пример использования echo getStatusCardInvoice("a75b74cbcfe446509e8ee874f421bd64", "1674");

Отмена счета по карте

Метод отменяет оплату счета по карте. Использование операции отмены возможно до 23:59:59 дня проведения операции (не позднее). Для разрешения использования данной операции в анкете реквизитов услуги ЕРИП в разделе "Предоставление возможности плательщику отменить платеж" необходимо выставить опцию "Разрешить до перечисления денежных средств банком".

Метод: POST

URL: https://api./{CardInvoiceNo}/reverse?token={Token}


Входные параметры

Обязательные поля

Выходные параметры

Пример

Private const string CardNumberInvoice = "1674"; public static void ReverseCardInvoice() { var requestParams = new Dictionary { {"Token", AppSettings.Token}, {"CardInvoiceNo", CardNumberInvoice} }; var signature = SignatureHelper.Compute(requestParams, string.Empty, "reverse-card-invoice"); var url = AppSettings.ServiceUrl + "cardinvoices/" + CardNumberInvoice + "/reverse?token=" + AppSettings.Token + "&signature=" + signature; using (var client = new WebClient()) { client.Encoding = AppSettings.DefaultEncoding; var response = client.UploadValues(url, new NameValueCollection()); var data = AppSettings.DefaultEncoding(response); Console.WriteLine(data); } }

$baseUrl = "https://api.express-pay.by/v1/"; // Отправка POST запроса function sendRequestPOST($url, $params) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Отмена счета по карте function reverseCardInvoice($token, $invoiceId) { global $baseUrl; $url = $baseUrl . "cardinvoices/" . $invoiceId . "/reverse?token=" . $token; $requestParams = array("Token" => $token, "CardInvoiceNo" => $invoiceId); // Использование цифровой подписи // $signature = computeSignature($requestParams, "", "reverse-card-invoice"); // $url .= "&signature=" . $signature; return sendRequestPOST($url, $requestParams); } //Пример использования echo reverseCardInvoice("a75b74cbcfe446509e8ee874f421bd64", "1674");

Уведомления на сайт

Уведомления на сайт предназначены для вызова специального адреса сайта производителя услуг. При использовании такого способа получения уведомлений нет необходимости постоянно опрашивать поступившие платежи через . Такой способ получения уведомлений снижает нагрузку на серверы и увеличивает скорость доставки уведомлений о платежах.

Вызов адреса сайта происходит в момент совершения платежа в адрес производителя услуг или при изменении статуса счета на оплату. Вызываемый адрес сайта указывается в настройках личного кабинета.

Для этого необходимо выполнить следующие операции:

  1. Перейти в раздел настройки (пункт меню “Настройка”);
  2. Перейти на вкладку “Услуги”;
  3. В списке услуг для нужной услуги перейти на “Уведомления”;
  4. Установить опцию “Получать уведомления об оплате на URL”;
  5. Указать адрес вызова сайта производителя услуг в поле “URL для уведомлений” вида https://mydomain.by/express-pay/notification (см. рисунок).


Во всех запросах передаются обязательные параметры:

  • Data – информация о платеже в JSON-формате (поступление нового платежа, отмена платежа, изменение статуса счета);
  • Signature={hash} – цифровая подпись запроса, которая формируется на основании секретного слова (задается в личном кабинете) и передаваемых данных. Данный параметр передается в случае установки опции “Применять цифровую подпись”.

Сайт производителя услуг должен ответить HTTP-кодом 200 в случае успешной обработки запроса. Если сайт производителя услуг вернет код ответа отличный от 200 или истечет таймаут ожидания ответа, то будет выполнена повторная попытка доставки уведомления. Для обеспечения гарантированной доставки уведомления выполняется 3 дополнительных попытки доставки уведомлений. Первая попытка доставки выполняется через 3 минуты, вторая через 30 минут, третья через 90 минут.

В случае не успешных попыток доставки всех 4-х уведомлений по платежу на адрес электронной почты производителя услуг направляется письмо с отчетом об ошибочных доставках.

При включении опции “Применять цифровую подпись” будет формироваться цифровая подпись для передаваемых данных, которая позволяет контролировать целостность передаваемых данных (защита от MITM-атак). Цифровая подпись основана на алгоритме HMAC-SHA1, который описан в стандарте RFC 2104 .

Параметр “Таймаут ожидания ответа” устанавливает время, которое сервер “Экспресс Платежи” будет ожидать ответа от сайта производителя услуг. Если в течение данного времени сервер производителя услуг не вернет ответ с HTTP-кодом 200, то попытка доставки уведомления считается неудачной.

Параметры уведомления о платежах

Поле Тип Описание
CmdType Integer Тип уведомления:
  • 1 - Поступление нового платежа
  • 2 - Отмена платежа
  • 3 - Изменение статуса счета
Status Integer Статус счета на оплату:
  • 1 - Ожидает оплату
  • 2 - Просрочен
  • 3 - Оплачен
  • 4 - Оплачен частично
  • 5 - Отменен
Опциональное поле. Возвращается только в уведомления типа 3.
AccountNo String(30) Номер лицевого счета
InvoiceNo String(30) Номер измененного счета в системе “Экспресс Платежи”
PaymentNo Integer Номер платежа
Amount Decimal(19,2) Сумма оплаты (разделитель между целой и дробной частью ",")
Created String(14) Дата оплаты (Формат - yyyyMMddHHmmss)
Service String(258) Название услуги
Payer String(258) ФИО плательщика
Address String(258) Адрес плательщика

Пример передаваемых данных при получении нового платежа: { "CmdType":1, "PaymentNo":1082, "AccountNo":1024, "Amount":"20000", "Created":"20160217122109", "Service":"mydomain.by", "Payer":"", "Address":"" } Пример передаваемых данных при отмене платежа: { "CmdType":2, "PaymentNo":1082, "AccountNo":1024, "Amount":"20000", "Created":"20160217122203", "Service":"mydomain.by", "Payer":"", "Address":"" } Пример передаваемых данных при изменении статуса счета: { "CmdType":3, "Status":3, "AccountNo":"147221", "InvoiceNo":17645, "Amount":"16", "Created":"20161130125859", "Service":"10ballov.by", "Payer":"", "Address":"" }

При нажатии кнопки “Тестовое уведомление на URL” выполняется доставка тестового уведомления о платеже на адрес производителя услуг, по которому можно проверить прием платежа сайтом производителя услуг.

Пример исходного кода получения данных от сервера

Namespace EripNotify.Models { public class EripNotify { public string Data { get; set; } public string Signature { get; set; } } } namespace EripNotify.Controllers { public class EripNotifyController: ApiController { private static readonly Encoding HashEncoding = Encoding.UTF8; private string _secretWord = "secretWord"; private bool _useSignature = false; public IHttpActionResult Test(Models.EripNotify model) { if (_useSignature) { // Проверяем цифровую подпись if (model.Signature != ComputeSignature(model.Data, _secretWord)) { // NOTE: Добавить обработку ошибки // ... return InternalServerError(); } } // Преобразуем из JSON в Object var obj = JObject.Parse(model.Data); // NOTE: Выполняем действия с полученным объектом // ... return Ok(); } // Функция генерации и проверки цифровой подписи public string ComputeSignature(string json, string secretWord) { var hmac = string.IsNullOrWhiteSpace(secretWord) ? new HMACSHA1(HashEncoding.GetBytes(string.Empty)) : new HMACSHA1(HashEncoding.GetBytes(secretWord)); var hash = hmac.ComputeHash(HashEncoding.GetBytes(json)); var result = new StringBuilder(); foreach (var item in hash) result.Append(item.ToString("X2")); return result.ToString(); } } }

// Секретное слово указывается в настройках личного кабинета $secretWord = "secretWord"; // Использование цифровой подписи указывается в настройках личного кабинета $isUseSignature = true; // Обработка POST запроса if ($_SERVER["REQUEST_METHOD"] === "POST") { $data = $_POST["Data"]; $signature = $_POST["Signature"]; // Проверяем использование цифровой подписи if($isUseSignature) { // Проверяем цифровую подпись if($signature == computeSignature($data, $secretWord)) { // Преобразуем из JSON в Object $data = json_decode($data); // NOTE: Добавить обработку данных о полученном платеже // ... echo "success"; } else { echo "fail signature"; } } else { // Без использования цифровой подписи // Преобразуем из JSON в Object $data = json_decode($data); // NOTE: Добавить обработку данных о полученном платеже // ... echo "success"; } } // Функция генерации и проверки цифровой подписи function computeSignature($json, $secretWord) { $hash = NULL; if (empty(trim($secretWord))) $hash = strtoupper(hash_hmac("sha1", $json, "")); else $hash = strtoupper(hash_hmac("sha1", $json, $secretWord)); return $hash; }

Цифровая подпись

Формирование цифровой подписи для передаваемых данных обеспечивает целостность информации и гарантирует, что передаваемые данные не были изменены посторонними лицами в процессе передачи. Цифровая подпись данных осуществляется с помощью алгоритма HMAC-SHA1, который описан в стандарте RFC 2104 .

При использовании цифровой подписи для запросов на сервер необходимо объединить все параметры запроса в одну строку в строго определенном порядке. Для объединенной строки необходимо рассчитать цифровую подпись, которая указывается при запросе в параметре signature . Сервер при получении входящего запроса выполняет проверку цифровой подписи (параметра signature ) и параметров запроса.

Пример формирования строки запроса при использовании цифровой подписи для получения списка счетов: https://api.?token={Token}&signature={Hash} .

Для усиления безопасности возможно формирование цифровой подписи с помощью секретного слова, которое известно только серверу и клиенту. Чтобы задать секретное слово, необходимо выполнить следующие операции в личном кабинете:

  1. Перейти в раздел настройки (пункт меню “Настройка”);
  2. Перейти на вкладку “Услуги”
  3. В списке услуг для нужной услуги перейти к настройкам API;
  4. Укажите секретное слово и никому его не передавайте (см. рисунок).

В случае успешной проверки выполняется обработка запроса. Если параметры запроса не соответствуют цифровой подписи, то отсылается уведомление об ошибке и запрос не обрабатывается сервером.

Порядок следования параметров запросов следующий:

  1. Добавление счета "token", "accountno", "amount", "currency", "expiration", "info", "surname", "firstname", "patronymic", "city", "street", "house", "building", "apartment", "isnameeditable", "isaddresseditable", "isamounteditable"
  2. Детальная информация счета "token", "id"
  3. Отменить счет "token", "id"
  4. Статус счета "token", "id"
  5. Список счетов "token", "from", "to", "accountno", "status"
  6. Список платежей "token", "from", "to", "accountno"
  7. Детали по платежу "token", "id"
  8. Выставление счета по карте "token", "accountno", "expiration", "amount", "currency", "info", "returnurl", "failurl", "language", "sessiontimeoutsecs", "expirationdate"
  9. Форма оплаты "token", "CardInvoiceNo"
  10. Статус счета по карте "token", "CardInvoiceNo", "language"
  11. Отмена счета по карте "token", "CardInvoiceNo"

Примечание: Разделителем целой и дробной части в сумме (параметр amount) является запятая.

Namespace ExPay.Api { public static class AppSettings { public const string ServiceUrl = "https://api.express-pay.by/v1/"; public const string Token = "a75b74cbcfe446509e8ee874f421bd63"; // API-ключ public static readonly Encoding DefaultEncoding = Encoding.UTF8; } public static class SignatureHelper { private static readonly Encoding HashEncoding = Encoding.UTF8; // Порядок следования полей при вычислении цифровой подписи. // Внимание! Для корректной работы порядок изменять нельзя private static readonly Dictionary Mapping = new Dictionary { { "add-invoice", new { "token", "accountno", "amount", "currency", "expiration", "info", "surname", "firstname", "patronymic", "city", "street", "house", "building", "apartment", "isnameeditable", "isaddresseditable", "isamounteditable" } }, { "get-details-invoice", new { "token", "id" } }, { "cancel-invoice", new { "token", "id" } }, { "status-invoice", new { "token", "id" } }, { "get-list-invoices", new { "token", "from", "to", "accountno", "status" } }, { "get-list-payments", new { "token", "from", "to", "accountno" } }, { "get-details-payment", new { "token", "id" } }, { "add-card-invoice", new { "token", "accountno", "expiration", "amount", "currency", "info", "returnurl", "failurl", "language", "pageview", "sessiontimeoutsecs", "expirationdate" } }, { "card-invoice-form", new { "token", "CardInvoiceNo" } }, { "status-card-invoice", new { "token", "CardInvoiceNo", "language" } }, { "reverse-card-invoice", new { "token", "CardInvoiceNo" } } }; public static string Compute(Dictionary requestParams, string secretWord, string action) { var normalizedParams = requestParams .ToDictionary(k => k.Key.ToLower(), v => v.Value); var cmdFields = Mapping; var builder = new StringBuilder(); foreach (var cmdField in cmdFields) { if (normalizedParams.ContainsKey(cmdField)) builder.Append(normalizedParams); } HMACSHA1 hmac; if (string.IsNullOrWhiteSpace(secretWord)) { // В алгоритме всегда должно быть задан ключ шифрования. Если используется конструктор по умолчанию, то ключ генерируется автоматически, // что нам не подходит hmac = new HMACSHA1(HashEncoding.GetBytes(string.Empty)); } else { hmac = new HMACSHA1(HashEncoding.GetBytes(secretWord)); } var hash = hmac.ComputeHash(HashEncoding.GetBytes(builder.ToString())); var result = new StringBuilder(); foreach (var item in hash) { result.Append(item.ToString("X2")); } return result.ToString(); } } }

// Формирование цифровой подписи function computeSignature($requestParams, $secretWord, $method) { $normalizedParams = array_change_key_case($requestParams, CASE_LOWER); $mapping = array("add-invoice" => array("token", "accountno", "amount", "currency", "expiration", "info", "surname", "firstname", "patronymic", "city", "street", "house", "building", "apartment", "isnameeditable", "isaddresseditable", "isamounteditable"), "get-details-invoice" => array("token", "id"), "cancel-invoice" => array("token", "id"), "status-invoice" => array("token", "id"), "get-list-invoices" => array("token", "from", "to", "accountno", "status"), "get-list-payments" => array("token", "from", "to", "accountno"), "get-details-payment" => array("token", "id"), "add-card-invoice" => array("token", "accountno", "expiration", "amount", "currency", "info", "returnurl", "failurl", "language", "pageview", "sessiontimeoutsecs", "expirationdate"), "card-invoice-form" => array("token", "CardInvoiceNo"), "status-card-invoice" => array("token", "CardInvoiceNo", "language"), "reverse-card-invoice" => array("token", "CardInvoiceNo")); $apiMethod = $mapping[$method]; $result = ""; foreach ($apiMethod as $item){ $result .= $normalizedParams[$item]; } $hash = strtoupper(hash_hmac("sha1", $result, $secretWord)); return $hash; }

Тестовый стенд

При тестировании API вместо адреса необходимо использовать адрес тестового стенда . В качестве тестовых данных используйте данные, приведенные ниже.

URL: https://sandbox-api.сайт/v1/


Тестовые API ключи (токены)

Система ЕРИП

Тестовые счета на оплату

Номер услуги API ключ Номер счета на оплату Номер лицевого счета Дата выставления счета Статус
3 1 10 01-01-2015 12:00 Ожидает оплаты
3 2 20 01-02-2015 12:00 Оплачен
3 3 30 01-03-2015 12:00 Оплачен частично
3 4 40 01-04-2015 12:00 Ожидает оплаты
3 5 50 01-05-2015 12:00 Оплачен частично
3 6 60 01-06-2015 12:00 Отменен
2 7 70 01-01-2015 12:00 Ожидает оплаты
2 8 80 01-02-2015 12:00 Оплачен
2 9 90 01-03-2015 12:00 Оплачен частично
2 10 100 01-04-2015 12:00 Ожидает оплаты
2 11 110 01-05-2015 12:00 Оплачен частично
2 12 120 01-06-2015 12:00 Отменен

Тестовые платежи

Номер услуги API ключ Номер платежа Номер лицевого счета Дата платежа
3 1 10 01-01-2015 12:00
3 2 20 01-02-2015 12:00
3 3 30 01-03-2015 12:00
2 4 40 01-04-2015 12:00
2 5 50 01-05-2015 12:00
2 6 60 01-06-2015 12:00

Интернет-эквайринг

Тестовые счета на оплату банковской картой

  • Tutorial

Удобство работы с любым API во многом зависит от того, как написана и оформлена его документация. Cейчас мы ведём работу по стандартизации и унификации описания всех наших API, и вопросы документирования для нас особенно актуальны.
После долгих поисков мы решили оформлять документацию в формате RAML . Так называется специализированный язык для описания REST API. О его возможностях и преимуществах мы расскажем в этой статье.

Почему RAML

Как нужно документировать API? Вопрос этот не так прост, как может показаться на первый взгляд.
Первый и самый простой вариант, который приходит на ум — представить описание к API в виде обычного текстового документа. Так делают очень многие (в том числе и очень известные компании). Мы тоже не раз пользовались этим способом. При всей своей простоте он обладает следующими недостатками:
  • текстовую документацию сложно поддерживать в актуальном состоянии;
  • зачастую словесные описания API оказываются недостаточно наглядными;
  • сфера использования «словесной» документации очень ограничена (например, на её основе нельзя сгенерировать интерактивную тестовую страницу).
Чтобы упростить процесс документирования, можно использовать специализированные инструменты и сервисы. Как правило, они генерируют документацию на основе описания в некотором стандартизованном формате — обычно это JSON или Markdown.

Ни один из этих форматов для написания документации не подходит. JSОN был изначально создан для обмена данными в вебе. При использовании его для других целей поневоле приходится прибегать к помощи «костылей» — например, кастомных полей, начинающихся со знака $. Кроме того, составлять описания в формате JSON вручную — дело достаточно рутинное и утомительное (в особенности если речь идёт об описаниях большого размера).

На описанные выше трудности обращали внимание многие пользователи популярного инструмента Swagger . Вскоре разработчики Swagger решили упростить работу по написанию спецификаций и создали фирменный редактор с поддержкой формата YAML.

Конечно, YAML гораздо удобнее, чем JSON. Но и его использование сопряжено с определёнными трудностями. Дело в том, что в описаниях API всегда имеются повторяющиеся элементы (например, схема ответа, которая может быть одинаковой для разных типов HTTP-запросов), которые приходится всякий раз прописывать вручную. Вот если бы можно их было раз и навсегда прописать в отдельном файле и ссылаться на него в случае небходимости… Но, увы, пока что такой возможности нет.

Что касается формата Markdown (он используется, например, в API BluePrint), то предназначен в первую очередь для оформления текста, а не для использования в качестве основы для генерирования. Приспособить его под документирование API очень сложно. По этой же причине не привели к каким-либо заметным результатам попытки cоздать формат описания API на базе XML — например, язык WADL (Web Application Desription Language), разработанный компанией Sun Microsystems ещё в 2009 году, но так и не получивший широкого распространения.

Создатели проекта RAML (эта аббревиатура означает RESTful API Modeling Language — язык для моделирования REST API) предприняли попытку разработать язык, предназначенный исключительно для описания API и исправить недочёты, свойственные другим форматам. Первая версия спецификации RAML была опубликована в 2013 году. Основным разработчиком RAML является компания MuleSoft; в проекте также принимают участие представители таких известных компаний, как Cisco, PayPal, ВoxInc. и других.

Несомненными преимуществами RAML являются:

  • простой и логичный синтаксис, основанный на формате YAML;
  • поддержка наследования и возможность подключения внешних файлов спецификаций.
Дополнительным плюсом является наличие большого количества конвертеров, парсеров и генераторов интерактивной документации. О некоторых из них мы расскажем ниже, а пока перейдём к обзору особенностей синтаксиса RAML.

Краткое введение в RAML

Структура документа

Файл спецификаций на RAML состоит из следующих структурных элементов:
  • вводная часть («шапка»);
  • схема безопасности;
  • описание профилей;
  • описание объектов и методов;
  • описание ответов.
Рассмотрим эти элементы подробнее.

Вводная часть

Каждый документ на RAML начинается с вводной части, которая включает четыре обязательных элемента:
  • версия RAML;
  • имя документа;
  • URI, по которому доступен API;
  • версия API, описываемая в документации.
Выглядит это так:

#% RAML 0.8 title: Example API baseUri: http://api.example.com/{version} version: v1
Вводная часть может также включать различную дополнительную информацию — например, сведения об используемом протоколе для связи с API:

Protocols:
Можно во вводной части прописать и метаданные файла документации:

Documentation - title: Home content: | API Test Documentation

Схемы безопасности

Чтобы начать работать с любым API, нужно пройти процедуру авторизации. Она может осуществляться разными способами: через OAuth, с помощью токенов, либо посредством простой HTTP-аутентификации. Для описания этой процедуры в RAML используются схемы безопасности (security schemes).
Рассмотрим в качестве примера, как описывается авторизация с использованием протокола OAuth2:
#%RAML 0.8 title: Example API version: 1 baseUri: https://api.example.com/{version} securedBy: securitySchemes: - oauth_2_0: type: OAuth 2.0 describedBy: headers: Authorization: type: string queryParameters: access_token: type: string responses: 401: description: | Bad or expired token. 403: description: | Bad OAuth request settings: authorizationUri: https://example.com/oauth/authorize accessTokenUri: https://example.com/oauth/token authorizationGrants: [ code, token ]
Приведённый фрагмент содержит следующую информацию:
  • в параметре type указывается, что в API используется авторизация по протоколу OAuth2;
  • далее указывается, что авторизационные данные можно передавать либо в заголовке Authorization, либо в query-параметре access_token;
  • после этого следуют возможные коды ответов и их описания;
  • в конце раздела, в секции settings указываются URL для авторизации, URL для получения токена, а также необходимые для аутентификации параметры (authorization grants).
Для удобства схемы безопасности можно сохранять в отдельных файлах.raml или.yml, и затем обращаться к ним в случае необходимости:

#%RAML 0.8 title: Example API version: 1 baseUri: https://api.example.com/{version} securedBy: securitySchemes: - oauth_2_0: !include oauth_2_0.yml
Это помогает ускорить процесс документирования, избежать лишних повторений и сделать документацию менее громоздкой.

Объекты и методы

Далее перечисляются основные объекты и пути к ним, а также HTTP-методы, которые используются с этими объектами:

/document get: put: post: /{documentId} get: delete:
В приведённом примере описывается API, с помощью которого можно работать с документами. Мы можем скачивать документы на локальную машину (GET), изменять cуществующие документы (PUT) и загружать новые (POST). С каждым отдельным документом ({documentId}) мы можем также выполнять следующие операции: загрузка на локальную машину (GET) и удаление (DELETE).
HTTP-заголовки, используемые с тем или иным методом, описываются при помощи свойства headers, например:

/documents get headers: X-Auth-Token: required: true
Обратите внимание на свойство required: оно указывает, является ли заголовок обязательным (true) или необязательным (false).
В описании объектов и методов могут использоваться многочисленные дополнительные параметры. Рассмотрим следующий пример:

/document /{documentId} uriParameters: id: description: document identification number type: string pattern: ^{2}\-{3}\-\d{2}\-\d{5}$
Здесь мы указываем, что каждый из документов, доступ к которым можно получить через API, имеет собственный идентификационный код в виде строки (type: string), а также описываем формат этого кода с помощью регулярных выражений.

Свойства description, type и pattern можно использовать и в описаниях методов, например:
/documents get: description: Retrieve a list of documents post: description: Add a new document body: application/x-www-form-urlencoded formParameters: id: description: document identification number type: string pattern: {2}\-{3}\-\d{2}\-\d{5}$ name: description: the name of the document type: string required: true author: description: The name of the author type: string required: true
В описании метода POST мы указываем параметры, которые нужно передать в теле запроса для добавления нового документа: ID, имя и имя автора. Каждый из этих параметров является строкой (type: string). Обратите внимание на свойство required: оно указывает, является ли параметр обязательным (true) или необязательным (false).

Для каждого метода можно прописать индивидуальную схему безопасности:

/documents get

Query-параметры

Для каждого метода в документации можно указать query-параметры, которые будут использоваться в запросе. Для каждого query-параметра указываются следующие характеристики: имя, тип, описание и пример:

/document: get: queryParameters: author: displayName: Author type: string description: The author"s full name example: Ivan Petrov required: false name: displayName: Document Name type: string description: The name of the document example: Delivery contract required: false signingDate: displayName: signingDate type: date description: The date when the document was signed example: 2015-07-15 required: false

Профили

Чтобы избежать лишних повторений в описаниях, в RAML используются профили (traits), которые прописываются во вводной части документа:

#% RAML 0.8 title: Example API baseUri: http://api.example.com/{version} version: v1 traits: - searchable: queryParameters: author: displayName: Author type: string description: The author"s full name example: Ivan Petrov required: false name: displayName: Document Name type: string description: The name of the document example: Delivery contract required: false signingDate: displayName: signingDate type: date description: The date when the document was signed example: 2015-07-15 required: false
В дальнейшем к профилю можно обращаться при описании любых методов:

/document: get: is:
Более подробно о профилях и особенностях их использования можно почитать в официальной документации (раздел Traits).

Описание ответа

В описании ответа обязательно указывается его код. Также в описание можно добавить схему (schema) — перечисление входящих в ответ параметров и их типов. Можно также привести пример конкретного ответа (example).

/documents: /{documentId}: get: description: Retrieve document information responses: 200: body: application/json: schema | {"$schema": “http://json-schema.org/schema”, "type":"object" "description": "a document" "properties": { "id":{"type":"string"} "name":{"type":"string"} "author":{"type":"string"} "signingDate": {"type":"date"} example: | {"data:" { "id": "DOC3456" "name": "New Delivery Contract" "author": "Ivan Petrov" "signingDate": "2015-05-20" }, "success": true "status": 200 }
Cхемы ответов можно сохранять в отдельных файлах формата.yml или.raml и обращаться к ним в других частях документации:

Schemas: - !include document-schema.yaml /articles: get: responses: 200: body: application/json: schema: document

Визуализация и генерация документации

RAML2HTML и другие конвертеры

Несмотря на то, что RAML — формат относительно новый, для него уже разработано достаточное количество конвертеров и парсеров. В качестве примера можно привести ram2htmtl , генерирующий на основе описания в формате RAML статическую HTML-страницу.
Устанавливается он при помощи менеджера пакетов npm:

$ npm -i g raml2html
Чтобы сконвертировать RAML-файл в HTML, достаточно выполнить простую команду:
$ raml2html api.raml > index.html

Компания Mulesoft (один из активных участников проекта RAML) создала специальный онлайн-инструмент, с помощью которого можно упростить работу по написанию документации и последующему тестированию API. Называется он .
Чтобы начать им пользоваться, нужно сначала зарегистрироваться на сайте. После этого можно приступать к работе. API designer предоставляет, во-первых, удобный интерактивный редактор для написания документации онлайн, а во-вторых — платформу для тестирования.
Выглядит всё это так:

В правой части страницы автоматически генерируется интерактивная документация. Здесь же можно и протестировать API: для этого достаточно просто развернуть описание нужного запроса и нажать на кнопку Try it.

API Designer позволяет также загружать RAML-файлы с локальной машины. Поддерживается импорт файлов описаний API для Swagger.
Кроме того, API Designer хранит статистику тестовыx запросов к API.

API console

API console — полезный инструмент, разработанный всё той же компанией MuleSoft. С его помощью можно прямо в браузере генерировать документацию к API. Файлы спецификаций можно как загрузить с локальной машины, так и указать ссылку на внешний

API определяет функциональность, которую предоставляет программа (модуль, библиотека), при этом API позволяет абстрагироваться от того, как именно эта функциональность реализована.

Если программу (модуль, библиотеку) рассматривать как чёрный ящик, то API - это множество «ручек», которые доступны пользователю данного ящика, которые он может вертеть и дёргать.

Программные компоненты взаимодействуют друг с другом посредством API. При этом обычно компоненты образуют иерархию - высокоуровневые компоненты используют API низкоуровневых компонентов, а те, в свою очередь, используют API ещё более низкоуровневых компонентов.

По такому принципу построены протоколы передачи данных по . Стандартный протокол Internet (сетевая модель OSI) содержит 7 уровней (от физического уровня передачи пакетов бит до уровня протоколов приложений, подобных протоколам HTTP и IMAP). Каждый уровень пользуется функциональностью предыдущего уровня передачи данных и, в свою очередь, предоставляет нужную функциональность следующему уровню.

Важно заметить, что понятие протокола близко по смыслу к понятию API. И то и другое является абстракцией функциональности, только в первом случае речь идёт о передаче данных, а во втором - о построении компьютерных приложений.

API библиотеки функций и классов включает в себя описание сигнатур и семантики функций .

Application Programming Interface (API) программный интерфейс взаимодействия между системами, позволяющий:

  • Получать доступ к бизнес-сервисам предприятия
  • Обмениваться информацией между системами и приложениями
  • Упростить взаимодействие между компаниями, партнерами, разработчиками и клиентами

Open API стратегия

API стратегия включает в себя:

  • Разработку бизнес-продуктов на основе существующих API
  • Предоставление внутренних сервисов разработчикам
  • Модели монетизации API для построения мультиканального взаимодействия и повышения прибыли

Реализация концепции Open API помогает трансформировать бизнес, встраивать его в гибкую проектную экосистему игроков рынка, создавать условия для постоянной генерации новых идей и формирования дополнительной ценности при управлении массивами корпоративных данных.

Рынок интеграционных решений развивается в контексте эволюции API - от EDI и SOAP до Web 2.0 , с которого началась эра публичных API. Число таких интерфейсов в ближайшие 3 года может вырасти более чем в 50 раза и достичь 1 миллиона. Это связано с мультиканальностью: каналы взаимодействия с клиентами должны меняться вместе с ними. Непрерывный рост количества потребителей и объема данных привел к появлению экономики API, помогающей на основе открытых интерфейсов создавать инновационные бизнес-модели использования корпоративных активов и сервисов.

Сигнатура функции

Сигнатура функции - часть общего объявления функции, позволяющая средствам трансляции идентифицировать функцию среди других. В различных языках программирования существуют разные представления о сигнатуре функции, что также тесно связано с возможностями перегрузки функции в этих языках.

Иногда различают сигнатуру вызова и сигнатуру реализации функции. Сигнатура вызова обычно составляется по синтаксической конструкции вызова функции с учётом сигнатуры области видимости данной функции, имени функции, последовательности фактических типов аргументов в вызове и типе результата. В сигнатуре реализации обычно участвуют некоторые элементы из синтаксической конструкции объявления функции: спецификатор области видимости функции, её имя и последовательность формальных типов аргументов.

Например, в языке программирования Си++ простая функция однозначно опознаётся компилятором по её имени и последовательности типов её аргументов, что составляет сигнатуру функции в этом языке. Если функция является методом некоторого класса, то в сигнатуре будет учаcтвовать и имя класса.

Также необходимо отметить, что в распоряжении программиста часто находится несколько различных API, позволяющих добиться одного и того же результата. При этом каждый API обычно реализован с использованием API программных компонент более низкого уровня абстракции.

Например: для того, чтобы увидеть в браузере строчку «Hello, world!» достаточно лишь создать HTML -документ с минимальным заголовком, и простейшим телом, содержащим данную строку. Что произойдёт, когда браузер откроет этот документ ? Программа-браузер передаст имя файла (или уже открытый дескриптор файла) библиотеке, обрабатывающей HTML-документы, та, в свою очередь, при помощи API операционной системы прочитает этот файл, и разберётся в его устройстве, повызывает через API библиотеки стандартных графических примитивов операции типа «очистить окошко», «написать выбранным шрифтом Hello, world!», при этих операциях библиотека графических примитивов обратится к библиотеке оконного интерфейса с соответствующими запросами, уже эта библиотека обратится к API операционной системы с запросами вида «а положи-ка мне в буфер видеокарты вот это».

При этом практически на каждом из уровней реально существует несколько возможных альтернативных API. Например: мы могли бы писать исходный документ не на HTML , а на LaTeX, для отображения могли бы использовать любой браузер. Различные браузеры, вообще говоря, используют различные HTML-библиотеки, и, кроме того, всё это может быть (вообще говоря) собрано с использованием различных библиотек примитивов и на различных операционных системах.

Основными сложностями существующих многоуровневых систем API, таким образом, являются:

  • Сложность портирования программного кода с одной системы API на другую (например, при смене ОС);
  • Потеря функциональности при переходе с более низкого уровня на более высокий. Грубо говоря, каждый «слой» API создаётся для облегчения выполнения некоторого стандартного набора операций. Но при этом реально затрудняется, либо становится принципиально невозможным выполнение некоторых других операций, которые предоставляет более низкий уровень API.

Основные типы API

Внутренние API

  • Доступ к API предоставляется только внутренним разработчикам
  • Приложения нацелены на сотрудников предприятия

Бизнес-драйверы:

  • Консистентность разработки
  • Снижение затрат
  • Повышение эффективности разработки

Партнерские API

  • API доступны только ограниченному набору бизнес-партнеров
  • Приложения предназначены для конечных потребителей и для бизнес-пользователей

Бизнес-драйверы:

  • Автоматизация процесса разработки
  • Развитие партнерских отношений
  • Оптимизация процесса взаимодействия с партнерами

Публичные API

Доступ предоставляется любому внешнему разработчику Приложения нацелены на конечных пользователей

Бизнес-драйверы:

  • Разработка новых сервисов
  • Развитие экосистемы
  • Мультиканальное взаимодействие

Наиболее известные API

API операционных систем

API графических интерфейсов

  • Direct3D (часть DirectX)
  • DirectDraw (часть DirectX)

Министерство образования и науки РФ

Государственное образовательное учреждение

Высшего профессионального образования

«Ижевский государственный технический университет имени М.Т. Калашникова»

Кафедра «Вычислительная техника»

Пояснительная записка к курсовой работе

по дисциплине «Операционные системы»

Всплывающие подсказки

Выполнил: студент гр. 8-78-1

Саляхутдинов К.О.

Проверил:

преподаватель, к.т.н. Вахрушева Е.А.

Ижевск, 2014

Введение 3

Описание API-функций 4

Принцип работы 13

Листинг программы 14

Файл hint.inc 14

Файл hint.asm 15

Файл hint.rc 20

Демонстрация работы программы 22

Список литературы 23

Введение

В компьютерных интерфейсах подсказка (с англ. tooltip, hint) служит дополнительным средством обучения интерфейсу.

Типы подсказок:

    Всплывающая подсказка - появляется при подведении курсора к интересующему объекту или в случае недопустимого действия (например, ввода текста вместо числа). В случае редакторов с автодополнением всплывающие подсказки могут появляться при вводе названий функций и переменных, указывая их характеристики (тип, прототип, количество и тип аргументов и т. д.).

    Подсказка при запуске - появляющееся после запуска программы окно, демонстрирующее краткий текст по необычным/нестандартным возможностям программы. Обычно при каждом запуске текст меняется, позволяя пользователю изучать возможности программы «походя». В ряде случаев появление окна с текстом, требующим особых действий для закрытия, может расцениваться пользователями как раздражающее.

    Контекстная - в некоторых типах интерфейсов командной строки (например, в IOS) - появляющаяся при вводе команды и вопросительного знака. При этом введённый текст не исчезает, а подсказка появляется над введенным текстом, позволяя понять, что можно/следует вводить дальше.

В данной курсовой работе в качестве цели использовалось создание именно всплывающих подсказок, которые можно установить на любые объекты окна.

Описание api-функций

CreateDialogParam

Создает немодальное диалоговое окно из шаблона ресурса блока диалога. Перед показом диалогового окна на экране, функция отправляет в процедуру блока диалога определяемое программой значение сообщения WM_INITDIALOG, как параметр lParam. Прикладная программа может использовать это значение, чтобы инициализировать элементы управления диалогового окна.

Синтаксис:

HWND CreateDialogParam(

HINSTANCE hInstance, // дескриптор экземпляра программы

LPCTSTR lpTemplateName, // идентификация шаблона блока диалога

HWND hWndParent, // дескриптор окна владельца

DLGPROC lpDialogFunc, // указатель на процедуру диалогового окна

LPARAM dwInitParam // инициализационное значение

Параметры:

    hInstance - идентифицирует экземпляр модуля, исполняемый файл которого содержит шаблон диалогового окна.

    lpTemplateName - идентифицирует шаблон диалогового окна. Этот параметр - или указатель на строку символов с нуль-терминатором в конце, которая определяет имя шаблона диалогового окна, или целочисленное значение, которое определяет идентификатор ресурса шаблона блока диалога. Если параметр определяет идентификатор ресурса, его старшее слово должно быть нулевым, а младшее слово должно содержать идентификатор. Вы можете использовать макрокоманду MAKEINTRESOURCE, чтобы создать это значение.

    hWndParent - идентифицирует окно, которое владеет блоком диалога.

    lpDialogFunc - указывает на процедуру диалогового окна.

    dwInitParam - устанавливает значение, передаваемое процедуре диалогового окна в параметре lParam сообщения WM_INITDIALOG.

Возвращаемые значения: если функция завершилась успешно, возвращается значение дескриптор окна блока диалога. Если функция потерпела неудачу, возвращается значение ПУСТО (NULL).

SetFocus

Устанавливает фокус клавиатуры на заданном окне. Окно должно быть связано с очередью сообщений вызывающего потока.

Синтаксис:

HWND WINAPI SetFocus(

In_opt_ HWND hWnd //дескриптор окна

Параметры:

    hWnd - идентифицирует окно, которое примет ввод информации с клавиатуры. Если этот параметр - ПУСТО (NULL), нажатия клавиши игнорируются.

Возвращаемые значения: если функция завершается успешно, величина возвращаемого значения - дескриптор окна, которое до этого имело фокус клавиатуры. Если параметр hWnd недопустимый или окно не связано с очередью сообщений вызывающего потока, величина возвращаемого значения - ПУСТО (NULL).

Lstrcpy

Копирует строку в буфер.

Синтаксис:

LPTSTR WINAPI lstrcpy(

Out_ LPTSTR lpString1,

In_ LPTSTR lpString2

Параметры:

    lpString1 - указатель на буфер, который получает содержимое строки, указанное при помощи параметра lpString2. Буфер должен быть достаточно большим, чтобы принять строку, включая символ завершающего нуля.

    lpString2 - указатель на строку с завершающим нулем, которая копируется.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - указатель на буфер. Если функция завершается ошибкой, возвращаемое значение NULL.

DestroyWindow

Уничтожает определенное окно. Функция посылает сообщения WM_DESTROY и WM_NCDESTROY окну, чтобы дезактивировать его и удалить фокус клавиатуры из него. Функция также уничтожает меню окна, очищает очередь потоков сообщений, уничтожает таймеры, удаляет монопольное использование буфера обмена и разрывает цепочку просмотра окон буфера обмена (если окно имеет наверху цепочку просмотров).

Если окно - родитель или владелец окон, то DestroyWindow автоматически уничтожает связанные дочерние или находящиеся в собственности окна, когда она уничтожает окно владельца или родителя. Функция сначала уничтожает дочерние или находящиеся в собственности окна, и затем она уничтожает окно владельца или родителя. DestroyWindow также уничтожает немодальные диалоговые окна, созданные функцией CreateDialog.

Синтаксис:

BOOL WINAPI DestroyWindow(

In_ HWND hWnd //дескриптор окна

Параметры:

    hWnd - идентификатор окна, которое будет разрушено.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция не выполняет задачу, возвращаемое значение нулевое.

Lstrlen

Возвращает длину указанной строки в байтах, не включая символ завершающего нуля.

Синтаксис:

int WINAPI lstrlen(

In_ LPCTSTR lpString

Параметры:

    lpString - указатель на строку с завершающим нулем.

Возвращаемые значения: возвращаемое значение указывает длину строки, в значениях TCHAR.

GetDlgItem

Извлекает дескриптор органа управления в заданном диалоговом окне.

Синтаксис:

HWND WINAPI GetDlgItem(

In_opt_ HWND hDlg,

In_ int nIDDlgItem

Параметры:

    nIDDlgItem - устанавливает идентификатор извлекаемого органа управления.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - дескриптор окна указанного органа управления. Если функция завершается ошибкой, возвращаемое значение - ПУСТО (NULL), которое указывает на недопустимый дескриптор диалогового окна или несуществующий орган управления.

GetCursorPos

Извлекает позицию курсора, в экранных координатах.

Синтаксис:

BOOL WINAPI GetCursorPos(

Out_ LPPOINT lpPoint

Параметры:

    lpPoint - указатель на структуру POINT, которая получает экранные координаты курсора.

Возвращаемые значения:

TextOut

Записывает строку символов в заданном месте, используя текущий выбранный шрифт, цвет фона и цвет текста.

Синтаксис:

In_ int nXStart,

In_ int nYStart,

In_ LPCTSTR lpString,

In_ int cchString

Параметры:

    nXStart - устанавливает x-координату, в логических координатах, контрольной точки, которую система использует для выравнивания строки.

    nYStart - устанавливает y-координату, в логических координатах, контрольной точки, которую система использует для выравнивания строки.

    lpString - указатель на строку, которую нужно написать. Строка не должна завершаться нуль-терминатором, так как параметр cbString задает длину строки.

    cbString - устанавливает длину строки. Для функции ANSI, это количество BYTE (байтов), а для функции Unicode, это является количеством WORD (слов).

Возвращаемые значения: если функция завершается успешно, величина возвращаемого значения - не ноль. Если функция завершается с ошибкой, величина возвращаемого значения - ноль.

SetBkColor

Устанавливает текущий цвет фона в заданном коде цвета или в самом близком физическом цвете, если устройство не может предоставить указанный код цвета.

Синтаксис:

COLORREF SetBkColor(

In_ COLORREF crColor

Параметры:

    Hdc - дескриптор контекста устройства.

    crColor - определяет новый цвет фона. Чтобы создать значение COLORREF, используйте макрокоманду RGB.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение определяет предыдущий цвет фона как значение COLORREF.

SetTextColor

Устанавливает цвет текста для заданного устройства в заданный цвет.

Синтаксис:

COLORREF SetTextColor(

In_ COLORREF crColor

Параметры:

    Hdc - дескриптор контекста устройства.

    crColor - устанавливает цвет текста.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - ссылка на цвет предыдущего цвета текста как значение COLORREF.

BeginPaint

Готовит заданное окно к окрашиванию и заполняет структуру PAINT-STRUCT информацией об окрашивании.

Синтаксис:

Out_ LPPAINTSTRUCT lpPaint

Параметры:

    hwnd - дескриптор окна, которое будет перекрашено.

    lpPaint - указатель на структуру PAINTSTRUCT, которая получит информацию об окрашивании.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - дескриптор контекста устройства отображения для заданного окна. Если функция завершается ошибкой, возвращаемое значение - NULL, которое указывает, что никакой контекст устройства (DC) отображения не доступен.

EndPaint

Отмечает конец окрашивания в заданном окне. Эта функция требуется для каждого вызова в функции BeginPaint, но только после того, как окрашивание завершается полностью.

Синтаксис:

In_ const PAINTSTRUCT *lpPaint

Параметры:

    hWnd - дескриптор окна, которое было перекрашено.

    lpPaint - указатель на структуру PAINTSTRUCT, которая содержит информацию об окрашивании, извлекаемую при помощи функции BeginPaint.

Возвращаемые значения: возвращаемое значение всегда не нуль.

GetTextExtentPoint 32

Вычисляет ширину и высоту заданной строки текста.

Синтаксис:

BOOL GetTextExtentPoint32(

In_ LPCTSTR lpString,

In_ int cbString,

Out_ LPSIZE lpSize

Параметры:

    Hdc - дескриптор контекста устройства.

    lpString - указатель на буфер, который задает текстовую строку. Строка не должна быть закончена нулем, потому что параметр cbString устанавливает длину строки.

    cbString - устанавливает длину буфера lpString.

    lpSize - указатель на структуру SIZE, которая принимает размеры строки, в логических единицах измерения.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение не нуль. Если функция завершается с ошибкой, величина возвращаемого значения - ноль.

MoveWindow

Изменяет позицию и габариты определяемого окна. Для окна верхнего уровня, позиция и габариты отсчитываются относительно левого верхнего угла экрана. Для дочернего окна - относительно левого верхнего угла рабочей области родительского окна.

Синтаксис:

BOOL WINAPI MoveWindow(

In_ int nWidth,

In_ int nHeight,

In_ BOOL bRepaint

Параметры:

    hWnd - дескриптор окна.

    X - устанавливает новую позицию левой стороны окна.

    Y - устанавливает новую позицию верхней части окна.

    nWidth - устанавливает новую ширину окна.

    nHeight - устанавливает новую высоту окна.

    bRepaint - определяет, должно ли окно быть перерисовано. Если этот параметр - ИСТИНА (TRUE), окно принимает сообщение WM_PAINT. Если параметр – ЛОЖЬ (FALSE), никакого перекрашивания какого-либо сорта не происходит. Это применяется к рабочей области, нерабочей области (включая область заголовка и линейки прокрутки) и любой части родительского окна, раскрытого в результате перемещения дочернего окна.

Возвращаемые значения: если функция завершилась успешно, возвращается значение не нуль. Если функция потерпела неудачу, возвращаемое значение - ноль.

GetWindowRect

Извлекает размеры рамки ограничивающей прямоугольник заданного окна. Размеры даются в экранных координатах, которые отсчитываются относительно левого верхнего угла экрана.

Синтаксис:

BOOL WINAPI GetWindowRect(

Out_ LPRECT lpRect

Параметры:

    hWnd - дескриптор окна.

    lpRect - указатель на структуру, которая принимает экранные координаты левого верхнего и нижнего правого углов окна.

Возвращаемые значения: если функция завершилась успешно, возвращается значение - не нуль. Если функция потерпела неудачу, возвращаемое значение - ноль.

ReleaseDC

Освобождает контекст устройства (DC) для использования другими приложениями. Действие функции ReleaseDC зависит от типа контекста устройства (DC). Она освобождает только общий и контекст устройства (DC) окна. Не имеет никакого действия на контексты устройства класса или частный DC.

Синтаксис:

Параметры:

    hWnd - дескриптор окна, контекст устройства (DC) которого должен быть освобожден.

    hDC - дескриптор контекста устройства (DC), который будет освобожден.

Возвращаемые значения: возвращаемое значение указывает, был ли контекст устройства (DC) освобожден. Если контекст устройства был освобожден, возвращаемое значение равно 1. Если контекст устройства (DC) не был освобожден, величина возвращаемого значения - ноль.

GetDC

Извлекает дескриптор дисплейного контекста устройства (DC) для рабочей области заданного окна или для всего экрана. Вы можете использовать возвращенный дескриптор в последующих функциях GDI, чтобы рисовать в контексте устройства.

Синтаксис:

Параметры:

    hWnd - дескриптор окна, контекст устройства (DC) которого должен извлечься.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - дескриптор контекста устройства (DC) для рабочей области заданного окна. Если функция завершается ошибкой, возвращаемое значение - ПУСТО (NULL).

SendDlgItemMessage

Отправляет сообщение указанному органу управления в диалоговом окне.

Синтаксис:

LRESULT WINAPI SendDlgItemMessage(

In_ int nIDDlgItem,

In_ WPARAM wParam,

In_ LPARAM lParam

Параметры:

    hDlg - дескриптор диалогового окна, которое содержит орган управления.

    nIDDlgItem - устанавливает идентификатор органа управления, который получает сообщение.

    Msg - задает отправляемое сообщение.

    wParam - устанавливает дополнительную специальную для сообщения информацию.

    lParam - устанавливает дополнительную специальную для сообщения информацию.

Возвращаемые значения: возвращаемое значение определяет результат обработки сообщения и зависит от отправленного сообщения.

ExitProcess

Заканчивает работу процесса и всех его потоков.

Синтаксис:

VOID WINAPI ExitProcess(

In_ UINT uExitCode

Параметры:

    uExitCode - определяет код выхода для процесса, и для всех потоков, которые завершают работу в результате вызова этой функции. Используйте функцию GetExitCodeProcess, чтобы получить значение выхода из процесса. Используйте функцию GetExitCodeThread, чтобы получить значение выхода из потока.

Возвращаемые значения: у этой функции нет возвращаемого значения.

GetModuleHandle

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

Синтаксис:

HMODULE WINAPI GetModuleHandle(

In_opt_ LPCTSTR lpModuleName

Параметры:

    lpModuleName - указатель на символьную строку с нулем в конце, которая содержит имя модуля (или.dll, или.exe файл). Если расширение имени файла опускается, в конец добавляется заданное по умолчанию библиотечное расширение.dll. Символьная строка имени файла может включать в себя конечный символ точки (.), который указывает, что имя модуля не имеет расширения. Строка не должна определять путь. Когда определяется путь, убедитесь, что используются обратные слэши (\), а не прямые слэши (/).

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - дескриптор указанного модули. Если функция завершается ошибкой, возвращаемое значение - NULL.

DialogBoxParam

Создает модальное диалоговое окно из шаблона ресурса блока диалога. Перед показом диалогового окна на экране, функция передает в процедуру блока диалога определяемое программой значение, такое как параметр lParam сообщения WM_INITDIALOG. Прикладная программа может использовать это значение, чтобы инициализировать органы управления диалогового окна.

Синтаксис:

INT_PTR WINAPI DialogBoxParam(

In_opt_ HINSTANCE hInstance,

In_ LPCTSTR lpTemplateName,

In_opt_ HWND hWndParent,

In_opt_ DLGPROC lpDialogFunc,

In_ LPARAM dwInitParam

Параметры:

    hInstance - дескриптор модуля, исполняемый файл которого содержит шаблон диалогового окна.

    lpTemplateName - определяет шаблон диалогового окна. Этот параметр - или указатель на строку символов с нуль-терминатором в конце, которая определяет имя шаблона диалогового окна, или целочисленное значение, которое определяет идентификатор ресурса шаблона блока диалога. Если параметр определяет идентификатор ресурса, его старшее слово должно быть нуль, а младшее слово должно содержать этот идентификатор. Вы можете использовать макрокоманду MAKEINTRESOURCE, чтобы создать это значение.

    hWndParent - дескриптор окна, которое владеет диалоговым окном.

    lpDialogFunc - указатель на процедуру диалогового окна.

    dwInitParam - устанавливает значение, передаваемое процедуре диалогового окна в параметре lParam сообщения WM_INITDIALOG.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - значение параметра nResult, заданного при вызове к функции EndDialog, используемой, чтобы завершить работу диалогового окна. Если функция завершается ошибкой, потому что параметр hWndParent недопустим, возвращаемое значение равняется нулю.

EndDialog

Уничтожает модальное диалоговое окно, заставляя систему закончить любую обработку информации диалогового окна.

Синтаксис:

BOOL WINAPI EndDialog(

In_ INT_PTR nResult

Параметры:

    hDlg - дескриптор уничтожаемого диалогового окна.

    nResult - устанавливает значение, возвращаемое прикладной программе из функции, которая создала диалоговое окно.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение не нуль. Если функция завершается ошибкой, возвращаемое значение равняется нулю.

SetTimer

Создает таймер с указанным значением времени простоя.

Синтаксис:

UINT_PTR WINAPI SetTimer(

In_opt_ HWND hWnd,

In_ UINT_PTR nIDEvent,

In_ UINT uElapse,

In_opt_ TIMERPROC lpTimerFunc

Параметры:

    hWnd - дескриптор окна, которое связано с таймером. Это окно должно быть собственностью вызывающего потока. Если этот параметр NULL, никакое окно не связано с таймером, а параметр nIDEIvent игнорируется.

    nIDEvent - указывает идентификатор таймера отличный от нуля. Если параметр hWnd - NULL, этот параметр игнорируется. Если параметр hWnd - не NULL, и у окна указанного hWnd уже есть таймер со значением nIDEvent, то существующий таймер заменяется новым таймером.

    uElapse - указывает значение времени простоя, в миллисекундах.

    lpTimerFunc - указатель на функцию, которая уведомляет, когда значение времени простоя истекает. Если параметр lpTimerFunc - NULL, система помещает уведомление WM_TIMER в очередь прикладной программы.

Возвращаемое значение: если функция завершается успешно, а параметр hWnd - NULL, возвращаемое значение - целое число, идентифицирующее новый таймер. Приложение может передать это значение в функцию KillTimer, чтобы уничтожить таймер. Если функция завершается успешно, а hWnd параметр - не NULL, тогда возвращаемое значение - целое число отличное от нуля. Приложение может передать значение параметра nIDEvent в функцию KillTimer, чтобы уничтожить таймер. Если при создании таймера функция завершается ошибкой, возвращаемое значение - нуль.

KillTimer

Ликвидирует указанный таймер.

Синтаксис:

BOOL WINAPI KillTimer(

In_opt_ HWND hWnd,

In_ UINT_PTR uIDEvent

Параметры:

    hWnd - дескриптор окна, связанного с указанным таймером. Это значение должно быть таким же, как и значение hWnd, переданное в функцию SetTimer, которая создала таймер.

    uIDEvent - указывает таймер, который будет ликвидирован. Если дескриптор окна, который передают в функцию SetTimer - правильный, то этот параметр должен быть таким же, как и значение nIDEvent переданное в SetTimer. Если приложение вызывает SetTimer с hWnd установленным в NULL, то этот параметр должен быть идентификатором таймера, значение которого возвращает функция SetTimer.

Возвращаемые значения: если функция завершается успешно, возвращаемое значение - не нуль. Если функция завершается ошибкой, возвращаемое значение - нуль.



API ключ Номер счета на оплату Статус счета по банковской карте Запрет сторнирования
100 Да
101 Да
102 Нет
103 Авторизация отменена Нет
104 Нет
105 Да
106 Авторизация отклонена Да
100 Счет зарегистрирован, но не оплачен Да
101 Предавторизованная сумма захолдирована (для двухстадийных платежей) Да
102 Проведена полная авторизация суммы счета Нет
103 Авторизация отменена Нет
104 По транзакции была проведена операция возврата Нет
105 Инициирована авторизация через ACS банка-эмитента Да