Device Manager (далі ДМ) окрім формування фіскальних чеків та їх друку на підключений принтер підтримує також можливість примайти оплати за допомогою терміналу.
Перелік доступних способів прийняти оплату картою поповнився можливістю підключення терміналу у смартфоні.
Далі розповідаємо як це працює, які є можливості та як налаштувати і прийняти першу оплату.
Процес проведення оплати/повернення виглядає так:
Як результат - оплата проведена, чек сформовано без потреби вручну окремо вводити суму в платіжному застосунку і окремо проводити чек.
Які можливості відкриває використання ДМ разом з терміналом у смартфоні:
Для роботи доступно кілька способів. Використовувати той чи інший спосіб ви можете на власний розсуд.
Для кращого розуміння порівняємо схеми із класичною схемою підключення POS терміналу до ПК.
Класична схема:

З облікова система відправляє API запити (на оплату, фіскалізацію та друк) на локально встановлений ДМ на пристрої, POS термінал та принтер, при цьому, може бути підключено як до облікової програми так і напряму в ДМ.

При використанні даної схеми у вас буде 2 екземпляри Device Manager, один на вашому комп'ютері, а інший на Android мобільному пристрої.
На комп'ютері буде налаштовано ПРРО та принтер (за потреби), а на телефоні лише tap2phone або термінал у смартфоні.
В такому разі коли покупець розраховується картою - облікова система відправляє API запит на оплату на Device Manager на телефоні, після завершення оплати у відповідь на запит отримує дані про операцію та відправляє запит на Device Manager на пк на фіскалізацію чеку уже із даними про операцію та його друку після фіскалізації.
Так як даний варіант роботи передбачає з'єднання по локальній мережі комп'ютера з мобільним Device Manager, можливі проблеми зі зміною динамічної IP адреси пристрою після його перепідключення до wi-fi мережі, а також це унеможливлює відправку API запитів на телефон за відсутності wi-fi.
Щоб вирішити ці "моменти" можливий альтернативний варіант підключення до мобільного Device Manager

При використанні даної схеми у вас так само буде 2 екземпляри Device Manager, один на вашому комп'ютері, а інший на Android мобільному пристрої, проте в такому разі коли покупець розраховується картою - облікова система відправляє API запит на оплату на Device Manager на телефоні через кабінет Вчасно.Каса.
В такому випадку зміна IP мобільного пристрою чи відсутність wi-fi не повпливають на роботу. Головне щоб ПК був підключений до інтернету за допомогою кабелю та був наявний мобільний інтернет на телефоні.
Деталі по налаштуванню і роботі по даній схемі:

Для використання терміналу у смартфоні від Приватбанку:
Детальна інструкція з налаштування розміщена на сайті Приватбанку.
Для використання терміналу у смартфоні від Monobank:
Детальна інструкція з налаштування розміщена на сайті Monobank.
Далі необхідно виконати налаштування терміналу у смартфоні у кабінеті Вчасно.Каса на вкладці Еквайринг.
Після налаштування терміналу у смартфоні потрібно сформувати та скопіювати його токен.


Далі необхідно встановити Device Manager на ваш телефон чи планшет.
Одразу після запуску потрібно надати додаткові дозволи для застосунку:
Наразі при запуску всі дозволи одразу запитуватись не будуть, вони були перенесені у окремий пункт Дозволи зліва зверху.
По відкриттю даного розділу буде відображено перелік необхідних дозволів.

Потрібно надати перші 3, а саме:
Робота застосунку у фоновому режиміСповіщенняВідображення поверх інших застосунківЗвертаємо увагу що дозвіл на Сповіщення та Відображення поверх інших застосунків на старіших версіях Android надаються системою автоматично без додаткових дій.
Після того як всі дозволи були надані для створення терміналу у смартфоні переходимо на сторінку підключення пристроїв.
За посиланням http://localhost:3939/dm/dashboard (у разі налаштування через браузер на мобільному пристрої) або можна перейти через інтерфейс ПРРО

Натискаємо ДОДАТИ НОВИЙ ПРИСТРІЙ або на знак + зверху справа.
У вікні вводимо унікальну назву для вашого терміналу у смартфоні яка буде використовуватись для відправки запитів на оплату. Рекомендовано використовувати назву без пробілів та спец символів. Далі обираємо тип "Термінал у смартфоні" і натискаємо НАСТУПНИЙ КРОК

У поле "Токен терміналу у смартфоні" потрібно додати скопійований токен у кабінеті Вчасно.Каса на вкладці "Еквайринг" та натиснути "Створити".

