Kassa qo'llanmasiga qaytish
Tezkor to'lovlar
Tezkor to'lovlar & Xizmatlar
Kassangizni inPAY xizmatlar katalogiga qo'shing — mijoz sizning kartochkangizni bosib, kerakli ma'lumotni (masalan: o'yin ID, login, telefon) kiritib bir necha soniyada to'laydi. Quyida xizmatni merchant panelda qanday sozlash, mijozdan qanday maydon so'rash va to'lov tugagach webhook qabul qilish tushuntirilgan.
8 tagacha
Maxsus maydon
HMAC
Imzolangan webhook
Moderatsiya
Admin tasdig'i
1-bosish
Tezkor to'lov modal
Tezkor to'lov nima? Mijoz tomonidan ko'rinishi
"Tezkor to'lov" — bu inpay.uz/service katalogidagi to'lov oqimi. Mijoz havola yoki kassa yaratishni kutmaydi: u sizning kartochkangizni topadi, modal oynada kerakli maydonlarni to'ldiradi, summani kiritadi va darhol to'laydi. Bu oddiy kassa (API orqali link yaratish) dan farq qiladi — bu yerda hammasi katalog orqali, siz sozlagan maydonlar bilan ishlaydi.
Topadi
Mijoz /service katalogdan kassangizni tanlaydi
To'ldiradi
Siz belgilagan maydonlar + summa modal oynada
To'laydi
Checkout: Click / Payme / karta
Webhook
inPAY sizning webhook'ingizga natijani yuboradi
Merchant panelda sozlash /merchant → kassa → Xizmat to'lovlari
1
Xizmat turi biriktirilishi (admin)
Avval inPAY admin kassangizga xizmat turini (masalan
mobile, internet, gaming) biriktiradi. Biriktirilmagan bo'lsa panelda "Bu merchantga hali xizmat turi biriktirilmagan" deb chiqadi — admin bilan bog'laning.2
Panelni oching
/merchant sahifasiga kiring → kassangizni tanlang → "Xizmat to'lovlari" bo'limini oching. Bu yerda har bir biriktirilgan xizmat turi alohida kartochka bo'lib chiqadi.3
Mijozdan so'raladigan maydonlarni belgilang
Mijoz to'lashda qaysi ma'lumotni kiritishini siz belgilaysiz — masalan
o'yin ID, login, telefon. Har bir maydonga nom (label), kalit (field_key), placeholder va turini bering. Maksimum 8 ta maydon.4
Webhook URL va maxfiy kalit
To'lov muvaffaqiyatli bo'lganda inPAY xabar yuboradigan
webhook_url (faqat https://) va webhook_secret ni kiriting. Secret bo'sh qoldirilsa — tizim avtomatik generatsiya qiladi va sizga ko'rsatadi (uni saqlab qo'ying, imzo tekshiruvida kerak).5
Saqlang → admin tasdig'i
Saqlagach holat pending bo'ladi. Admin tasdiqlagach approved bo'lib webhook ishga tushadi. Eslatma: webhook URL'ni keyin o'zgartirsangiz holat yana
pendingga tushadi va qayta tasdiq talab qiladi.Webhook URL'ingiz domeni avtomatik ravishda kassangizning callback whitelistiga qo'shiladi — alohida qo'shish shart emas.
Maydon (field) sozlamalari mijozdan so'raladigan har bir maydon
| Sozlama | Ma'nosi | Qiymatlar / cheklov |
|---|---|---|
| field_key | Webhook fields ichidagi kalit nomi | faqat a-z 0-9 _, max 80 belgi |
| label | Mijozga ko'rinadigan nom | masalan "O'yin ID", max 120 belgi |
| placeholder | Bo'sh maydondagi namuna matn | ixtiyoriy, max 200 belgi |
| hint | Maydon ostidagi izoh | ixtiyoriy, max 255 belgi |
| input_type | HTML input turi | text / tel / number / email |
| input_mode | Mobil klaviatura rejimi | text / tel / numeric / decimal / email |
| is_required | Majburiymi | 1 (ha) / 0 (yo'q) |
Xizmat webhook formati inPAY → sizning webhook_url
POSTapplication/json
{
"event": "payment.success",
"tx_id": "9f3a8c2b1d4e5f60a1b2c3d4e5f60718",
"merchant_id": "94055",
"service_type": "mobile",
"amount": 5000, // so'm, butun son
"currency": "UZS",
"fields": { // siz belgilagan maydonlar
"phone_number": "998901234567",
"account_id": "player_42"
},
"note": "Mobil to'ldirish",
"paid_at": "2026-06-11 14:30:00"
}
Content-Type: application/json
User-Agent: inPAY-Webhook/1.0
X-inPAY-Event: payment.success
X-inPAY-Tx: 9f3a8c2b1d4e5f60a1b2c3d4e5f60718
X-inPAY-Signature: sha256=<hmac_sha256(body, webhook_secret)>
Imzoni majburiy tekshiring. Imzo
X-inPAY-Signature sarlavhasida sha256=... ko'rinishida keladi va butun JSON tana ustidan hash_hmac('sha256', body, webhook_secret) bilan hisoblanadi. Bu oddiy kassa callbackidan farq qiladi — u yerda oddiy sha256(maydonlar+SALT), bu yerda esa HMAC ishlatiladi. Namuna — webhook qabul qilish + imzo tekshirish merchant tomoni
to'liq namuna
<?php
// service-webhook.php — xizmat to'lovi natijasini qabul qiladi
$secret = 'WEBHOOK_SECRET'; // merchant panelda ko'rsatilgan secret
$body = file_get_contents('php://input');
$hdr = $_SERVER['HTTP_X_INPAY_SIGNATURE'] ?? ''; // "sha256=..."
$got = preg_replace('/^sha256=/', '', $hdr);
// 1) HMAC imzoni qayta hisoblang va solishtiring
$expected = hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $got)) {
http_response_code(403);
exit('bad signature');
}
$data = json_decode($body, true);
// 2) Hodisani ishlang (idempotent — tx_id bo'yicha bir marta!)
if (($data['event'] ?? '') === 'payment.success') {
$tx = $data['tx_id'];
$amount = $data['amount'];
$phone = $data['fields']['phone_number'] ?? null;
// ... mijozga xizmat/mahsulot bering, buyurtmani yoping
}
// 3) Albatta 200 qaytaring — aks holda inPAY qayta uradi (max 6 marta)
http_response_code(200);
echo json_encode(['ok' => true]);
const express = require("express");
const crypto = require("crypto");
const app = express();
const SECRET = "WEBHOOK_SECRET";
// MUHIM: imzo xom tana ustidan hisoblanadi — raw body kerak
app.post("/service-webhook",
express.raw({ type: "*/*" }),
(req, res) => {
const body = req.body.toString("utf8");
const got = (req.get("X-inPAY-Signature") || "").replace(/^sha256=/, "");
const expected = crypto.createHmac("sha256", SECRET).update(body).digest("hex");
if (expected !== got) return res.status(403).send("bad signature");
const data = JSON.parse(body);
if (data.event === "payment.success") {
// data.tx_id, data.amount, data.fields.phone_number ...
}
res.json({ ok: true });
});
app.listen(3000);
Holatlar konfiguratsiya va to'lov
| Joy | Holat | Ma'nosi |
|---|---|---|
| Webhook konfiguratsiyasi merchant_service_config | pending | Saqlandi, admin tasdig'i kutilmoqda — webhook hali ishlamaydi |
| approved | Tasdiqlandi — webhook ishga tushdi | |
| rejected | Rad etildi — admin bilan bog'laning | |
| To'lov service_payments | pending | Mijoz hali to'lamadi |
| success | To'landi — webhook payment.success yuboriladi | |
| failed | To'lov amalga oshmadi |
Qayta urinish. Webhook
2xx javob olmasa inPAY uni 6 martagacha qayta yuboradi. Shu sababli bir tx_id uchun xizmatni faqat bir marta bering (idempotentlik). Qaysi birini tanlash kerak?
| Oddiy kassa (API) | Tezkor to'lov (Xizmat) | |
|---|---|---|
| Qo'llanma | /service_docs | shu sahifa |
| Qachon | O'z saytingiz/botingizda to'lov tugmasi | inPAY katalogida xizmat sotish |
| To'lov yaratish | API: /api/v1/create | Mijoz /service modalda o'zi |
| Mijoz maydonlari | — | Siz belgilaysiz (o'yin ID, login…) |
| Webhook imzosi | sha256(maydonlar + SALT) | HMAC-SHA256(body, secret) |
| Moderatsiya | Kassa tasdiqlanishi yetarli | Webhook alohida tasdiqlanadi |