Начало работы
API для оплаты услуг и переводов от имени партнёра (агентские платежи).
Как это работает
Полный поток исходящего платежа от начала до подтверждения:
- Вы запрашиваете список услуг и узнаёте обязательные поля (
requiredFields). - Проверяете получателя — Finik возвращает его имя.
- Создаёте платёж со своего счёта с уникальным
transactionId. - Finik списывает средства и проводит платёж в сторону поставщика услуг.
- Вы получаете webhook с финальным статусом (
SUCCEEDEDилиFAILED) или проверяете статус черезGET /v2/payments/{paymentId}.
Введение
Эта документация поможет вам интегрировать Finik Payments Gateway API в ваше приложение, чтобы вы могли совершать платежи от своего имени: оплачивать мобильную связь, интернет, коммунальные и другие услуги, а также отправлять переводы пользователям Finik — напрямую со своего корпоративного счёта в сторону сотен поставщиков услуг Кыргызстана.
Интеграция состоит из следующих шагов:
- Сгенерируйте пару ключей RSA — приватный и публичный. Они нужны для авторизации ваших запросов.
- Получите API-ключ — передайте публичный ключ представителям Finik и получите
ApiKeyдля работы с API. - Настройте подпись запросов — каждый запрос подписывается вашим приватным ключом.
- Получите список услуг — запросите каталог доступных услуг и их обязательные поля через
POST /v2/services. - Проверьте получателя — перед платежом убедитесь, что получатель су ществует, через
POST /v2/recipient. - Создавайте платежи — отправляйте подписанные запросы на
POST /v2/paymentи отслеживайте статус. - Обрабатывайте webhook — принимайте уведомления о финальном статусе платежа и проверяйте их подпись.
Быстрый старт
- Получите
ApiKeyу представителей Finik. - Сгенерируйте пару RSA-ключей:
openssl genrsa -out finik_private.pem 2048
openssl rsa -in finik_private.pem -pubout > finik_public.pem- Отправьте публичный ключ (
finik_public.pem) представителям Finik. Приватный ключ храните в секрете — тот, кто им завладеет, сможет отправлять запросы от вашего имени. - Подключите библиотеку подписи:
- Node.js —
@mancho.devs/authorizer(NPM) - Python —
mancho-devs/python-authorizer - Другие языки — см. алгоритм подписи
- Node.js —
- Сделайте первый запрос в бета-среде — начните с
POST /v2/services.
Окружения
| Среда | Базовый URL | Публичный ключ Finik для проверки вебхуков |
|---|---|---|
Beta | https://beta.api.paymentsgateway.averspay.kg | Beta public key (см. страницу «Вебхук и коды ошибок») |
Production | https://api.paymentsgateway.averspay.kg | Prod public key (см. страницу «Вебхук и коды ошибок») |
Аутентификация
Каждый запрос подписывается вашим приватным ключом. Подпись передаётся в HTTP-заголовках:
| Заголовок | Тип | Обязательный | Описание |
|---|---|---|---|
signature | String | Обязательно | Подпись запроса (Base64). |
x-api-key | String | Обязательно | Ваш API-ключ, выданный Finik. Участвует в генерации подписи. |
x-api-timestamp | String | Обяз ательно | Текущее время в миллисекундах. Участвует в генерации подписи. |
Алгоритм формирования строки для подписи
data = lowercase(HTTP-метод) + "\n" // "post" или "get"
data += URI-путь + "\n" // например "/v2/payment"
data += заголовки + "\n" // см. правила ниже
data += query-параметры + "\n" // если query-параметров нет — "\n" НЕ добавляется
data += JSON тела запроса // ключи отсортированы, см. нижеПравила для заголовков:
- Взять
Hostи все заголовки, начинающиеся сx-api-*. - Отсортировать по имени заголовка в алфавитном порядке.
- Склеить через
&в форматеимя:значение(имена в нижнем регистре):
host:api.paymentsgateway.averspay.kg&x-api-key:ВАШ_КЛЮЧ&x-api-timestamp:1719900000000Правила для query-параметров:
- Отсортировать по имени параметра в алфавитном порядке.
- Склеить через
&в форматеURiEncode(имя)=URiEncode(значение). - Если у параметра нет значения (например
?acl) — использовать пустую строку:acl=.
Правила для тела запроса:
Тело сериализуется в JSON с ключами, отсортированными в алфавитном порядке.
Подпись
Собранная строка data подписывается алгоритмом SHA256withRSA приватным ключом, результат кодируется в Base64 и передаётся в заголовке signature.
Пример на Java:
public String sign(String payload, String privatePath) {
try {
Signature signature = Signature.getInstance("SHA256withRSA");
String privateKeyFile = new String(Files.readAllBytes(Paths.get(privatePath)));
RSAKey rsaKey = (RSAKey) JWK.parseFromPEMEncodedObjects(privateKeyFile);
PrivateKey privateKey = rsaKey.toPrivateKey();
signature.initSign(privateKey);
signature.update(payload.getBytes(StandardCharsets.UTF_8));
return Base64.encodeBase64String(signature.sign());
} catch (Exception e) {
throw new AppException(e.getMessage());
}
}Готовые библиотеки
| Язык | Пакет |
|---|---|
Node.js | @mancho.devs/authorizer (NPM) |
Python | mancho-devs/python-authorizer |
Другие | Реализуйте алгоритм выше. Библиотеки для других языков — в планах. |