feat(tradein/payments): подпись Token, клиент Т-Банка и сборка чека #2733

Merged
lekss361 merged 1 commit from feat/tradein-payments-tbank-client into main 2026-08-06 12:36:58 +00:00
Collaborator

Summary

PR-C платёжного контура МЕРЫ (Т-Банк эквайринг) — чистый интеграционный слой без роутеров/эндпоинтов/записи в БД:

  • app/services/payments/token.py — подпись Token (sha256, сортировка по ключу, exclude Token/None/dict/list) + verify_notification_token (hmac.compare_digest).
  • app/services/payments/receipt.py — сборка Receipt (ФФД 1.05, услуга): Email/Phone required (хотя бы одно), Taxation, Items[] (Name ≤128, Price/Quantity/Amount в копейках, актуальные ставки НДС 2026 vat22/vat122, без vat20/vat120), PaymentMethod=full_payment, PaymentObject=service.
  • app/services/payments/tbank_client.py — httpx-клиент Init/GetState/CheckOrder/Confirm/Cancel по образцу app/services/tgbot/client.py (таймаут 15с, ретраи на network/5xx, 4xx не ретраится, TBankApiError).

Архитектурное ограничение: модули НЕ импортируют app.core.config — все секреты (terminal_key/password/base_url) принимаются аргументами, чтобы не конфликтовать по файлам с параллельным PR-B (конфиг). Проводка (роутер, _PUBLIC_PATHS, таблицы, статус-машина) — в следующем PR-D.

Эталонные векторы подписи

Оба эталонных вектора из официальной документации Т-Банка подтверждены живым запросом (curl, 2026-08-06) к developer.tbank.ru:

  • Init (/eacq/intro/developer/token) — 72dd466f8ace0a37a1f740ce5fb78101712bc0665d91a8108c7c8a0ccd426db2
  • Нотификация (/eacq/intro/developer/notification) — 1c0964277d0213349243065a0d5b838b8e90d2d25f740d0f2767836e710e80c8

Оба сходятся в tests/test_payments_token.py.

Test plan

  • ruff check — clean
  • ruff format --check — clean
  • pytest tests/test_payments_token.py tests/test_payments_receipt.py tests/services/payments/test_tbank_client.py — 69 passed
  • PR-D (роутер + notify) подключит эти модули и добавит RBAC/интеграционные тесты

Refs mera-tbank-acquiring-recon.md (PR-C из плана §9)

## Summary PR-C платёжного контура МЕРЫ (Т-Банк эквайринг) — чистый интеграционный слой без роутеров/эндпоинтов/записи в БД: - `app/services/payments/token.py` — подпись `Token` (sha256, сортировка по ключу, exclude `Token`/`None`/dict/list) + `verify_notification_token` (`hmac.compare_digest`). - `app/services/payments/receipt.py` — сборка `Receipt` (ФФД 1.05, услуга): Email/Phone required (хотя бы одно), `Taxation`, `Items[]` (Name ≤128, Price/Quantity/Amount в копейках, актуальные ставки НДС 2026 `vat22`/`vat122`, без `vat20`/`vat120`), `PaymentMethod=full_payment`, `PaymentObject=service`. - `app/services/payments/tbank_client.py` — httpx-клиент `Init/GetState/CheckOrder/Confirm/Cancel` по образцу `app/services/tgbot/client.py` (таймаут 15с, ретраи на network/5xx, 4xx не ретраится, `TBankApiError`). Архитектурное ограничение: модули НЕ импортируют `app.core.config` — все секреты (`terminal_key`/`password`/`base_url`) принимаются аргументами, чтобы не конфликтовать по файлам с параллельным PR-B (конфиг). Проводка (роутер, `_PUBLIC_PATHS`, таблицы, статус-машина) — в следующем PR-D. ## Эталонные векторы подписи Оба эталонных вектора из официальной документации Т-Банка подтверждены живым запросом (curl, 2026-08-06) к `developer.tbank.ru`: - Init (`/eacq/intro/developer/token`) — `72dd466f8ace0a37a1f740ce5fb78101712bc0665d91a8108c7c8a0ccd426db2` - Нотификация (`/eacq/intro/developer/notification`) — `1c0964277d0213349243065a0d5b838b8e90d2d25f740d0f2767836e710e80c8` Оба сходятся в `tests/test_payments_token.py`. ## Test plan - [x] `ruff check` — clean - [x] `ruff format --check` — clean - [x] `pytest tests/test_payments_token.py tests/test_payments_receipt.py tests/services/payments/test_tbank_client.py` — 69 passed - [ ] PR-D (роутер + notify) подключит эти модули и добавит RBAC/интеграционные тесты Refs mera-tbank-acquiring-recon.md (PR-C из плана §9)
bot-backend added 1 commit 2026-08-06 12:23:59 +00:00
feat(tradein/payments): подпись Token, клиент Т-Банка и сборка чека
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 3m9s
c55f588cc6
lekss361 merged commit a32ccabd0d into main 2026-08-06 12:36:58 +00:00
lekss361 deleted branch feat/tradein-payments-tbank-client 2026-08-06 12:36:58 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2733
No description provided.