O'z kassangizni ulang: uGet
Do'kon kassasi sizniki bo'lib qoladi: o'z cheki, o'z smenasi, o'z fiskalizatsiyasi. uGet unga sodiqlik dasturini qo'shadi — kassir mijozni topadi, to'lovdan oldin chegirma va bonusni ko'radi va savdoni o'tkazadi.
Integratsiya merchant kabinetiga kirish huquqini bermaydi va uning tovarlarini boshqarmaydi. Kalit aynan uchta amalni bajaradi — boshqa hech narsani emas.
Bu to'rt qatorni kassa chek chiqarishdan oldin bitta so'rov bilan oladi.
Kassa nima oladi
Mijozni aniqlash
QR-kod yoki telefon raqami bo'yicha. Javobda — ism va shu merchantdagi ballar balansi.
Chekdan oldin yakunni ko'rsatish
Aksiyalar bo'yicha chegirma, ballarni yechish chegarasi va bo'lajak bonus. Hech narsa yozilmaydi.
Savdoni o'tkazish
Ballar to'lovga yechiladi, keshbek hisoblanadi, sovg'alar beriladi. So'rovni takrorlash xavfsiz.
Chekni qaytarish
Keshbek olib qoʻyiladi, yechilgan ballar mijozga qaytadi, karta toʻlovi ortga qaytariladi.
Birinchi savdogacha uch qadam
Kalitni biznes egasi o'z kabinetida chiqaradi. Kassa dasturchisiga u tayyor holda keladi — uni o'zi chiqara olmaydi.
Egasi kalit chiqaradi
Kabinet → Sozlamalar → Tashqi kassalar API-kalitlari. Egasi savdo nuqtasini va cheklar muallifi bo'lgan xodimni tanlaydi — odatda integratsiya uchun maxsus yaratilgan xodimni.
Siz kalitni saqlaysiz
Kalit aynan bir marta ko'rsatiladi. uGet bazasida faqat uning xeshi qoladi — yo'qolganini tiklab bo'lmaydi, egasi yangisini chiqaradi.
Kassa sarlavha yuboradi
Har bir so'rovda — kalitli sarlavha. Nuqta va chek muallifi kalitning o'zidan olinadi, so'rov tanasida ular yo'q.
ugetpos_a1b2c3_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx └──┬──┘ └─┬──┘ └────────────────┬─────────────────┘ метка префикс секрет — только у вас
Bitta nuqta — bitta kalit
Ikkinchi nuqta uchun egasi ikkinchi kalit chiqaradi. O'z tizimingizda kalitni butun tarmoq uchun bitta umumiy emas, balki nuqta darajasida saqlashni ko'zda tuting.
Sinov maydoni: hoziroq sinab koʻring
Oʻz bazasiga ega alohida nusxa. Quyidagi kalit ochiq — maʼlumotlar bir martalik, bemalol sinang. SMS, push, fiskallashtirish va toʻlovlar u yerda zaglushka rejimida: jarayonni sozlayotganda hech kimga xabar ketmaydi.
curl -H "X-Api-Key: ugetpos_pCfYNh-U_wp7bworxMa7o9y-5a1TJqxdpZJJ7aDScnSvUVDxQnlI" \
"https://sandbox.uget.uz/api/integration/pos/consumers/resolve?phone=%2B998900000001"
→ 200
{ "consumerId": 1, "phone": "+998900000001", "points": "0" }
Nima allaqachon yaratilgan
Bitta nuqtali doʻkon, uchta tovar va «5% keshbek» aksiyasi. Butun jarayonni oʻtish uchun yetarli.
Xaridorlar
Raqamlar +998900000001 … +998900000010. Tasdiqlash kodi doim 112233, SMS yuborilmaydi.
Maʼlumotlar bir martalik
Sinov maydoni vaqti-vaqti bilan qaytadan yaratiladi, shundan keyin kalit oʻzgaradi. Avtotestlarni unga bogʻlamang.
Beshta metod
Ishchi manzil — connect.uget.uz, sinov maydoni — sandbox.uget.uz. Almashinuv JSON, UTF-8. Xatolik tili — Accept-Language sarlavhasi bilan: sukut boʻyicha rus tili, soʻrov boʻyicha oʻzbek lotini.
/api/integration/pos/consumers/resolve
Mijozni topish
Ikki parametrdan biri majburiy: QR-koddagi identifikator yoki xalqaro formatdagi telefon raqami. Mijoz tizimda yo'q bo'lsa — javob 404, bu odatiy holat: chekni anonim sifatida soting.
curl -H "X-Api-Key: $UGET_KEY" \
"https://connect.uget.uz/api/integration/pos/consumers/resolve?phone=%2B998901234567"
→ 200
{ "consumerId": 1024, "name": "Дилшод", "phone": "+998901234567", "points": "45000.00" }
/api/integration/pos/sales/preview
Chek chiqarishdan oldin yakunni ko'rsatish
Hech narsa yozmaydi — savat har o'zgarganda chaqiring. idempotencyKey maydoni bu yerda ishlatilmaydi, lekin majburiy: istalgan bo'sh bo'lmagan satrni yuboring.
curl -X POST -H "X-Api-Key: $UGET_KEY" -H "Content-Type: application/json" \
"https://connect.uget.uz/api/integration/pos/sales/preview" -d '{
"consumerId": 1024,
"idempotencyKey": "preview",
"redeemPoints": "5000.00",
"items": [ { "productId": 512, "qty": "2", "price": "25000.00" } ]
}'
→ 200
{
"goods": "50000.00", стоимость товаров
"discount": "5000.00", скидка по акциям
"payable": "45000.00", к оплате после скидок
"giftsToIssue": 0, сколько подарков выдать
"pointsBalance": "45000.00", баллов у клиента
"maxRedeemPoints": "22500.00", предел списания в этом чеке
"pointsToAccrue": "2250.00" начислим клиенту
}
Bu baho, majburiyat emas. Aksiya tugashi, balans esa o'sha soniyada boshqa kassada o'zgarishi mumkin. Yakunni faqat savdoni ro'yxatga olish qayd etadi va u farq qilishi mumkin. Bu raqamlarni dasturiy tarzda solishtirmang va nomuvofiqlik tufayli savdoni rad etmang.
/api/integration/pos/sales
Savdoni o'tkazish
Ballarni yechadi, keshbek hisoblaydi, sovg'alar beradi. Pul bilan to'lanadigan summa — cashPaid maydoni.
curl -X POST -H "X-Api-Key: $UGET_KEY" -H "Content-Type: application/json" \
"https://connect.uget.uz/api/integration/pos/sales" -d '{
"consumerId": 1024,
"idempotencyKey": "3b0c1e2a-6f1e-4a71-9c1e-7d3a2f5b8c41",
"redeemPoints": "5000.00",
"certificateCode": "WELCOME2026",
"items": [ { "productId": 512, "qty": "2", "price": "25000.00" } ]
}'
→ 201
{
"saleId": 90210,
"goodsAmount": "50000.00",
"discountAmount": "5000.00",
"giftsIssued": 0,
"redeemedPoints": "5000.00",
"cashPaid": "40000.00", взять деньгами
"accrualOperationId": 77431
}
| Maydon | Majburiy | Bu nima |
|---|---|---|
| idempotencyKey | ha | Chek kaliti, 80 belgigacha. Shartnomaning asosiy maydoni — quyida u haqida. |
| items | ha | Chek pozitsiyalari. Miqdor va narx musbat, katalogdagi tovar majburiy emas. |
| consumerId | yo'q | Usiz chek anonim: o'tadi, lekin ballarsiz va sovg'alarsiz. |
| redeemPoints | yo'q | Qancha ball yechish kerak. Oldindan ko'rishdagi chegaradan oshmasin. |
| certificateCode | yo'q | Sertifikat yoki kupon kodi, agar mijoz uni taqdim etgan bo'lsa. |
/api/integration/pos/sales/{saleId}/refund
Chekni qaytarish
Hisoblangan keshbek olib qoʻyiladi, yechilgan ballar mijozga qaytadi, karta toʻlovi ortga qaytariladi. Faqat oʻz nuqtangiz chekini qaytarish mumkin: kalit bitta nuqtaga berilgan, begona chek 404 qaytaradi. Takroriy qaytarish — 422.
curl -X POST -H "X-Api-Key: $UGET_KEY" -H "Content-Type: application/json" "https://connect.uget.uz/api/integration/pos/sales/90210/refund" -d '{ "reason": "Возврат товара" }'
→ 200
{
"saleId": 90210,
"refundedAmount": "45000.00",
"pointsWithdrawn": "1350.00", снятый кешбек
"pointsReturned": "5000.00", возвращённые баллы
"cardRefunded": true
}
/api/integration/pos/sales/{saleId}
Chek holati
Javob paytida aloqa uzilib, chek oʻtgan-oʻtmagani nomaʼlum boʻlganda solishtirish uchun. Soʻrash qayta urishdan arzonroq.
curl -H "X-Api-Key: $UGET_KEY" "https://connect.uget.uz/api/integration/pos/sales/90210"
→ 200
{
"saleId": 90210,
"clientRef": "3b0c1e2a-6f1e-4a71-9c1e-7d3a2f5b8c41",
"consumerId": 1024,
"totalAmount": "45000.00",
"refunded": false,
"occurredAt": "2026-09-05T14:22:11Z"
}
So'rovni takrorlash ikki marta hisoblamasligi kerak
Aloqa uziladi va kassa so'rovni takrorlaydi. Qoida oddiy: bitta chek — bitta kalit, kassir «To'lash» tugmasini bosgan paytda yaratilgan va javob olinguncha saqlangan. Har takrorlashda o'sha kalitni yuboring. Takrorlashdagi yangi kalit ikkinchi chekni yaratadi.
Allaqachon ishlatilgan kalit bilan takrorlash 409 kodini va avval yaratilgan savdo raqamini qaytaradi. Bu muvaffaqiyat, xatolik emas — birinchi so'rov yetib borgan. Savdoni muvaffaqiyatli deb yoping. Kassirga xatolik ko'rsatsangiz — u chekni ikkinchi marta qo'lda o'tkazadi.
→ 409
{
"status": 409,
"title": "Повторная операция",
"existingSaleId": 90210,
"type": "https://docs.uget.uz/errors/conflict"
}
Ключ уникален в пределах мерчанта и живёт вечно:
переиспользовать его для другого чека нельзя
даже через год.
uGet hodisalar haqida oʻzi xabar beradi
Egasi kabinetda HTTPS-manzil kiritadi va maxfiy kalit oladi. uGet har bir sotuv va qaytarishda shu manzilga POST yuboradi — sizning API'ngizdan tashqari oʻtganlari ham: uGet kassasida, mobil ilovada, QR orqali.
| Hodisa | Qachon keladi |
|---|---|
| sale.registered | Chek oʻtkazildi. Tanasida — summalar, yechilgan ballar va pul bilan olinadigan qism. |
| sale.refunded | Chek qaytarildi. Tanasida — olib qoʻyilgan keshbek, qaytarilgan ballar va pul. |
| ping | Kabinetdan manzilni tekshirish. Tanasi boʻsh. |
Nima keladi
POST /uget/events
X-Uget-Event: sale.registered
X-Uget-Timestamp: 1788623531
X-Uget-Signature: 9f2b…c41
{
"saleId": 90210,
"pointId": 7,
"consumerId": 1024,
"goodsAmount": "50000.00",
"discount": "5000.00",
"redeemedPoints": "5000.00",
"cashPaid": "40000.00",
"occurredAt": "2026-09-05T14:22:11Z"
}
Imzoni qanday tekshirish
# HMAC-SHA256 от «timestamp.тело» вашим секретом signature = hmac_sha256(secret, timestamp + "." + raw_body) if signature != header["X-Uget-Signature"]: reject() if now - timestamp > 300: reject() защита от повтора
Tekshirish shart. Imzosiz manzilni bilgan har kim sizga oʻylab topilgan chek yubora olardi. Tanani asl holida, JSON tahlilidan oldin solishtiring: qayta yigʻilgan obyekt boshqa satr va boshqa imzo beradi.
Takrorlar va tartib
2xx javobi — hodisa qabul qilindi. Boshqa har qanday javob yoki taymaut (10 soniya) — uGet qayta uradi: 1, 2, 4, 8 va 16 daqiqa kechikish bilan besh martagacha. Takrorlar sababli bitta hodisa ikki marta kelishi mumkin — saleId'ni hodisa turi bilan birga kalit deb hisoblang. Yetkazish tartibi kafolatlanmaydi: birinchi urinish oʻtmasa, qaytarish sotuvdan oldin kelishi mumkin.
Xatoliklar va takrorlar
Javob formati — Problem Details standarti. Xatolik matni kassirga ko'rsatishga tayyor, uni dasturiy tahlil qilish shart emas: javob kodiga qarang.
| Kod | Qachon | Kassa nima qilishi kerak |
|---|---|---|
| 400 | Bo'sh chek, manfiy narx, na mijoz, na telefon ko'rsatilgan | Sizning so'rovingizda xatolik. Kassirga ko'rsating, takrorlamang |
| 401 | Kalit taqdim etilmagan, noto'g'ri yoki bekor qilingan; merchant bloklangan; muallif-xodim ishdan bo'shatilgan | Takrorlamang. Egasiga yangi kalit kerakligini xabar qiling |
| 404 | Mijoz topilmadi | Anonim chek sifatida soting |
| 409 | Idempotentlik kaliti bo'yicha takror | Muvaffaqiyat deb hisoblang va avvalgi savdo raqamini oling |
| 422 | Biznes qoidasi buzilgan: masalan, ruxsat etilganidan ko'p yechish | Xatolik matnini kassirga ko'rsating |
| 429 | So'rovlar chastotasi chegarasi oshib ketdi | Javobda ko'rsatilgan soniyalardan keyin takrorlang |
| 5xx | uGet tomonidagi nosozlik | O'sha idempotentlik kaliti bilan, ortib boruvchi pauza bilan takrorlang |
401 kodi «kalit yo'q» va «kalit bekor qilingan» holatlarini ataylab ajratmaydi: aks holda saralash yo'li bilan qaysi kalitlar mavjudligini aniqlash mumkin bo'lardi. Oqilona takrorlash sxemasi — bir, uch va o'n soniya pauza bilan uchta urinish, so'ngra kassirga chekni sodiqliksiz o'tkazishni taklif qilish.
Kassa ish tartibi
Kassir savatni to'pladi.
Mijoz QR taqdim etdi yoki telefonini aytdi — uni qidiramiz. Topilmadi, mijozsiz davom etamiz.
Oldindan ko'rishni so'raymiz va chegirma, mavjud ballar va bo'lajak bonusni ko'rsatamiz.
Mijoz qancha ball yechishni tanladi — oldindan ko'rishdagi chegaradan oshmasin.
«To'lash» bosildi — idempotentlik kalitini yaratamiz va uni chek yonida saqlaymiz.
Savdoni o'tkazamiz, pul bilan to'lanadigan summani olamiz, o'z chekimizni chop etamiz. Aloqa uzildi — o'sha kalit bilan takrorlaymiz.
Agar uGet umuman ishlamasa — savdoni odatdagidek, sodiqliksiz o'tkazing. Ballarni keyinchalik hisoblab bo'lmaydi, lekin mijoz kassada cheksiz qolmaydi.
Shartnoma chegaralari
Bular kamchilik emas, ongli qarorlar — loyihalashda hisobga oling.
Smena sizda qoladi
uGet sizning smenangizni yuritmaydi va uning raqamini soʻramaydi: ikki xil smena hisobi birinchi aloqa uzilishidayoq bir-biriga mos kelmay qoladi. Nuqta hisoboti davr ichidagi sotuvlar boʻyicha tuziladi.
Kalit bitta nuqtaga ishlaydi
Nuqta soʻrov tanasidan emas, kalitdan olinadi, begona chekni na oʻqib, na qaytarib boʻladi. Besh nuqtali tarmoq — beshta kalit.
Qisman qaytarish
Qaytarish chek boʻyicha toʻliq amalga oshiriladi. Beshtadan ikkita pozitsiyani qaytarib boʻlmaydi: chekning bir qismi boʻyicha aksiya va sovgʻalarni qayta hisoblash mijozga berilgani bilan mos kelmaydigan natija berardi.
Chastota cheklovlari
Shartnomani oʻzgartirmasdan paydo boʻlishi mumkin. Soʻrovlarning oqilona sur'atini saqlang va 429 kodini qayta ishlang.
Ishga tushirishdan oldingi ro'yxat
Uni jangovar manzilga oʻtishdan oldin sinov maydonida bajaring.
- ✓Kalit himoyalangan konfigda, kodda yoki mobil klientda emas
- ✓Kalit loglarga, jumladan HTTP-so'rovlar logiga tushmaydi
- ✓Kassalar tarmog'ida har bir nuqta o'z kalitidan foydalanadi
- ✓Idempotentlik kaliti chekka bir marta yaratiladi va javobgacha saqlanadi
- ✓Avvalgi savdo raqamli 409 javobi muvaffaqiyat sifatida qayta ishlanadi
- ✓401 javobi cheksiz takrorlarga olib kelmaydi
- ✓Kassir oldindan ko'rishdagi chegaradan ko'p yecha olmaydi
- ✓uGet ishlamasligi savdoni bloklamaydi
- ✓Oldindan ko'rish raqamlari savdo yakuni bilan dasturiy solishtirilmaydi
Kassani ulashga tayyormisiz?
Bizga yozing — sinov kirishida yordam beramiz, shartnomaning bahsli joylarini ko'rib chiqamiz va nuqta egasiga kalit chiqarishni qanday tushuntirishni aytamiz.
Agar siz dasturchi emas, biznes egasi bo'lsangiz — shunchaki bu sahifani kassangizga xizmat ko'rsatadiganlarga bering.