Исходный код tbank.acquiring.models
from __future__ import annotations
from typing import List, Optional
from pydantic import AliasChoices, Field
from tbank.acquiring.enums import (
AccountQrStatus,
AddCardStatus,
CardStatus,
CardType,
CheckType,
FfdVersion,
PaymentMethod,
PaymentObject,
PaymentStatus,
QrDataType,
Tax,
Taxation,
)
from tbank.core.models import Kopecks, TBankModel
# --- Фискализация (чек 54-ФЗ) ---
[документация]
class Payments(TBankModel):
electronic: int # безналичный (обязателен)
cash: Optional[int] = None
advance_payment: Optional[int] = None
credit: Optional[int] = None
provision: Optional[int] = None
[документация]
class ReceiptItem(TBankModel):
name: str # ≤128 символов
price: Kopecks # цена за единицу, копейки
quantity: float # количество (дробное допускается)
amount: Kopecks # Price × Quantity, копейки
tax: Tax
payment_method: Optional[PaymentMethod] = None
payment_object: Optional[PaymentObject] = None
ean13: Optional[str] = None
shop_code: Optional[str] = None
measurement_unit: Optional[str] = None # ФФД 1.2 (обязателен)
[документация]
class Receipt(TBankModel):
taxation: Taxation
items: List[ReceiptItem]
email: Optional[str] = None # нужен хотя бы один из email/phone
phone: Optional[str] = None
ffd_version: Optional[FfdVersion] = None
payments: Optional[Payments] = None
customer: Optional[str] = None # ФФД 1.2
customer_inn: Optional[str] = None # ФФД 1.2
[документация]
class InitRequest(TBankModel):
amount: Kopecks
order_id: str
description: Optional[str] = None
customer_key: Optional[str] = None
success_url: Optional[str] = Field(default=None, alias="SuccessURL")
fail_url: Optional[str] = Field(default=None, alias="FailURL")
notification_url: Optional[str] = Field(default=None, alias="NotificationURL")
redirect_due_date: Optional[str] = None
pay_type: Optional[str] = None
# "Y" — сохранить карту для рекуррента (нужен customer_key)
recurrent: Optional[str] = None
receipt: Optional[Receipt] = None # чек 54-ФЗ
[документация]
class PaymentResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
status: Optional[PaymentStatus] = None
payment_id: Optional[str] = None
order_id: Optional[str] = None
amount: Optional[Kopecks] = None
message: Optional[str] = None
details: Optional[str] = None
[документация]
class InitResponse(PaymentResponse):
payment_url: Optional[str] = Field(default=None, alias="PaymentURL")
[документация]
class ConfirmRequest(TBankModel):
payment_id: str
amount: Optional[Kopecks] = None
[документация]
class CancelRequest(TBankModel):
payment_id: str
amount: Optional[Kopecks] = None
[документация]
class CancelResponse(PaymentResponse):
original_amount: Optional[Kopecks] = None
new_amount: Optional[Kopecks] = None
# --- Рекуррентные платежи и управление клиентами/картами ---
[документация]
class ChargeRequest(TBankModel):
payment_id: str
rebill_id: str
ip: Optional[str] = Field(default=None, alias="IP")
send_email: Optional[bool] = None
info_email: Optional[str] = None
receipt: Optional[Receipt] = None
[документация]
class AddCustomerRequest(TBankModel):
customer_key: str
email: Optional[str] = None
phone: Optional[str] = None
ip: Optional[str] = Field(default=None, alias="IP")
[документация]
class CustomerRequest(TBankModel):
"""Запрос GetCustomer / RemoveCustomer."""
customer_key: str
ip: Optional[str] = Field(default=None, alias="IP")
[документация]
class Customer(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
customer_key: Optional[str] = None
email: Optional[str] = None
phone: Optional[str] = None
message: Optional[str] = None
details: Optional[str] = None
[документация]
class GetCardListRequest(TBankModel):
customer_key: str
saved_card: Optional[bool] = None
ip: Optional[str] = Field(default=None, alias="IP")
[документация]
class Card(TBankModel):
card_id: str
pan: str # маскированный, напр. 518223******0036
status: CardStatus
card_type: CardType
rebill_id: Optional[str] = None
exp_date: Optional[str] = None # MMYY
[документация]
class RemoveCardRequest(TBankModel):
customer_key: str
card_id: str
ip: Optional[str] = Field(default=None, alias="IP")
[документация]
class RemoveCardResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
customer_key: Optional[str] = None
card_id: Optional[str] = None
status: Optional[CardStatus] = None
card_type: Optional[CardType] = None
message: Optional[str] = None
details: Optional[str] = None
# --- СБП / QR ---
[документация]
class GetQrRequest(TBankModel):
payment_id: str
data_type: Optional[QrDataType] = None # PAYLOAD (default) | IMAGE
bank_id: Optional[str] = None # id банка из QrMembersList → deeplink
[документация]
class GetQrResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
order_id: Optional[str] = None
data: Optional[str] = None # payload-ссылка (qr.nspk.ru) или SVG
payment_id: Optional[str] = None
request_key: Optional[str] = None
message: Optional[str] = None
details: Optional[str] = None
[документация]
class QrMembersListRequest(TBankModel):
payment_id: str
[документация]
class QrMember(TBankModel):
member_id: Optional[str] = None # = BankId для GetQr/AddAccountQr
member_name: Optional[str] = None
is_payee: Optional[bool] = None
[документация]
class QrMembersListResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
order_id: Optional[str] = None
members: List[QrMember] = Field(default_factory=list)
message: Optional[str] = None
details: Optional[str] = None
[документация]
class AddAccountQrRequest(TBankModel):
description: str
data_type: Optional[QrDataType] = None
bank_id: Optional[str] = None
redirect_due_date: Optional[str] = None
[документация]
class AddAccountQrResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
data: Optional[str] = None # QR для привязки
request_key: Optional[str] = None
message: Optional[str] = None
details: Optional[str] = None
[документация]
class GetAddAccountQrStateRequest(TBankModel):
request_key: str
[документация]
class AddAccountQrState(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
request_key: Optional[str] = None
account_token: Optional[str] = None # токен привязки для ChargeQr
bank_member_id: Optional[str] = None
bank_member_name: Optional[str] = None
status: Optional[AccountQrStatus] = None
message: Optional[str] = None
details: Optional[str] = None
[документация]
class ChargeQrRequest(TBankModel):
payment_id: str
account_token: str
ip: Optional[str] = Field(default=None, alias="IP")
send_email: Optional[bool] = None
info_email: Optional[str] = None
bank_member_id: Optional[str] = None
receipt: Optional[Receipt] = None
[документация]
class ChargeQrResponse(PaymentResponse):
currency: Optional[int] = None
# --- Отправка чека при подтверждении (двухстадийные платежи) ---
[документация]
class SendClosingReceiptRequest(TBankModel):
payment_id: str
receipt: Receipt
[документация]
class SendClosingReceiptResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
payment_id: Optional[str] = None
status: Optional[str] = None
message: Optional[str] = None
details: Optional[str] = None
# --- Привязка карты (без оплаты) + статус возврата по СБП ---
[документация]
class AddCardRequest(TBankModel):
customer_key: str
check_type: Optional[CheckType] = None
ip: Optional[str] = Field(default=None, alias="IP")
resident_state: Optional[bool] = None
[документация]
class AddCardResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
customer_key: Optional[str] = None
request_key: Optional[str] = None
payment_url: Optional[str] = Field(default=None, alias="PaymentURL")
message: Optional[str] = None
details: Optional[str] = None
[документация]
class GetAddCardStateRequest(TBankModel):
request_key: str
[документация]
class AddCardState(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
customer_key: Optional[str] = None
request_key: Optional[str] = None
status: Optional[AddCardStatus] = None
card_id: Optional[str] = None
rebill_id: Optional[str] = None
message: Optional[str] = None
details: Optional[str] = None
[документация]
class QrState(TBankModel):
"""Статус возврата платежа по СБП."""
success: bool
error_code: str
status: Optional[str] = None # enum статуса возврата — досверить по боевому API
qr_cancel_code: Optional[str] = None
qr_cancel_message: Optional[str] = None
order_id: Optional[str] = None
amount: Optional[Kopecks] = None # сумма возврата, копейки
message: Optional[str] = None
# --- Альтернативные способы оплаты (T-Pay / SberPay / MirPay) ---
[документация]
class AltPayParams(TBankModel):
allowed: Optional[bool] = None # T-Pay status
version: Optional[str] = None # T-Pay: "1.0" / "2.0"
redirect_url: Optional[str] = Field(default=None, alias="RedirectUrl")
web_qr: Optional[str] = Field(default=None, alias="WebQR")
deeplink: Optional[str] = None # MirPay
[документация]
class AltPayResponse(TBankModel):
success: bool
error_code: str
params: Optional[AltPayParams] = None
message: Optional[str] = None
details: Optional[str] = None
# --- Служебные методы ---
[документация]
class CheckOrderPayment(TBankModel):
payment_id: Optional[str] = None
amount: Optional[Kopecks] = None
status: Optional[str] = None # включая AUTH_FAIL и др. — строкой
rrn: Optional[str] = Field(
default=None, validation_alias=AliasChoices("Rrn", "RRN")
)
success: Optional[bool] = None
error_code: Optional[str] = None
message: Optional[str] = None
[документация]
class CheckOrderResponse(TBankModel):
success: bool
error_code: str
terminal_key: Optional[str] = None
order_id: Optional[str] = None
payments: List[CheckOrderPayment] = Field(default_factory=list)
message: Optional[str] = None
details: Optional[str] = None
[документация]
class ResendRequest(TBankModel):
"""Переотправка недоставленных нотификаций (тело без параметров)."""
[документация]
class ResendResponse(TBankModel):
success: bool
error_code: str
count: Optional[int] = None # число нотификаций, поставленных на переотправку
message: Optional[str] = None
details: Optional[str] = None