Skip to main content

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​

pip install "paytechuz[django]"

To'lov havolasi​

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​

# 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​

# 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)}}
# 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​

MetodXatti-harakat
GetInformationhisob ma'lumotini beradi; hisob yo'q yoki allaqachon to'langan bo'lsa 302
PerformTransactionhisobni bir marta to'laydi; takroriy transactionId uchun 201, noto'g'ri summa uchun 413, transactionId bo'lmasa 411
CheckTransactionholat 1 to'langan, 2 bekor qilingan, 3 noma'lum
CancelTransactionallaqachon bekor qilingan bo'lsa 202, noma'lum bo'lsa 203
GetStatementdateFrom…dateTo oralig'idagi to'lovlar (YYYY-MM-DD HH:MM:SS), noto'g'ri sana uchun 414
ChangePasswordyangi 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:

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 sahifasida.

Qo'shimcha Ma'lumot​