Якщо вказано унікальну назву та токен вказано коректно, буде додано термінал у смартфоні.
Після відкриття сторінки з налаштуваннями можна на даному екрані через "провести операцію по терміналу" здійснити тестову оплату.
Налаштування завершено.
Важливо!
NFC та доступ до розташування або геолокації.kasa.vchasno.ua по порту 443. Якщо блокування наявні - їх потрібно зняти.Доступні операції при роботі за допомогою терміналу у смартфоні можна знайти у загальному описі API роботи з терміналами
Структура запитів і відповіді при роботі з tap2phone практично не відрізняється від процесу роботи зі звичайними терміналами, за виключенням тощо що:
info.cancelid.Більш наглядно цей процес виглядає так:

Приклад запиту на оплату ("task": 1)
{
"source": "API",
"device": "Privat",
"type": 3,
"pay": {
"task": 1,
"sum": 10.23
}
}
Приклад відповіді на успішну оплату:
{
"transaction_id": "ee52c2ba-1844-4ac7-adec-bdc3597575fc",
"transaction_search": 0,
"info": {
"dt": "20251219145326",
"termid": "M1330I00",
"bankid": "M1330I00",
"bankname": "Приватбанк",
"payid": "420220",
"cancelid": "PAX694566e69ec6d3.09137775",
"refundid": "106064054534",
"cardmask": "4394********0993",
"paysys": "Visa",
"sum": 10.23,
"discount": 0.0,
"sumcash": 0.0,
"curr": "ГРН",
"restxt": "",
"sliptxt": "",
"isprint": 0,
"devinfo": "",
"deb_amount": 0.0,
"deb_num": 0,
"cred_amount": 0.0,
"cred_num": 0,
"canc_amount": 0.0,
"canc_num": 0,
"tx_num": 0,
"receipt": "",
"hstFld63Sf89": "",
"merch": "M1330I00",
"submerch": "",
"reference": "",
"purchase_dt": "20251219145326",
"pan": "",
"acquirerid": "",
"agreementNum": "",
"scenario_data": "",
"transaction_id": "ee52c2ba-1844-4ac7-adec-bdc3597575fc",
"oper_jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9LnsiY2xpZW50X2lkIjoiMTExMSIsImludGVncmF0b3JfaWQiOiIxMTExIiwib3BlcmF0aW9uIjoicGF5IiwiZXhwIjoxMTExLCJhbW91bnQiOjEsImhhc2giOiIzYzY4MTExMTE2M2M1ZjFhNmQ0MTNhMmE2ZDA2NmVmZTljNGU5OGE5NGU1MTgiLCJwdXJwb3NlIjoiIn0unZrld4TeVLNfgYhfTGBpD0nXNHyWwJQJBuKmlbkbyhM",
"commission": 0.0
},
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 1,
"type": 3.0,
"task": 1.0,
"dt": "20251219165339010",
"res": 0,
"res_action": 0,
"errortxt": "",
"aq_errortxt": "",
"warnings": []
}
Приклад запиту на повернення ("task": 2)
Зверніть увагу що в значення ключа refundid передається унікальний ідентифікатор операції на стороні Приватбанку, а не "rrn" чи "код авторизації" операції оплати. За потреби зробити часткове повернення в ключ "sum" передається частина оригінальної суми.
{
"source": "API",
"device": "Privat",
"type": 3,
"pay": {
"task": 1,
"sum": 10.23,
"refundid": "PAX694566e69ec6d3.09137775"
}
}
Приклад відповіді на успішне повернення:
{
"transaction_id": "52a27da5-4bba-4fb3-8a15-a2a4eccbfe22",
"transaction_search": 0,
"info": {
"dt": "20251219145326",
"termid": "M1330I00",
"bankid": "M1330I00",
"bankname": "Приватбанк",
"payid": "420220",
"cancelid": "PAX694566e69ec6d3.09137775",
"refundid": "106064054534",
"cardmask": "4394********0993",
"paysys": "Visa",
"sum": 10.23,
"discount": 0.0,
"sumcash": 0.0,
"curr": "ГРН",
"restxt": "",
"sliptxt": "",
"isprint": 0,
"devinfo": "",
"deb_amount": 0.0,
"deb_num": 0,
"cred_amount": 0.0,
"cred_num": 0,
"canc_amount": 0.0,
"canc_num": 0,
"tx_num": 0,
"receipt": "",
"hstFld63Sf89": "",
"merch": "M1330I00",
"submerch": "",
"reference": "",
"purchase_dt": "20251219145326",
"pan": "",
"acquirerid": "",
"agreementNum": "",
"scenario_data": "",
"transaction_id": "52a27da5-4bba-4fb3-8a15-a2a4eccbfe22",
"oper_jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9LnsiY2xpZW50X2lkIjoiMTExMTEiLCJpbnRlZ3JhdG9yX2lkIjoiMTExMTEiLCJvcGVyYXRpb24iOiJyZWZ1bmQiLCJleHAiOjExMTExMSwiYW1vdW50IjoxLCJoYXNoIjoiM2M2ODYzYzVmMWExMTE2ZDQxMTNhMmE2ZDA2MTZlMWZlOTFjMTRlOThhOTRlNTE4IiwidHJhbnNhY3Rpb25faWQiOiJQQVg2OTQ1NjZlNjllYzZkMy4wOTEzNzc3NSJ9LrHIn0hY9myhb+iSLVzUUWumoN2Hqe+bEbp4l256DgDi",
"commission": 0.0
},
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 1,
"type": 3.0,
"task": 2.0,
"dt": "20251219170510382",
"res": 0,
"res_action": 0,
"errortxt": "",
"aq_errortxt": "",
"warnings": []
}
Приклад запиту на скасування операції ("task": 3)
Зверніть увагу що в значення ключа cancelid передається унікальний ідентифікатор операції на стороні Приватбанку. Часткове скасування з введенням частини суми у даному випадку недоступне.
{
"source": "API",
"device": "Privat",
"type": 3,
"pay": {
"task": 3,
"cancelid": "PAX694566e69ec6d3.09137775"
}
}
Приклад запиту на отримання статусу та даних раніше проведеної операції по терміналу ("task": 17).
Звертаємо увагу що в значення ключа oper_jwt передається oper_jwt що було повернуто у відповідь на операцію оплати чи повернення. У відповідь повернеться JSON ідентичний тому що був на оригінальну оплату чи повернення.
{
"source": "DM_API",
"device": "Privat",
"type": 3,
"pay": {
"task": 17,
"oper_jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9LnsiY2xpZW50X2lkIjoiMTExMTEiLCJpbnRlZ3JhdG9yX2lkIjoiMTExMTEiLCJvcGVyYXRpb24iOiJyZWZ1bmQiLCJleHAiOjExMTExMSwiYW1vdW50IjoxLCJoYXNoIjoiM2M2ODYzYzVmMWExMTE2ZDQxMTNhMmE2ZDA2MTZlMWZlOTFjMTRlOThhOTRlNTE4IiwidHJhbnNhY3Rpb25faWQiOiJQQVg2OTQ1NjZlNjllYzZkMy4wOTEzNzc3NSJ9LrHIn0hY9myhb+iSLVzUUWumoN2Hqe+bEbp4l256DgDi"
}
}
Приклади помилок:
Сума повернення більше ніж сума продажу:
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 3,
"type": 3.0,
"task": 2.0,
"dt": "20251219170642614",
"res": 5000,
"res_action": 1,
"errortxt": "Операція відхилена. Сума операцій на повернення (разом із поточною) більше за суму операції.",
"aq_errortxt": "",
"warnings": []
}
Операцію скасовано (натиснули значок "X" у застосунку tapxphone замість прикладання картки)
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 3,
"type": 3.0,
"task": 1.0,
"dt": "20251219172911897",
"res": 5000,
"res_action": 1,
"errortxt": "Операція відхилена",
"aq_errortxt": "",
"warnings": []
}
Не встановлено застосунок Термінал від Приватбанку
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 3,
"type": 3.0,
"task": 1.0,
"dt": "20251219173426239",
"res": 5000,
"res_action": 1,
"errortxt": "Платіжний застосунок не встановлено",
"aq_errortxt": "",
"warnings": []
}
Не встановлено застосунок Термінал від Приватбанку
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 3,
"type": 3.0,
"task": 1.0,
"dt": "20251219173426239",
"res": 5000,
"res_action": 1,
"errortxt": "Платіжний застосунок не встановлено",
"aq_errortxt": "",
"warnings": []
}
Не коректно вказано ідентифікатор операції при проведенні повернення
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 3,
"type": 1.0,
"task": 2.0,
"dt": "20251222101051673",
"res": 5000,
"res_action": 1,
"errortxt": "Операція відхилена. Не вдалось сформувати заявку на повернення коштів. Спробуйте пізніше.",
"aq_errortxt": "",
"warnings": []
}
Вичерпано час (20 секунд) на очікування запуску Device Manager зі сповіщення для проведення оплати.
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Privat",
"tag": "",
"task_status": 3,
"type": 1.0,
"task": 2.0,
"dt": "20251222101051673",
"res": 5000,
"res_action": 1,
"errortxt": "Вичерпано час очікування запуску застосунку із сповіщення. Повторіть останній запит..",
"aq_errortxt": "",
"warnings": []
}
Приклад запиту на оплату ("task": 1)
{
"source": "API",
"device": "Mono",
"type": 3,
"pay": {
"task": 1,
"sum": 1
}
}
Приклад відповіді на успішну оплату:
{
"transaction_id": "f64059a3-f6f1-4908-9e3e-f55c17ce0947",
"transaction_search": 0,
"info": {
"dt": "",
"termid": "MT028107",
"bankid": "MT028107",
"bankname": "АТ Універсал Банк",
"payid": "990701",
"cancelid": "f64059a3-f6f1-4908-9e3e-f55c17ce0947",
"refundid": "023406045179",
"cardmask": "43943908******93",
"paysys": "visa",
"sum": 1.0,
"discount": 0.0,
"sumcash": 0.0,
"curr": "",
"restxt": "",
"sliptxt": "",
"isprint": 0,
"devinfo": "",
"deb_amount": 0.0,
"deb_num": 0,
"cred_amount": 0.0,
"cred_num": 0,
"canc_amount": 0.0,
"canc_num": 0,
"tx_num": 0,
"receipt": "",
"hstFld63Sf89": "",
"merch": "",
"submerch": "",
"reference": "",
"purchase_dt": "20260421110909",
"pan": "",
"acquirerid": "",
"agreementNum": "",
"scenario_data": "",
"transaction_id": "f64059a3-f6f1-4908-9e3e-f55c17ce0947",
"oper_jwt": "",
"bank_trn_id": "",
"task_orig": 0,
"commission": 0.01
},
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Mono",
"tag": "",
"task_status": 1,
"type": 3,
"task": 1,
"dt": "20260421110924066",
"res": 0,
"res_action": 0,
"errortxt": "",
"aq_errortxt": "",
"warnings": []
}
Приклад запиту на повернення ("task": 2)
Зверніть увагу що в значення ключа refundid обов'язково передавати RRN-код операції оплати. За потреби зробити часткове повернення в ключ "sum" передається частина оригінальної суми.
{
"source": "API",
"device": "Mono",
"type": 3,
"pay": {
"task": 2,
"sum": 1,
"refundid": "023406045179"
}
}
Приклад відповіді на успішне повернення:
{
"transaction_id": "a34d3696-ce57-4950-9c0b-7b7223db1415",
"transaction_search": 0,
"info": {
"dt": "",
"termid": "MT028107",
"bankid": "MT028107",
"bankname": "АТ Універсал Банк",
"payid": "310702",
"cancelid": "a34d3696-ce57-4950-9c0b-7b7223db1415",
"refundid": "023406063088",
"cardmask": "43943908******93",
"paysys": "visa",
"sum": 1.0,
"discount": 0.0,
"sumcash": 0.0,
"curr": "",
"restxt": "",
"sliptxt": "",
"isprint": 0,
"devinfo": "",
"deb_amount": 0.0,
"deb_num": 0,
"cred_amount": 0.0,
"cred_num": 0,
"canc_amount": 0.0,
"canc_num": 0,
"tx_num": 0,
"receipt": "",
"hstFld63Sf89": "",
"merch": "",
"submerch": "",
"reference": "",
"purchase_dt": "20260421111018",
"pan": "",
"acquirerid": "",
"agreementNum": "",
"scenario_data": "",
"transaction_id": "a34d3696-ce57-4950-9c0b-7b7223db1415",
"oper_jwt": "",
"bank_trn_id": "",
"task_orig": 0,
"commission": 0.01
},
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Mono",
"tag": "",
"task_status": 1,
"type": 3,
"task": 2,
"dt": "20260421111025877",
"res": 0,
"res_action": 0,
"errortxt": "",
"aq_errortxt": "",
"warnings": []
}
Приклад запиту на отримання статусу та даних раніше проведеної операції по терміналу ("task": 17).
Звертаємо увагу що в значення ключа cancelid передається cancelid що було повернуто у відповідь на операцію оплати чи повернення.
{
"source": "API",
"device": "Mono",
"type": 3,
"pay": {
"task": 17,
"cancelid": "a34d3696-ce57-4950-9c0b-7b7223db1415"
}
}
У відповідь повернеться JSON ідентичний тому що був на оригінальну оплату чи повернення.
Приклади помилок:
Сума повернення більше ніж сума продажу:
{
"transaction_id": "064c613b-f81f-4cf6-a3d1-a5d2174dffd6",
"transaction_search": 0,
"info": {
"dt": "",
"termid": "MT028107",
"bankid": "MT028107",
"bankname": "АТ Універсал Банк",
"payid": "",
"cancelid": "064c613b-f81f-4cf6-a3d1-a5d2174dffd6",
"refundid": "",
"cardmask": "53721911******88",
"paysys": "mastercard",
"sum": 2.0,
"discount": 0.0,
"sumcash": 0.0,
"curr": "",
"restxt": "",
"sliptxt": "",
"isprint": 0,
"devinfo": "",
"deb_amount": 0.0,
"deb_num": 0,
"cred_amount": 0.0,
"cred_num": 0,
"canc_amount": 0.0,
"canc_num": 0,
"tx_num": 0,
"receipt": "",
"hstFld63Sf89": "",
"merch": "",
"submerch": "",
"reference": "",
"purchase_dt": "20260421114845",
"pan": "",
"acquirerid": "",
"agreementNum": "",
"scenario_data": "",
"transaction_id": "064c613b-f81f-4cf6-a3d1-a5d2174dffd6",
"oper_jwt": "",
"bank_trn_id": "",
"task_orig": 0,
"commission": 0.03
},
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Mono",
"tag": "",
"task_status": 3,
"type": 3,
"task": 2,
"dt": "20260421114851329",
"res": 5000,
"res_action": 1,
"errortxt": "Помилка проведення операції: 308:Сума операції \"Повернення коштів\" перевищує суму операції \"Оплата\". Перевірте дані транзакції \"Оплата\"., код відповіді платіжного застосунку: 54.",
"aq_errortxt": "",
"warnings": []
}
Операцію скасовано (натиснули значок "X" у застосунку tapxphone замість прикладання картки)
{
"transaction_id": "58a69353-faeb-41b4-8a00-9c0be873ee80",
"transaction_search": 0,
"info": {
"dt": "",
"termid": "MT028107",
"bankid": "MT028107",
"bankname": "АТ Універсал Банк",
"payid": "",
"cancelid": "58a69353-faeb-41b4-8a00-9c0be873ee80",
"refundid": "",
"cardmask": "53721911******88",
"paysys": "mastercard",
"sum": 1.0,
"discount": 0.0,
"sumcash": 0.0,
"curr": "",
"restxt": "",
"sliptxt": "",
"isprint": 0,
"devinfo": "",
"deb_amount": 0.0,
"deb_num": 0,
"cred_amount": 0.0,
"cred_num": 0,
"canc_amount": 0.0,
"canc_num": 0,
"tx_num": 0,
"receipt": "",
"hstFld63Sf89": "",
"merch": "",
"submerch": "",
"reference": "",
"purchase_dt": "20260421114624",
"pan": "",
"acquirerid": "",
"agreementNum": "",
"scenario_data": "",
"transaction_id": "58a69353-faeb-41b4-8a00-9c0be873ee80",
"oper_jwt": "",
"bank_trn_id": "",
"task_orig": 0,
"commission": 0.01
},
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Mono",
"tag": "",
"task_status": 3,
"type": 3,
"task": 1,
"dt": "20260421114630838",
"res": 5000,
"res_action": 1,
"errortxt": "Помилка проведення операції: Refusal to tap a card!, код відповіді платіжного застосунку: 54.",
"aq_errortxt": "",
"warnings": []
}
Вичерпано час (20 секунд) на очікування запуску Device Manager зі сповіщення для проведення оплати.
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "Mono",
"tag": "",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20251222101051673",
"res": 5000,
"res_action": 1,
"errortxt": "Вичерпано час очікування запуску застосунку із сповіщення. Повторіть останній запит..",
"aq_errortxt": "",
"warnings": []
}
При використанні терміналу у смартфоні для роботи в пакетному режимі додатково окремо відправляти запит на оплату немає потреби, ДМ це робить автоматично і після фіскалізує чек. Основна вимога це в запиті на формування чеку повернення обов'язково вказувати обов'язкові дані для повернення які потрібні банку.
Нештатні ситуації та їх опрацювання.
Під час роботи, найчастіше у разі проблем з мережею, можливі випадки коли облікова система чи касова програма не зможе отримати відповіді від Device Manager або ж Device Manager не зможе отримати результат виконання операції оплати чи повернення від платіжного застосунку.
На такі випадки рекомендовано реалізувати транзакційний режим.
Транзакційний режим потрібен у випадку якщо облікова чи касова програма не змогла отримати відповіді від Device Manager на відправлений запит. В такому випадку вона може зробити повторний запит з переданим значенням ідентифікатору транзакції і отримати відповідь.
Транзакційний режим при роботі банківськими терміналами