Исходный код 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 GetStateRequest(TBankModel): payment_id: str
[документация] class GetStateResponse(PaymentResponse): pass
[документация] class ConfirmRequest(TBankModel): payment_id: str amount: Optional[Kopecks] = None
[документация] class ConfirmResponse(PaymentResponse): pass
[документация] 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 ChargeResponse(PaymentResponse): pass
[документация] 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 GetQrStateRequest(TBankModel): payment_id: str
[документация] 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 MirPayRequest(TBankModel): payment_id: str
# --- Служебные методы ---
[документация] class CheckOrderRequest(TBankModel): order_id: str
[документация] 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