Skip to content

Card Bind Webhook ​

Karta muvaffaqiyatli bog'langandan so'ng Paylov hamkor tizimiga yuboradigan webhook.

Sozlash kerak

Webhook manzili (endpoint) va unga kiradigan Basic Auth login/parol oldindan Paylov bilan birgalikda sozlanadi (merchant profilida saqlanadi). Agar bu hali sozlanmagan bo'lsa, qaysi manzilga va qanday login/parol bilan yuborishni Paylov texnik jamoasiga bildiring.

Request details ​

Method: POST
URL: hamkor tomonidan berilgan webhook URL
Header:

http
Authorization: Basic base64(login:parol)
Content-Type: application/json

Request example

json
{
  "token": "pR3x...kLq9",
  "userId": "partner-user-10234",
  "status": "confirmed",
  "card": {
    "cardId": "b1e2f3a4-...-uuid",
    "userId": "partner-user-10234",
    "owner": "TEST FOYDALANUVCHI",
    "cardName": null,
    "number": "860012******9012",
    "balance": 1500000,
    "expireDate": "2612",
    "bankId": "7",
    "bankName": "Ipoteka Bank",
    "vendor": "uzcard",
    "processing": "Uzcard",
    "status": {
      "is_active": true,
      "status_message": "active",
      "sms_info": true
    }
  }
}

Params

FieldTypeDescription
tokenstringHavola yaratishda olingan token — hamkor tomonida so'rovni aniqlash uchun
userIdstringHamkorning o'zi havola yaratishda bergan userId
statusstringHozircha doim confirmed
card.cardIdstringKeyingi barcha amallarda ishlatiladigan asosiy ID
card.numberstringMaskalangan karta raqami — to'liq PAN hech qachon kelmaydi
card.balanceintegerTiyinda (100 = 1 so'm)

Qabul qiluvchi (receiver) misoli — Python/FastAPI ​

python
import base64
from fastapi import FastAPI, Header, HTTPException, Request

EXPECTED_LOGIN = "partner_webhook"
EXPECTED_PASSWORD = "..."  # Paylov bilan kelishilgan

app = FastAPI()


@app.post("/paylov/card-bind/webhook")
async def card_bind_webhook(request: Request, authorization: str = Header(None)):
    if not authorization or not authorization.startswith("Basic "):
        raise HTTPException(401)
    decoded = base64.b64decode(authorization[6:]).decode()
    login, password = decoded.split(":", 1)
    if login != EXPECTED_LOGIN or password != EXPECTED_PASSWORD:
        raise HTTPException(401)

    payload = await request.json()
    user_id = payload["userId"]
    card = payload["card"]
    # card["cardId"] ni shu userId uchun saqlang
    return {"ok": True}

Eslatma

Webhook javobi 2xx bo'lishi kerak. Agar hamkor tomoni javob bermasa yoki xato qaytarsa, Paylov buni faqat log'da qoldiradi — qayta avtomatik urinish hozircha yo'q. Shu sababli holatni tekshirish so'rovi zaxira sifatida mavjud.