Тема
03.01 Merchant Creates Deposit
Статус: черновик для обсуждения
1. Назначение документа
Этот документ описывает user journey создания deposit transaction в новой системе.
Flow должен покрывать создание deposit через:
- merchant API;
- Back Office platform admin;
- Back Office merchant user.
Основной production flow - создание deposit через merchant API.
2. Actors
Merchant API Client
Система merchant, которая вызывает API новой платежной системы.
Platform Admin
Пользователь Back Office, который может создать test deposit из platform/admin context, если у него есть соответствующая permission.
Merchant User
Пользователь Back Office / Merchant section, который может создать deposit из merchant context, если у него есть соответствующая permission.
Customer
Пользователь, который открывает hosted payment form и завершает payment flow.
3. Goal
Создать deposit transaction, получить hosted payment URL и дать customer возможность завершить payment flow.
4. Entry Points
Merchant API
Основной endpoint:
text
POST /api/v2/depositEndpoint общий для всех deposit methods. Merchant не вызывает provider-specific endpoint.
paymentMethodId определяет, какой payment method configuration используется. Например, Cards, Apple Pay, Google Pay, Sofort Uber или BLIK.
Back Office
Back Office должен позволять создать deposit:
- platform admin;
- merchant user.
Для обоих случаев действие должно быть permission-based.
5. Required Request Data
Если merchant не передал обязательные поля, request должен быть отклонен без создания transaction.
Обязательные поля:
Merchant
merchant.idpaymentMethodIdbrandIdtransactionIduserIdwebhookUrls
Redirect URLs
redirectUrl.successredirectUrl.pendingredirectUrl.cancelredirectUrl.fail
Amount
amount
Currency
currency
Customer
customer.emailcustomer.countrycustomer.firstNamecustomer.lastName
6. Field Rules
brandId
brandId обязателен всегда.
Даже если у merchant один brand, request должен явно указывать brand.
paymentMethodId
paymentMethodId - это UUID, который ссылается на configuration платежного метода.
Merchant не передает тип метода строкой вроде CARDS или BLIK. Тип метода определяется через configuration, на которую указывает paymentMethodId.
transactionId
transactionId передается merchant и должен быть уникальным в контексте merchant.
Это не idempotency key в классическом смысле.
Если merchant повторно отправляет request с тем же transactionId, система должна вернуть ошибку, что такая запись уже существует.
7. Happy Path
- Merchant отправляет
POST /api/v2/deposit. - Система валидирует merchant authentication.
- Система проверяет обязательные поля request.
- Система проверяет, что
transactionIdеще не существует. - Система проверяет, что
brandIdпринадлежит merchant. - Система проверяет, что
paymentMethodIdдоступен для указанного brand. - Система создает transaction со статусом
CREATED. - Система запускает routing для выбранного payment method configuration.
- Система определяет routing path.
- Система определяет MASTER MID / SUB MID GROUP / SUB MID или SUB MID AGGREGATOR.
- Система проверяет, какие дополнительные attributes нужны выбранному provider method.
- Система создает hosted payment session.
- Система возвращает merchant response:
- hosted payment URL;
- internal transaction ID;
- merchant transaction ID;
- status.
- Customer открывает hosted payment URL.
- Hosted payment form продолжает payment flow.
8. Response
При успешном создании deposit система должна вернуть:
- hosted payment URL;
- internal transaction ID;
- merchant transaction ID;
- status.
Hosted payment URL должен возвращаться всегда, если transaction была создана успешно.
status в успешном response должен быть текущим status transaction. Обычно после создания это:
text
CREATEDexpiresAt в create deposit response не возвращается в MVP.
Payment session token отдельно не возвращается. Token находится только внутри hosted payment URL.
9. Initial Status
Сразу после создания transaction получает статус:
text
CREATEDCREATED означает, что transaction создана в системе, но customer еще не завершил payment flow.
10. Validation Errors Before Transaction Creation
Если merchant не передал обязательные поля, transaction не создается.
Примеры:
- не передан
brandId; - не передан
paymentMethodId; - не передан
transactionId; - не передан
webhookUrls; - не переданы обязательные redirect URLs;
- не передан
amount; - не передана
currency; - не переданы обязательные customer fields;
- merchant authentication failed.
В этих случаях система возвращает API error без создания transaction.
11. Duplicate transactionId
Если merchant повторно отправляет request с уже существующим transactionId, система не создает новую transaction.
Система должна вернуть ошибку:
text
Transaction with this transactionId already exists.Точный error code должен быть определен в error mapping / API error dictionary.
12. Routing Not Found Or Payment Method Unavailable
Если обязательные request fields валидны, но routing не найден или payment method недоступен, transaction создается и получает статус:
text
REJECTEDCustomer должен быть перенаправлен на redirectUrl.fail.
Transaction timeline должна зафиксировать причину rejection.
13. Dynamic Attributes
Если merchant передал все обязательные поля для создания transaction, но выбранный SUB MID / provider method требует дополнительные attributes, система не должна отклонять create deposit request.
В этом случае:
- Transaction создается.
- Hosted payment URL возвращается merchant.
- Hosted payment form дособирает недостающие fields у customer.
Собирать можно любые дополнительные fields, которые нужны конкретному provider method.
Список таких fields определяется provider method requirements.
14. Status For Missing Dynamic Attributes
Если transaction ожидает дополнительные fields от customer на hosted payment form, нужен отдельный статус.
Рабочее название статуса:
text
WAITING_CUSTOMER_DATAЭтот статус означает, что transaction создана, но не может быть отправлена дальше в provider execution, пока customer не заполнит обязательные дополнительные fields.
Название статуса нужно отдельно утвердить в Transaction Lifecycle документе.
15. Expiration
Transaction должна иметь expiration.
Для MVP:
- default expiration: 30 минут;
- expiration time может изменяться через environment variables;
- expiration относится к transaction, а не только к hosted payment form.
Если transaction expired на нашей стороне, она должна перейти в статус:
text
CANCELEDExpiration также может зависеть от SUB MID configuration, если такая настройка используется.
16. Webhook URLs
Merchant обязан передать webhookUrls при создании transaction.
Для MVP поддерживается список webhook URLs.
Если webhookUrls не переданы, request должен быть отклонен без создания transaction.
17. Redirect URLs
Merchant обязан передать redirect URLs:
- success;
- pending;
- cancel;
- fail.
Redirect URLs используются в payment flow. В стандартном случае они передаются provider, и provider выполняет redirect customer на нужный merchant URL.
Если обязательные redirect URLs не переданы, request должен быть отклонен без создания transaction.
18. Merchant Webhooks
Merchant webhooks отправляются:
- на
PROCESSING, если этот status пришел от provider как meaningful intermediate status; - на final statuses.
Final statuses:
COMPLETED;FAILED;CANCELED;REJECTED.
19. Transaction Timeline
Transaction timeline должна фиксировать:
- deposit create request received;
- validation result;
- transaction created;
- initial status
CREATED; - routing started;
- routing result;
- hosted payment session created;
- hosted payment URL generated;
- missing dynamic attributes, если есть;
- rejection reason, если transaction стала
REJECTED; - expiration event, если transaction стала
CANCELED.
20. Acceptance Criteria
Use case считается реализованным, если:
- Merchant может создать deposit через
POST /api/v2/deposit. - Platform admin может создать deposit из Back Office при наличии permission.
- Merchant user может создать deposit из Back Office при наличии permission.
brandIdобязателен всегда.paymentMethodIdявляется UUID configuration платежного метода.transactionIdдолжен быть уникальным.- Повторный request с тем же
transactionIdвозвращает ошибку. - Если обязательные fields отсутствуют, transaction не создается.
- Если webhookUrls отсутствуют, transaction не создается.
- Если обязательные redirect URLs отсутствуют, transaction не создается.
- Успешный response содержит hosted payment URL, internal transaction ID, merchant transaction ID и status.
- Успешный response не содержит
expiresAt. - Payment session token отдельно не возвращается.
- Успешно созданная transaction получает статус
CREATED. - Если routing не найден, transaction создается со статусом
REJECTED. - Если routing не найден, customer перенаправляется на
redirectUrl.fail. - Если provider method требует дополнительные fields, hosted payment form дособирает их.
- Если transaction ожидает дополнительные fields, используется отдельный статус, например
WAITING_CUSTOMER_DATA. - Transaction expiration по умолчанию 30 минут и настраивается через environment variables.
- При expiration transaction получает статус
CANCELED. - Merchant webhooks отправляются на
PROCESSING, если он пришел от provider, и на final statuses.