Онбординг коммерции в Cloud
Прежде чем рынок сможет продавать платный план, оператор Cloud публикует коммерческий каталог и выпускает рынок. Всё делается в разделе Консоль оператора → Коммерческий каталог пятью пронумерованными шагами. Каждая запись просит недавнее подтверждение паролем и попадает в журнал аудита.
Панель Готовность вверху раздела перечисляет все условия продажи для продавца, рынка и валюты и показывает, чего ещё не хватает. Когда всё зелёное, клиенты этого рынка могут покупать через Подписка.
Держите у продавца один рынок на валюту. Клиент рынок не выбирает: его согласие с условиями записывается для того единственного рынка, который продаёт в валюте его аккаунта. Если в одной валюте открыты два рынка, рынок неоднозначен, согласие не записывается и новые клиенты не могут купить; панель готовности называет второй рынок, чтобы его можно было закрыть.
Кто что делает
| Роль | Кто назначает | Что публикует |
|---|---|---|
| Администратор площадки | повышение через CLI оператора | назначает две роли ниже |
| Финансовый одобряющий | администратор площадки | юридического продавца, публичные цены, финансовое одобрение выпуска рынка |
| Privacy-советник | администратор площадки | политику рынка (налог и фискализация), одобрение выпуска рынка со стороны советника |
Администратор площадки не может назначить себя. Выпуску рынка нужны оба одобрения от двух разных людей.
Шаг 1 — Назначьте одобряющих
Введите e-mail пользователя, выберите роль и нажмите Назначить. У пользователя уже должен быть подтверждённый аккаунт Cloud и доступ оператора. Аккаунт без доступа оператора отклоняется с кодом target_not_operator — сначала выдайте доступ. Отозвать снимает роль; опубликованное ранее остаётся.
Шаг 2 — Опубликуйте юридического продавца
Код продавца (например, mockarty), страна, юридическое название и статус. Повторная публикация того же кода меняет статус; продавец никогда не удаляется.
Шаг 3 — Опубликуйте политику рынка
Privacy-советник публикует политику для пары продавец × рынок: ставку НДС, фискализацию и дату пересмотра. Каждая публикация — новая ревизия; прошлая утверждённая ревизия отзывается автоматически, так что у рынка всегда ровно одна действующая политика.
Шаг 4 — Опубликуйте публичные цены
Финансовый одобряющий публикует одну цену на план, рынок и валюту с периодом оплаты и датой начала. Новая цена закрывает предыдущую с даты своего начала — цены не пересекаются.
Для инфраструктурных единиц нужен ещё один шаг. Опубликуйте цену пополнения для плана wallet-topup-infra с периодом Разово, затем в форме Ставка инфраструктурной единицы под формой цены выберите эту цену и задайте цену одной единицы и нашу себестоимость одной единицы. Форма предлагает только цены пополнения, у которых ещё нет ставки. Пока ставки нет, витрина пополнений не продаёт инфраструктурные единицы, а у клиентов, включивших оплату раннер-минут сверх тарифа, остаётся жёсткий стоп.
Шаг 5 — Выпустите рынок
Пакет свидетельств закрепляет текущую версию условий, политику рынка, цену выбранного плана и текущие версии платёжного и фискального коннекторов. Сначала настройте эти коннекторы в разделе Коннекторы платформы (см. Коннекторы платформы Cloud) с кодом продавца, рынком и режимом, которые соответствуют контуру выпуска: sandbox берёт коннекторы в режиме test, production — в режиме live.
- Нажмите Показать состояние — панель перечислит, что закрепит пакет и чего не хватает.
- Нажмите Создать пакет и гейт в своей роли.
- Одобрите гейт в своей роли, затем попросите второго человека одобрить в его роли.
Когда оба одобрения записаны, гейт показывает Выпущен, а панель готовности становится зелёной. Любое последующее изменение закреплённых артефактов — новая цена, политика или версия коннектора — требует нового выпуска.
Что видит клиент
Покупатель принимает текущие условия при входе; это принятие становится договорным свидетельством продажи, поэтому второго согласия при оформлении нет. Подписка создаёт заказ и счёт. Оплата через провайдера перенаправляет к нему, а оплата целиком с промо-баланса завершается без перенаправления. В обоих случаях счёт становится paid и план активируется только после подтверждения расчёта. Действия возврата в кабинете нет: отменённый тариф работает до конца оплаченного периода, а ошибочное списание разбирает поддержка. Если сохранённый счёт временно не удаётся прочитать, кабинет сообщает об ошибке, а не утверждает, что счёта нет.
Каждую новую редакцию условий публикуйте с новым числовым номером, например v2 после v1. Повторное использование того же номера под другой меткой (v1b или v01) отклоняется: при изменении документа клиент должен принять действительно новую редакцию.
Для первой продажи должен быть однозначно определён рынок. Если новому платёжному аккаунту подходят несколько рынков, оформление останавливается, а не выбирает юридический регион за покупателя. До покупки обратитесь в поддержку: повторное принятие условий не устранит неоднозначность.
Настройка развёртывания
Платное оформление включается переменной CLOUD_API_BILLING_MODE=provider у Cloud API. Значение по умолчанию free оставляет каталог редактируемым, но отклоняет платное оформление.
Одного выбора provider недостаточно, чтобы развёртывание могло принимать деньги. Для реального списания нужны ещё CLOUD_API_ENV=prod и CLOUD_API_LIVE_PAYMENTS=true; если хотя бы одного нет, оформление остаётся в тестовом режиме, а клиенту сообщается, что для рынка нет одобренного sandbox-релиза. Это сделано намеренно: эквайринг, который ещё не подключён, не должен получить списание из-за того, что переменную окружения поменяли по другой причине. Пополнение по промокоду и все пути списания работают независимо — этого контура они не касаются.
Учёт тарифов на новом развёртывании
Лимиты считаются с первого запроса развёртывания — ничего сверять или включать отдельно не нужно. Каждой реплике Shared runtime нужны внутренние адреса Cloud API для четырёх служб учёта — SAAS_RUNTIME_CLOUD_FLOW_GRANT_URLS (месячные запросы, минуты раннера и исходящий трафик), SAAS_RUNTIME_CLOUD_MOCK_STOCK_URLS (лимит моков счёта), SAAS_RUNTIME_CLOUD_SYNC_STORAGE_URLS (хранилище синхронизации Team) и SAAS_RUNTIME_CLOUD_PROVIDER_CLAIM_URLS (актуальные права на работу, переданную общим провайдерам), — и её прежняя служебная аутентификация. В Helm это runtime.cloudFlowGrantURLs, runtime.cloudMockStockURLs, runtime.cloudSyncStorageURLs и runtime.cloudProviderClaimURLs; без них чарт не отрисуется, а рантайм не запустится.
- Новый мок принимается в пределах лимита платёжного счёта хоста; удаление мока или папки моков освобождает место, а восстановление из корзины снова требует свободного места.
- Каждый защищённый запрос к рантайму получает месячную квоту от Cloud. Экран «Использование» показывает эти цифры как зарезервированную квоту: выдача может резервировать небольшой блок до того, как израсходована каждая единица, поэтому цифра намеренно консервативна.
- Если Cloud или одна из служб учёта недоступны, новая защищённая работа отклоняется до восстановления; квота не сбрасывается сменой Space или реплик.
- Задание, удерживаемое для проверки прав провайдера, может быть передано только в течение 15 секунд после локального резерва. Затем оно отменяется при восстановлении или очистке по истечении, что освобождает слот провайдера. Отмена удерживаемого задания сама по себе не обещает и не запускает денежный возврат.
API
Все эндпоинты требуют сессию оператора, а для записи — подтверждение step-up и заголовок Idempotency-Key.
| Метод | Путь | Роль, которую проверяет сервер |
|---|---|---|
GET |
/api/v1/cloud/operator/commerce/catalogue |
любой оператор |
GET |
/api/v1/cloud/operator/commerce/readiness?seller=…&market=…¤cy=…&mode=test |
любой оператор |
PUT |
/api/v1/cloud/operator/commerce/authority-roles |
администратор площадки |
PUT |
/api/v1/cloud/operator/commerce/sellers |
финансовый одобряющий |
POST |
/api/v1/cloud/operator/commerce/policies |
privacy-советник |
POST |
/api/v1/cloud/operator/commerce/prices |
финансовый одобряющий |
POST |
/api/v1/cloud/operator/commerce/team-packages |
финансовый одобряющий |
POST |
/api/v1/cloud/operator/commerce/infrastructure-rates |
финансовый одобряющий |
GET |
/api/v1/cloud/operator/commerce/market-release?seller=…&market=…&scope=sandbox&plan=team |
любой оператор |
POST |
/api/v1/cloud/operator/commerce/market-release/bundles |
privacy-советник или финансовый одобряющий |
POST |
/api/v1/cloud/operator/commerce/market-release/gates |
privacy-советник или финансовый одобряющий |
POST |
/api/v1/cloud/operator/commerce/market-release/gates/{gate_id}/approve |
роль, указанная в запросе |
Пакет Team — это цена на 5, 10 или 20 мест, выведенная из опубликованной базовой цены Pro и скидки, в отдельной неизменяемой ценовой линии: более поздняя публикация новой цены Pro не двигает уже опубликованный пакет. В кабинете финансовый одобряющий публикует его формой Пакет Team под формой цены (форма предлагает опубликованные цены Pro на выбор); через API тело называет версию базовой цены, тот же рынок, валюту и период оплаты, seats (5, 10 или 20), discount_bps (0–9999) и effective_from, с заголовком Idempotency-Key. Число мест вне трёх пакетов отвечает 400 bad_request; базовая цена, не являющаяся публичной ценой Pro для этого рынка, валюты и периода, — 409 commerce_catalogue_conflict.
Ставка инфраструктурной единицы называет commerce_price_version_id (открытая цена wallet-topup-infra), customer_rate_minor (цена одной единицы в минимальных единицах валюты, больше нуля), provider_cogs_minor (наша себестоимость одной единицы, ноль или больше) и необязательно rounding_mode (ceil, floor или half_up; по умолчанию ceil). Цена другого продукта или цена, у которой ставка уже есть, отвечает 409 commerce_catalogue_conflict. Опубликованные ставки перечислены в каталоге под ключом infrastructure_rates.
Запись пользователем без роли отвечает 403 authority_role_required. Публикация со ссылкой на несуществующего продавца, план или пользователя отвечает 409 commerce_catalogue_conflict; пакет с недостающими входами — 409 market_release_inputs_missing со списком пробелов.
Если каталог отвечает 503 commerce_catalogue_unavailable, сохраните номер запроса. Временный сбой может пройти при повторе; при неожиданном отказе публикации нужна проверка настройки каталога через поддержку. Кабинет показывает это пояснение на выбранном языке.