Skip to main content

Uzum Integratsiyasi

Uzum — O'zbekistonda tez rivojlanayotgan to'lov tizimi. Ushbu qo'llanma Uzum'ni PayTechUZ bilan qanday integratsiya qilishni ko'rsatadi.

O'rnatish​

pip install paytechuz

Asosiy Foydalanish​

Gateway Yaratish​

from paytechuz.gateways.uzum.client import UzumGateway

# Uzum gatewayni ishga tushirish (Biller/open-service)
uzum = UzumGateway(
service_id="your_service_id", # Uzum Service ID
is_test_mode=True # Production muhitida False qilib belgilang
)

To'lov Yaratish​

# Uzum Biller to'lov havolasini yaratish
# URL formati: https://www.uzumbank.uz/open-service?serviceId=...&order_id=...&amount=...&redirectUrl=...
uzum_link = uzum.create_payment(
id="order_123", # Buyurtma ID (order_id parametri)
amount=100000, # so'mdagi summa (tiyinga o'tkaziladi)
return_url="https://example.com/callback" # redirectUrl parametri
)
# Natija: https://www.uzumbank.uz/open-service?serviceId=your_service_id&order_id=order_123&amount=10000000&redirectUrl=https%3A%2F%2Fexample.com%2Fcallback

Django Integratsiyasi​

Settings.py​

PAYTECHUZ sozlamalariga UZUM konfiguratsiyasini qo'shing:

# settings.py
INSTALLED_APPS = [
# ...
'paytechuz.integrations.django',
]

PAYTECHUZ = {
# ... boshqa gatewaylar
'UZUM': {
'SERVICE_ID': 'your_service_id', # Biller URL uchun Uzum Service ID
'USERNAME': 'your_uzum_username', # Webhook Basic Auth uchun
'PASSWORD': 'your_uzum_password', # Webhook Basic Auth uchun
'ALLOWED_IPS': ['...'], # Uzum IP manzillari; bo'lmasa har qandayi qabul qilinadi
'ACCOUNT_MODEL': 'your_app.models.Order',
'ACCOUNT_FIELD': 'id', # yoki 'order_id'
'AMOUNT_FIELD': 'amount',
'ONE_TIME_PAYMENT': True, # Set to False if you want to allow multiple payments for the same invoice
}
}

Views.py​

BaseUzumWebhookView dan meros olib webhook view yarating:

# views.py
from paytechuz.integrations.django.views import BaseUzumWebhookView
from .models import Order

class UzumWebhookView(BaseUzumWebhookView):
def successfully_payment(self, params, transaction):
order = Order.objects.get(id=transaction.account_id)
order.status = 'paid'
order.save()

def cancelled_payment(self, params, transaction):
order = Order.objects.get(id=transaction.account_id)
order.status = 'cancelled'
order.save()

URLs.py​

Webhook URL ni qo'shing. E'tibor bering, Uzum webhooklari URL yo'lida action parametridan foydalanadi:

# urls.py
from django.urls import path
from .views import UzumWebhookView

urlpatterns = [
# ...
path('payments/webhook/uzum/<str:action>/', UzumWebhookView.as_view(), name='uzum_webhook'),
]

Webhook nimani tekshiradi​

Har bir xato HTTP 400, status: FAILED va Uzum'ning errorCode i bilan qaytadi:

KodQachon
10001noto'g'ri login yoki parol, yoki ALLOWED_IPS dan tashqaridagi manzil
10002o'qib bo'lmaydigan JSON (faqat murojaatchi avtorizatsiyadan o'tgach)
10003noma'lum action yoki POST bo'lmagan so'rov
10005majburiy parametr yo'q
10006serviceId shu kassaniki emas
10007hisob mavjud emas
10008hisob allaqachon to'langan
10010bu transId avval kelgan
10011summa hisobnikiga teng emas
10014noma'lum transId
10015tranzaksiya bekor qilingan — create'dan 30 daqiqadan keyin kelgan confirm yoki shu orada to'langan hisob uchun confirm ham uni bekor qiladi
10016allaqachon tasdiqlangan
10017 / 10018qaytarib bo'lmaydi / allaqachon qaytarilgan
99999hook'ingiz xato berdi; hech narsa yozilmadi

successfully_payment confirm bilan bitta bazaviy tranzaksiya ichida ishlaydi. cancelled_payment faqat tasdiqlangan to'lov qaytarilganda chaqiriladi; confirm'dan oldingi reverse hech kimga xabar bermaydi va buyurtma to'lanadigan holatda qoladi.

Ruxsat etilgan IP manzillar​

Uzum aniq manzillardan murojaat qiladi. Ularni har kassa uchun sanab bering:

PAYTECHUZ = {
'UZUM': {
'KASSAS': {
'shop': {'SERVICE_ID': '...', 'USERNAME': '...', 'PASSWORD': '...',
'ALLOWED_IPS': ['...']},
},
'IP_HEADER': 'HTTP_X_REAL_IP', # proxy murojaatchi manzilini qo'yadigan joy
'BEHIND_CLOUDFLARE': True, # CF-Connecting-IP ni faqat Cloudflare'dan o'qish
# ACCOUNT_MODEL va boshqalar yuqoridagidek
},
}

IP_HEADER standart qiymati — REMOTE_ADDR. BEHIND_CLOUDFLARE yoqilganda CF-Connecting-IP faqat so'rovning o'zi Cloudflare'ning e'lon qilingan manzillaridan kelganda hisobga olinadi, shuning uchun uni soxtalashtirib bo'lmaydi.

Sandbox​

IS_SANDBOX: True bo'lgan kassa to'lovlarni yetkazmasdan tasdiqlaydi: successfully_payment o'rniga sandbox_payment(params, transaction) chaqiriladi va buyurtma Uzum testeri uchun to'lanadigan holatda qoladi. Bir nechta kassa sahifasiga qarang.

Qo'shimcha Ma'lumot​