ТЗ - куар для UA банков
Речь про: https://bots.duckholding.com/partners/3/bank-infos
Сейчас у партнёров генерируется QR для оплат по реквизитам в РФ банки.
Партнер должен уметь генерировать QR для украинских банков.
Код генерации куаров
import base64
import qrcode
from pathlib import Path
def base64url_utf8(value: str) -> str:
return base64.urlsafe_b64encode(value.encode("utf-8")).decode().rstrip("=")
def create_ukraine_iban_qr_payload(
receiver_name: str,
iban: str,
recipient_code: str,
payment_purpose: str,
amount: str | None = None,
) -> str:
amount_line = f"UAH{amount}" if amount else ""
open_structure = "\n".join([
"BCD",
"002",
"1", # UTF-8
"UCT",
"", # BIC, reserved
receiver_name,
iban,
amount_line,
recipient_code,
"", # Ціль, reserved
"", # Reference, reserved
payment_purpose,
"", # Display
]) + "\n"
encoded = base64url_utf8(open_structure)
return f"https://bank.gov.ua/qr/{encoded}"
def save_qr_png(payload: str, output_path: str = "ukraine_iban_qr.png") -> None:
qr = qrcode.QRCode(
version=None, # авторазмер
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10,
border=4,
)
qr.add_data(payload)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(output_path)
payload = create_ukraine_iban_qr_payload(
receiver_name="ТОВ «Test Company»",
iban="UA123456789012345678901234567",
recipient_code="12345678", # ЄДРПОУ / РНОКПП
amount="1000",
payment_purpose="Оплата за рахунком №INV-123 від 09.07.2026, без ПДВ",
)
save_qr_png(payload, "ukraine_iban_qr.png")
print("QR payload:")
print(payload)
print("Saved to ukraine_iban_qr.png")
Для партнёра уже известны
receiver_name="ТОВ «Test Company»",
recipient_code="12345678", # ЄДРПОУ / РНОКПП
Также как и в РФ у нас остаётся
payment_purpose="Счёт-поручение / Ордер",
но с переводом на украинский
Параметр
iban="UA123456789012345678901234567",
зависит от банка