====== XMLAgent ======
Для зовнішніх програм, що взаємодіють з [[userstats|кабінетом користувача]], підтримується окреме REST API. \\
Починаючи з релізу 1.4.5 **XMLAgent REST API** тепер винесено у окремий клас і додано багацько нових викликів.
Приклади URL для створення запитів до **XMLAgent REST API** (детальніше дивіться в описі кожного запиту нижче):
* **?xmlagent=true** - нутрощі користувача
* **?xmlagent=true&payments=true** - попередні оплати користувача
* **?xmlagent=true&announcements=true** - активні(публічні) оголошення кабінету користувача
* **?xmlagent=true&tickets=true** - всі тікети користувача та відповіді на них
* **?xmlagent=true&opayz=true** - доступні користувачу онлайнові платіжні засоби
* **?xmlagent=true&agentassigned=true** - дані контрагента, асоційованого з користувачем
* **?module=creditor&agentcredit=true&justcheck=true** - просто перевірити можливість встановлення кредиту
* **?module=creditor&agentcredit=true** - попросити кредит на декілька днів
* **?module=paycards&agentpaycards=true&paycard=cardnumber** - поповнити рахунок карткою поповнення з номером cardnumber
За замовчуванням, відповіді XMLAgent, історично, будуть повернуті у вигляді **XML-документу**. \\
Для отримання даних у вигляді **JSON-документу** просто додайте GET параметр **json=true**.
====== Авторизація ======
У випадку, якщо ви не хочете покладатися на примусову авторизацію користувачів за їх IP, наприклад використовуючи ваш додаток поза мережею, ви можете використовувати примусову авторизацію конкретного користувача прямим вказанням логіну та MD5 хешу паролю для всіх запитів у вигляді наступних GET змінних:
* **uberlogin**
* **uberpassword**
І як приклад авторизації користувача з логіном //gen_vj7iyagnzj// та паролем //codr52mv//
?xmlagent=true&uberlogin=gen_vj7iyagnzj&uberpassword=614e8c88061bc45a75fdc1b2eefe1e84
Починаючи з релізу 1.4.7 доступний додатковий базовий рівень так званої "розширеної" аутентифікації, яка використовує **MD5 хеш серійного номеру вашого інстансу UB** як додатковий аутентифікаційний токен, на кшталт [[remoteapi|RemoteAPI]]. Стан ввімкненості розширеної аутентифікації керується опцією [[userstats|userstats.ini]] - [[userstats#xmlagent_extended_auth_on|XMLAGENT_EXTENDED_AUTH_ON]]. \\
Аутентифікаційний токен передається відповідним GET-параметром **uberkey**. \\
Виглядає це все загалом якось так:
?xmlagent=true&uberlogin=gen_vj7iyagnzj&uberpassword=614e8c88061bc45a75fdc1b2eefe1e84&uberkey=6fde545feaaba6952d9cdba84ad26475
Так, як бачимо авторизація за логіном/паролем користувача та розширена аутентифікація доволі чудово собі співіснують в рамках одного запиту. \\
Слід лише мати на увазі, що **авторизація за логіном/паролем користувача** є дещо опціональною і її вимагають далеко не всі запити - на відміну від **розширеної аутентифікації**, ввімкнення якої **зобов'язує** вас використовувати аутентифікаційний токен абсолютно для кожного запиту.
У разі помилки авторизації, ви отримаєте відповідь у вигляді прямого рядка
ERROR_WRONG_UBERAUTH
з HTTP кодом 401 (починаючи з релізу Ubilling 1.2.7)
Примусова авторизація має пріоритет перед усіма стандартними типами авторизації, такими як ip,login,both.
Також ви можете автоматично авторизувати користувача у [[wolfdispatcher|вашому Telegram-боті]], використовуючи посилання вигляду
https://t.me/yourbot/?start=логін_користувача-md5_хеш_паролю
Так, розділювач - символ "-". Вони можуть автоматично генеруватися кабінетом.
====== Трохи про "сесуріті" ======
Невелика порція рекомендацій, які "і так всі знають" - але хрін хто виконує, да. Більшість з них мають починатись зі слів, на кшталт "Завжди пам'ятайте ....", або "Майте на увазі: ....", чи "Не забувайте, що ...." - але ми їх опустимо, бо, погодьтеся, читати їх в кожному рядку - те ще задволення, враховуючи який непосильний труд для більшості людей читати доку взагалі...
* не треба вмикати XMLAgent "просто так" і забувати про нього - потренувались?, більше не треба? - вимкніть
* поточне REST API може працювати без авторизаці, а значить, теоретично, доступ до певних даних вашої БД може отримати будь-хто
* не треба занадто самовпевнено думати, що "тааа - мій **userstats** за NATом - шо там мені загрожує?" - бо це не так
* ніколи не відкривайте XMLAgent "просто в світ" - як мінімум - налаштуйте allowed хости/IP на своєму веб сервері та/або фаєрволі, з яких буде дозволено робити запити до вашого XMLAgent. Можна ще й **reverse-proxy** заюзати - лишнім не буде
====== Приклади запитів та відповідей ======
===== Загальні дані користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true
Зловісненськ Шевченка 56/1
Федір Крюгер
zlo_hev11ap8_0nt6
315
172.30.0.2
26666
0506661488
fred@ourisp.ua
0
No
2887647234
666
Unlim-100
No
0 b
0 b
0 b
active
102
UAH
1
\\
===== Загальні дані користувача але з примусовою авторизацією =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&uberlogin=gen_vj7iyagnzj&uberpassword=614e8c88061bc45a75fdc1b2eefe1e84
Зловісненськ В`язів 56/36
Герасим Герасименко
gen_vj7iyagnzj
0
172.30.0.37
866270
3808268045
0
No
3055434878
Unlim-100
Unlim-100
No
0 b
0 b
0 b
active
No
UAH
1
\\
===== Інформація про попередні платежі користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&payments=true
2020-01-13 13:26:11
50
265
2017-05-25 12:28:43
45
265
2015-06-05 15:59:00
10
255
2015-03-30 13:41:25
100
155
2014-06-24 18:17:59
50
105
2011-10-08 16:03:25
50
55
2011-09-30 18:58:21
5
50
2011-09-03 20:50:30
50
0
===== Платежі користувача, але у вигляді JSON =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&payments=true&json=true
\\
===== Списання коштів з рахунку користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&feecharges=true
Цей виклик підтримує фільтрацію по даті **з - по**. Для цього треба передати відповідні параметри:
* **datefrom=2024-01-11** - дата **з**
* **dateto=2024-01-21** - дата **по**
Ці параметри абсолютно незалежні один від і одного і передавати можна будь-який з них окремо. Відповідно, отримаємо всі записи від "Різдва Христова"(тобто від появи користувача в біллінгу) до **dateto**, або ж від **datefrom** до поточної дати. \\
Також варто зазначити, що в полях **note** та **type** для віртуальних сервісів будуть вказані **Найменування віртуального сервісу**(тобто - найменування тегу) та **virtualsrv** відповідно.
2024-02-28 00:00:00
-9.137931
111.985539
mainsrv
2024-02-29 00:00:00
-9.137931
102.847608
mainsrv
2024-03-01 00:00:01
-8.548387
93.709677
mainsrv
2024-03-01 01:40:00
-30
85.16129
Virtual service Name (tag name)
virtualsrv
\\
===== Активні оголошення кабінету користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&announcements=true
це точно
\\
===== Усі тікети користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&tickets=true
3
2020-09-22 15:37:53
_he12ap1_rkh2
1
0
user reply
2
2020-09-22 15:36:50
NULL
_he12ap1_rkh2
1
0
admin reply
1
2020-09-22 15:36:36
_he12ap1_rkh2
1
my ticket
\\
===== Створення support-тікету (тобто запиту в техпідтримку) =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&ticketcreate=true&tickettype=support_request&tickettext=U29tZSB0aWNrZXQgdGV4dCBmb3Igc3VwcG9ydCB0ZWFt
Так, ви все правильно здогадалися: параметр **tickettext** має містити текст тікету закодований у **BASE64**. \\
Цей запит повертає **created = success** та **ID** створеної support-заявки разі успіху або **created = error** та **ID = 0** у разі невдачі.
success
9
==== Відповідь на support-тікет ====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&ticketcreate=true&tickettype=support_request&reply_id=6&tickettext=U29tZSB0aWNrZXQgdGV4dCBmb3Igc3VwcG9ydCB0ZWFt
Все теж саме, що й у минулому запиті, крім додаткового параметру **reply_id=6**, що має містити **ID** тікета, на який дається відповідь. \\
**Слід мати на увазі**, що **reply_id** має буть саме IDшкою тікету, а не IDшкою якогось вже існуючого реплаю. Тобто, в такого запису в БД поле **replyid** має бути **нуль/NULL/пустим**. \\
Цей запит повертає **created = success** та **ID** створеної support-заявки разі успіху або **created = error** та **ID = 0** у разі невдачі.
success
9
\\
===== Створення signup-тікету (тобто заявки на підключення)=====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&ticketcreate=true&tickettype=signup_request
**ВАЖЛИВО** \\
Це єдиний на даний момент запит, який має відправлятися методом **POST** і "мати при собі" **RAW POST data** у форматі **JSON** наступної структури:
{
"date": "2024-02-29 19:57:50",
"state": 0,
"ip": "app_IP_addr",
"street": "Some_City Some_Street",
"build": "111",
"apt": "222",
"realname": "FirstName LastName",
"phone": "0551234567",
"service": "Internet",
"notes": "Some important notes here"
}
Варто зазначити, що поля **state** та **service** - статичні і їх значення міняти **НЕ треба**. \\
Цей запит повертає **created = success** та **ID** створеної заявки на підключення у разі успіху або **created = error** та **ID = 0** у разі невдачі.
success
9
\\
===== Платіжні системи OpenPayz =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&opayz=true
easypay
http://op.ourisp.com/backend/easypay/?customer_id=3232235528
VISA, MasterCard
mypayprivat
http://op.ourisp.com/backend/mypayprivat/?customer_id=3232235528
VISA, MasterCard
\\
===== Кредитування =====
http://demo.ubilling.net.ua:9999/billing/userstats/?module=creditor&agentcredit=true
У разі успіху ми маємо отримати **status 0**:
0
success
У разі виникнення помилки, отримаємо не нульовий ерроркод із поясненням причини. Наприклад такий, якщо функціонал кредитування відключений у кабінеті користувача зовсім.
1
disabled
Або наприклад, якщо користувач вже використовував кредит у поточному місяці:
9
already used in this month
Або як приклад, те саме але в JSON:
http://demo.ubilling.net.ua:9999/billing/userstats/?module=creditor&agentcredit=true&json=true
Відповідь:
{"status":2,"message":"wrong day"}
Також ви можете здійснити перевірку "тупо можливості" встановлення кредиту, без власне установки його. Існує додатковий параметр **justcheck=true**. Відповіді, що повертаються - ті ж. Використовуватися це повинно як:
http://demo.ubilling.net.ua:9999/billing/userstats/?module=creditor&agentcredit=true&justcheck=true
Можливі коди помилок:
* 0 - все пройшло успішно (success)
* 1 - кредитування вимкнено конфігурацією (disabled)
* 2 - неприпустимий день для кредитування (wrong day)
* 3 - кредит вже встановлений (already have a credit)
* 4 - акаунт заморожений (account frozen)
* 5 - грошей на рахунку достатньо, щоб жити без кредиту (too much money)
* 6 - занадто мало грошей на рахунку для того, щоб жити в кредит (not enough money)
* 7 - несподівана помилка (unexpected error)
* 8 - кредитування не доступне на поточному тарифі (not allowed on this tariff)
* 9 - вже користувалися кредитуванням у поточному місяці (already used in this month)
* 10 - не погасили попередній борг (not paid previous)
Починаючи з релізу Ubilling 1.2.0 набір полів, що повертаються на виклики **agentcredit** істотно розширено:
2
wrong day
Ви можете скористатись цією послугою тільки між 1 та 3 днями місяця
1
3
3
5
UAH
Якщо так сталось і ви не змогли оплатити послугу вчасно, ви можете отримати кредит терміном на 3 доби. Вартість цієї послуги становить: 5 UAH. Також ви зобов`язуєтесь оплатити послуги за поточний місяць у повному обсязі, відповідно до вашого тарифного плану. Додаткові послуги не підлягають кредитуванню.
А саме крім результату в status і message з текстом того, що відбувається, тепер також повертаються:
* fullmessage - повне повідомлення про успіх чи помилку в локалі кабінету за замовчуванням
* minday - початковий день можливості надання послуги кредитування
* maxday - кінцевий день можливості надання послуги кредитування
* creditterm - кількість днів на які буде надано кредит
* creditprice - вартість послуги кредитування
* currency - валюта кабінету користувача
* creditintro - короткий опис послуги в локалі кабінету за замовчуванням
\\
===== Картки поповнення =====
http://demo.ubilling.net.ua:9999/billing/userstats/?module=paycards&agentpaycards=true&paycard=2621506348983057
Якщо все пройшло успішно:
true
Card is successfully used
У разі невдачі:
false
Invalid card
Варто також зауважити, що параметр **paycard** може бути переданий як GET так і як змінна POST. Якщо він не був отриманий, ні в якому вигляді ми отримаємо наступний результат:
false
No card number provided
\\
===== Асоційований з користувачем контрагент =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&agentassigned=true
1
UA1549686521125763214747854
iBank
456522
2564325
6546456456465
11213231
Some city, Some street
Another city, Another street
+380501234567
ФОП Пупкин
Пуп
Пуп1
Пуп2
Just because
some.mail@gmail.com
https://ubilling.net.ua
\\
===== Поточний тариф та всі віртуальні сервіси користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&tariffvservices=true
Some_Cool_tariff
265
month
Reminder
1
0
Some cool vservice
30
30
\\
===== Тарифи, на які користувач може перейти в особистому кабінеті =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&tarifftoswitchallowed=true
Потребує ввімкненого функціоналу самостійної зміни тарифу в особистому кабінеті користувача. \\
Так-так: оті всі опції **TC_*** з [[userstats|userstats.ini]] + [[tariffmatrix|tariffmatrix.ini]]. \\
Виклик повертає дані опції **TC_TARIFFSALLOWED**, якщо тариф користувача міститься в списку **TC_TARIFFENABLEDFROM** або відповідні дані з **tariffmatrix.ini** (знову ж таки, якщо його поточний тариф там фігурує). У всіх інших випадках виклик повертає **нічого**.
30M_50grn_FREE
30M_70grn_Sale
40M_Pon_150grn_N
Mur_100M_150grn
\\
===== Всі поточні активні тарифи та віртуальні сервіси провайдеру =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&activetariffsvservices=true
Є важливий нюанс щодо цього виклику. Оскільки мова йде про "поточні **активні(актуальні)** тарифи та віртуальні сервіси", то цей виклик ігнорує всі тарифи, які додані в список **"непопулярних"** та всі віртуальні сервіси, які позначено як **"архівні"**. Отож - аби цей виклик не вивалював вам абсолютно **ВСІ** наявні тарифи та віртуальні сервіси, а тільки саме ті, які ви хочете, так сказать, представити "публічно" - потурбуйтесь про додавання тарифів, які не треба "світити" до "непопулярних"(так, той самий спеціальний модуль з піктограмою овечки у сайдбарі), а такі ж віртуальні сервіси позначити як "архівні".
MyCoolTarriff1
265
month
MyCoolTarriff2
15
day
MyCoolTarriff3
200
month
SomeVservice
5
14
Reminder
1
0
\\
====== Заморозка/розморозка користувача ======
===== Отримання даних про стан замороженості користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&freezedata=true
Success
1
13
Unlim-5,NEW_40_150_grn
1
-180.677419
10M_200grn
30
frozen
2025-02-25 17:30:34
2025-03-23 17:03:34
1
365
120
26
339
0
120
===== Заморозка користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&dofreeze=true
Тут все доволі просто: може вертати повідомлення або про успішність операції:
Success
User 'SomeUserLogin' has been frozen
або про те, що користувач вже заморожений:
Failure
User 'SomeUserLogin' is already frozen
===== Розморозка користувача =====
http://demo.ubilling.net.ua:9999/billing/userstats/?xmlagent=true&dounfreeze=true
Повністю ідентична по своїй суті процедура до попередньої - тільки рівно з протилежним результатом. Але є важливі нюанси:
* щоби цей виклик в принципі працював опція XMLAGENT_SELF_UNFREEZE_ALLOWED в userstats.ini має бути ввімкненою
* майте на увазі, що ця операція виконується "as is" - без усіляких додаткових перевірок(так, просто в тупу міняється статус користувача) і дозволяє доволі боляче вистрілити собі в ногу. Так що - використовуйте сугубо на власний розсуд.
Успішне виконання поверне ось такий месседж:
Success
User 'SomeUserLogin' has been UNfrozen
якщо ж користувач НЕ заморожений - поверне отаке:
Failure
User 'SomeUserLogin' is already UNfrozen
\\
====== XMLAgent вимкнено конфігурацією ======
У цьому випадку ми отримуємо помилку вигляду
disabled
====== Ввімкнення ======
Потрібно включити відповідну опцію [[userstats|userstats.ini]]
UBA_ENABLED=1