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