Генерація ключів для мерчантів в адмінці Acquiring3

Генерація ключів для мерчантів в адмінці Acquiring3


Опис функціональності

У адмін-панелі Acquiring3 реалізовано можливість самостійної генерації криптографічних ключів для мерчантів. Приватний ключ завантажується на пристрій користувача у форматі .pem, а публічний ключ автоматично зберігається у Базі даних та у картці відповідного мерчанта.

Функціональність доступна лише користувачам з відповідним дозволом.


Генерація ключів для мерчанта

  1. Натисніть кнопку “Згенерувати ключі” у верхньому меню адмін-панелі.

image-20251211-144806.png
  1. У модальному вікні з’явиться перелік усіх мерчантів, закріплених за користувачем. Необхідно вибрати одного або декількох мерчантів.

image-20251211-145817.png
  1. Натисніть “Продовжити”. При цьому система NovaPay здійснить наступне:

  • автоматично згенерує приватний ключ;

  • збереже публічний ключ у БД;

  • запише публічний ключ у картці мерчанта (замінюється при кожній новій генерації приватного ключа);

  • завантажить приватний ключ на пристрій користувача у форматі .pem.

image-20251211-150106.png
  1. Відкрийте файл приватного ключа у текстовому редакторі та скопіюйте його для подальшої роботи.

image-20251211-150145.png

Важливі примітки

  • Якщо згенерувати ключі для кількох мерчантів одночасно, публічний ключ буде однаковим для них всіх. Це допустимо, один ключ може використовуватися декількома мерчантами.

  • Якщо мерчанта щойно створено і поле публічного ключа порожнє, то після генерації воно автоматично буде заповнене.

  • Функціональність підходить як для нових користувачів, так і для існуючих. Якщо клієнт не вміє працювати з ключами, створюється користувач та мерчант без ключів – після отримання доступу клієнт генерує ключі самостійно. До моменту генерації ключа API-запити працювати не будуть.


Підписання запитів новим приватним ключем (створення x-sign)

Після генерації нового приватного ключа необхідно перепідписати всі API-запити, оскільки попередні x-sign стануть невалідними.

Створення x-sign вручну

1. Поле Private key

Після створення ключів мерчант копіює приватний ключ і вставляє його в сервіс https://emn178.github.io/online-tools/rsa/sign/ у поле Private Key.

Параметри, які повинні бути встановлені:

  • Input Encoding: UTF8

  • Output Encoding: Base64

  • Signature Algorithm: SHA-256

  • Private Key: новий приватний ключ (скопійований з .pem-файлу).

 

image-20260305-130313.png

 

2. Поле Input

Клієнт вставляє тіло запиту на створення сесії в поле Input.

{"merchant_id":"2","client_first_name":"Олег","client_last_name":"Цукор","client_phone":"+380931231234","client_email":"test@gmail.com","callback_url":"https://webhook.site/ea20eca7-129f-41c0-b327-8cc67b47b8de"}

При формуванні тіла запиту дуже важливо зберігати правильні відступи, переноси рядків та інші символи. Навіть зайвий пробіл може змінити підпис запиту та зробити його недійсним.

image-20260305-130852.png

 

3. Поле Output

Після вставки тіла запиту у Input, на виході в полі Output клієнт отримує готовий підпис запиту.

 

image-20260305-131028.png

 

4. Параметр x-sign

Далі клієнт відправляє запит на створення сесії на URL: https://api-qecom.novapay.ua/v1/session

У Headers запиту в параметрі x-sign передається сформований підпис з поля Output.

Запит надсилається на API з такими параметрами:

curl --location 'https://api-qecom.novapay.ua/v1/session' \ --header 'x-sign: bPfn60HVobyirZZF12FdapUT7zYSVRmpQOHIqyxwXYXAsZ67v1SL2m/MLcxQrujn6ejjdjC7pf7OLIUHKDW/A9TC7tS4gtBV+DrtZ4KFCFh3xTv/wyMb9Ctec0CgOI3N2W1QrOfZAHkxdpweCzCNAF70446pgs7K8JdA0/eTDW9K37BcAgM+U+WH4+xYG0k87AvHQcRt0/9J7V4AcEs4WIxiMj2dtI9+HeLMreNUx0CQcgIKc30h27KWtuMyY+6SCphGRD2WFrLLO+qO+5ZuOlD5dbUSjWl1zGG36LxWbeA2pBc7o2btyiju0DroUHmL4RHwF83v07lG3YOCgYuOWw==' \ --header 'content-type: application/json' \ --data-raw '{"merchant_id":"2","client_first_name":"Олег","client_last_name":"Цукор","client_phone":"+380931231234","client_email":"test@gmail.com","callback_url":"https://webhook.site/ea20eca7-129f-41c0-b327-8cc67b47b8de"}'

Створення сесії в зовнішньому еквайрингу | Create session

  1. Виконайте API-запит створення сесії, підписавши його новим x-sign.

  2. У відповіді буде повернено id сесії.

  3. Використовуйте цей id у всіх подальших запитах (наприклад, payment), кожного разу перепідписуючи body.

