Браузер фронта пойдёт с другого origin. Без правильных CORS-заголовков **ничего не заработает** (preflight упадёт, fetch вернёт network error — ровно то, что мы видим сейчас).
Сервер должен на любой `OPTIONS` (preflight) и на ответы реальных запросов отдавать:
```
Access-Control-Allow-Origin: https://<домен-фронта> # либо * для dev
Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS
Этот же путь, отличается шейпом тела (без `amount`, с`code`).
**Заголовок**: `Authorization: {"sessionID":"..."}` обязателен (сессия получателя — того, кто оплачивает).
**Тело**:
```json
{ "fastcheck": "1234-5678-0001", "code": "5864" }
```
**Ответ** `200 { "message": "ok" }` — чек погашен, средства зачислены получателю.
**Ошибки**:
-`404 { "message": "not authorized" }` — сессия невалидна **или** код неверный, **или** чек уже использован, **или** просрочен. (Так в текущей доке. Если можно различать — лучше отдельные сообщения.)
> ⚠️ Серверу важно различать два POST-кейса по наличию поля `amount` vs `code` в теле. Альтернатива (предпочтительнее на проде) — развести на разные пути: `POST /fastcheck` (создание) и `POST /fastcheck/accept` (приём). Если разведёте — скажите, фронт правится за 5 минут.
---
## 3. Интеграция с Telegram-ботом
Фронт сам бот не дёргает — это задача бэкенда.
1. Юзер сканит QR / кликает deeplink → попадает в бот `@DexarSupport_bot`с параметром `?start=<sessionId>`.
2. Бот идентифицирует Telegram-аккаунт (по `from.id`) → находит/создаёт `userId` → биндит его к `sessionId` → ставит `Status: true`, заполняет `userId` и `userSessionId`.
3. Следующий поллинг с фронта вернёт `Status: true` — фронт переходит к `POST /fastcheck`.
Если юзер впервые в боте — стандартный onboarding, потом всё то же самое.
- [ ] Сессии экспайрятся (5–10 мин для websession, разумный TTL для userSession).
- [ ] Rate-limit на `GET /websession/:id` (фронт поллит каждые 3 с) и на `POST /fastcheck`.
---
## 5. Открытые вопросы (нужны ответы от бэкенда)
1.**Единица `amount`**: рубли или копейки?
2.**Currency**: какие коды поддерживаете кроме `RUB`? (фронт уже умеет показывать, но шлёт пока только RUB)
3.**Merchant callback** для эквайринга: после успешного `POST /fastcheck (accept)` нужно ли серверу самому пинговать мерчант-вебхук, или это полностью на фронте через `?return_url=`?
4.**Различение ошибок accept**: можно ли вместо общего `404 not authorized` отдавать `not found` / `wrong code` / `already used` / `expired`?