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