---
title: Paynet Integratsiyasi
description: Paynet'ni PayTechUZ yordamida Python va Django loyihasiga ulash — to'lov havolalari, JSON-RPC webhook, parol almashtirish, sandbox servislar va Django namunasi.
source: https://pay-tech.uz/docs/integrations/paynet
---

# Paynet Integratsiyasi

Paynet to'lovni o'z ilovasida va terminallarida qabul qiladi. U serveringizga
JSON-RPC 2.0 orqali murojaat qiladi: hisobni topadi, to'lovni o'tkazadi va
keyin tekshiradi. Ushbu qo'llanma ikkala tomonni ham PayTechUZ bilan ko'rsatadi.

## O'rnatish

```bash
pip install "paytechuz[django]"
```

## To'lov havolasi

```python
from paytechuz.gateways.paynet.client import PaynetGateway

paynet = PaynetGateway(merchant_id="your_merchant_id")

# Summa tiyinda, ixtiyoriy
link = paynet.create_payment(id="order_123", amount=15000000)
# https://app.paynet.uz/?m=your_merchant_id&c=order_123&a=15000000
```

Havolada qaytish manzili (return URL) yo'q. Kompyuterda QR kod chiqadi,
telefonda Paynet ilovasi ochiladi.

## Django webhook

### Sozlamalar

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

PAYTECHUZ = {
    'PAYNET': {
        'SERVICE_ID': 'your_service_id',
        'USERNAME': 'your_paynet_login',
        'PASSWORD': 'your_paynet_password',
        'ACCOUNT_MODEL': 'shop.models.Order',
        'ACCOUNT_FIELD': 'order_id',   # Paynet params.fields ichida yuboradigan maydon
        'AMOUNT_FIELD': 'amount',      # modelda so'mda; Paynet tiyin yuboradi
        'ONE_TIME_PAYMENT': True,
    },
}
```

`python manage.py migrate` ni ishga tushiring. U `payments` jadvalini va
Paynet almashtiradigan parol saqlanadigan `paynet_service_credentials`
jadvalini yaratadi.

### View

```python
# views.py
from paytechuz.integrations.django.views import BasePaynetWebhookView

from shop.models import Order


class PaynetWebhookView(BasePaynetWebhookView):
    def successfully_payment(self, params, transaction):
        Order.objects.filter(id=transaction.account_id).update(status='paid')

    def cancelled_payment(self, params, transaction):
        Order.objects.filter(id=transaction.account_id).update(status='cancelled')

    def get_check_data(self, params, account):  # ixtiyoriy: GetInformation
        return {'fields': {'amount': int(account.amount)}}
```

```python
# urls.py
path('payments/webhook/paynet/', PaynetWebhookView.as_view(), name='paynet_webhook'),
```

`successfully_payment` to'lov qatori bilan bitta bazaviy tranzaksiya ichida
ishlaydi. U xato bersa, hech narsa yozilmaydi va Paynet `102` oladi — mijozdan
siz qabul qilmagan to'lov uchun pul yechilmaydi.

## Webhook nima javob beradi

| Metod | Xatti-harakat |
| --- | --- |
| `GetInformation` | hisob ma'lumotini beradi; hisob yo'q yoki allaqachon to'langan bo'lsa `302` |
| `PerformTransaction` | hisobni bir marta to'laydi; takroriy `transactionId` uchun `201`, noto'g'ri summa uchun `413`, `transactionId` bo'lmasa `411` |
| `CheckTransaction` | holat `1` to'langan, `2` bekor qilingan, `3` noma'lum |
| `CancelTransaction` | allaqachon bekor qilingan bo'lsa `202`, noma'lum bo'lsa `203` |
| `GetStatement` | `dateFrom`…`dateTo` oralig'idagi to'lovlar (`YYYY-MM-DD HH:MM:SS`), noto'g'ri sana uchun `414` |
| `ChangePassword` | yangi parolni saqlaydi, kamida 8 belgi |

Noto'g'ri login so'rov tanasi o'qilishidan oldin `412` va HTTP 401 oladi.
Sozlamalarda login yoki parol bo'sh bo'lsa, har qanday murojaat rad etiladi.

## Parol almashtirish

Paynet webhook parolini `ChangePassword` bilan almashtiradi. PayTechUZ uni
`PaynetCredential` modelida (yoki `CREDENTIAL_MODEL` ko'rsatgan modelda)
saqlaydi va keyingi murojaatlarni shu parol bilan tekshiradi. `PASSWORD`
sozlamasi faqat birinchi almashtirishgacha amal qiladi, shuning uchun qayta
deploy eski parolni qaytarmaydi.

## Sandbox

Paynet testeri servisingizni tekshirayotgan paytda uni sandbox deb belgilang:

```python
PAYTECHUZ = {
    'PAYNET': {
        'KASSAS': {
            'test': {'SERVICE_ID': '1003', 'USERNAME': '...', 'PASSWORD': '...',
                     'IS_SANDBOX': True},
        },
        # ACCOUNT_MODEL va boshqalar yuqoridagidek
    },
}
```

Har bir murojaat logga yoziladi; to'lovlar yoziladi, lekin
`successfully_payment` o'rniga `sandbox_payment(params, transaction)`
chaqiriladi. To'langan hisob jonli rejimdagidek `302` javob beradi, servis
jonli rejimga o'tgach sandbox qatorlari hisobotga kirmaydi.

Bitta URL'da bir nechta Paynet servisi — [Bir nechta kassa](./multiple-kassas)
sahifasida.

## Qo'shimcha Ma'lumot

- [Bir nechta kassa](./multiple-kassas)
- [Django Integratsiyasi](./django)
- [PayTechUZ GitHub Repozitoriysi](https://github.com/PayTechUz/paytechuz)