Приклад запиту

{   "merchant_id": "2",   "client_first_name": "Олег",   "client_last_name": "Цукор",   "client_patronymic": "Олегович",   "client_phone": "+380931231234",   "client_email": "test@gmail.com",   "callback_url": "https://callbackurl.com",   "success_url": "https://successurl.com",   "fail_url": "https://failurl.com",   "success_redirect_timeout": 5,   "metadata": {   "order_id": "123" } }

Приклад успішної відповіді

{     "id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5",     "metadata": {         "order_id": "123"     } }

Проведення оплати | Add payment

  1. Виконайте API-запит створення оплати, підписавши його новим x-sign.

  2. Перейдіть за отриманим посиланням на платіжну сторінку NovaPay.

  3. Проведіть оплату.

Приклад запиту

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5",   "amount": 100,   "external_id": "BB-1234567",   "use_hold": true,   "identifier": "37193071",   "products": [     {       "description": "Футболка",       "count": 1,       "price": 100     }   ] }

Приклад успішної відповіді

{     "url": "https://qecom.novapay.ua/external/pay?sid=ec7c592c-c49b-4e50-a9ff-52b2a12729b5",     "id": "120191001021",     "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5" }

Завершення операції | Complete Hold

  1. У body запиту замініть session_id на публічний ідентифікатор сесії.

  2. У тій же сесії знайдіть значення ID в платіжній системі: вкладка Платіжні сесії Сесія зі списку → Публічний ідентифікатор сесії.

  3. Замініть у запиті відповідне поле (operations id) цим значенням.

  4. Перепідпишіть запит новим приватним ключем.

Після виконання запиту Complete Hold оплата вважається повністю завершеною.

Приклад запиту, якщо потрібно списати всю заблоковану суму

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5",   "amount": 100 }

Приклад запиту, якщо потрібно списати частину від заблокованої суми (в цьому випадку захолдовано 100 грн)

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5",   "amount": 50 }

Приклад запиту, коли клієнту при підтвердженні списання потрібно зарахувати кошти іншому отримувачу

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5",   "operations": [     {       "id": "120191001036",       "amount": 50,       "recipient_identifier": "37193071"     },     {       "id": "120191001037",       "amount": 100,       "recipient_identifier": "37193071"     }   ] }

Ідентифікатор операції (id) клієнт отримує у відповіді на запит /v1/payment.

Якщо в межах однієї сесії виконано кілька запитів /v1/payment з умовою холдування (наприклад, користувач додав кілька товарів до одного замовлення), для кожної операції створюється окремий холд і повертається власний id.

Таким чином, у межах однієї session_id може бути декілька операцій із заблокованими коштами.

Під час підтвердження списання (метод /v1/complete-hold) використовується параметр operations.
Він дозволяє керувати тим:

  • по якій саме операції виконується списання;

  • яку суму потрібно списати;

  • якому отримувачу зарахувати кошти.

Приклад успішної відповіді

HTTP/1.1 200 OK Response body: empty

Повернення заблокованих раніше коштів | Void session

  1. У body запиту замініть session_id на публічний ідентифікатор сесії.

  2. Перепідпишіть запит новим приватним ключем.

 

Приклад запиту

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5" }

Приклад успішної відповіді

HTTP/1.1 200 OK Response body: empty

Завершення терміну дії платіжної сесії | Expire session

  1. У body запиту замініть session_id на публічний ідентифікатор сесії.

  2. Перепідпишіть запит новим приватним ключем.

 

Приклад запиту

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5" }

Приклад успішної відповіді

HTTP/1.1 200 OK Response body: empty

Запит на отримання статусу сесії | Get status

  1. У body запиту замініть session_id на публічний ідентифікатор сесії.

  2. Перепідпишіть запит новим приватним ключем.

 

 

Приклад запиту

{   "merchant_id": "2",   "session_id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5" }

Приклад успішної відповіді

{     "id": "ec7c592c-c49b-4e50-a9ff-52b2a12729b5",     "metadata": {         "order_id": "123",         "preprocess_client_id": null     },     "status": "holded",     "created_at": "2026-03-05T08:05:19.547+00:00",     "client_phone": "+380931231234",     "client_first_name": "Олег",     "client_last_name": "Цукор",     "client_patronymic": "Олегович",     "pan": "526961xxxx7956",     "rrn": "9046101",     "terminal_name": "000000020000001",     "paytype": "card",     "approval_code": "911609",     "card_type": "MasterCard",     "transaction_status": "APPROVED",     "amount": "150.00",     "processing_result": "Successful",     "operations": [         {             "transaction_id": "120191001034",             "external_id": "BB-1234567",             "amount": "100.00"         },         {             "transaction_id": "120191001035",             "external_id": "BB-1234568",             "amount": "50.00"         }     ] }

In NovaPay We Trust