Documentation

    Documentation

    Documentation

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    1. /
    2. /SubscriptionConductor

    Обновлено 30 июн. 2026 г.6 мин прослушивания

    1. /
    2. /SubscriptionConductor

    Обновлено 30 июн. 2026 г.6 мин прослушивания

    1. /
    2. /SubscriptionConductor

    Обновлено 30 июн. 2026 г.6 мин прослушивания

    navigation.docs_sidebar.audience.founderHint

    Добро пожаловать в Ring Platform
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Архитектура
    Data Model
    Real Time
    Security
    Бекенд Сервисы
    Режим k8s-postgres-fcm
    Интеграция Firebase
    Функции
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Messaging
    Notifications
    Push-уведомления через FCM (Ring)
    Протокол Tunnel
    Web3 Кошелек
    Store
    Реферальные коды (Refcodes)
    Интеграция платежей
    PaymentConductor
    SubscriptionConductor
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Система локалей
    Безопасность и соответствие
    NFT Маркетплейс
    Система Стейкинга Токенов
    Паттерны Оптимизации Производительности
    Мобильный Опыт
    API-интерфейс
    Аутентификация
    Email AI-CRM API
    Сущности
    Opportunities
    Messaging
    Notifications
    Wallet
    Store
    Администрирование
    Кастомизация
    Настройка токеномики
    Branding
    Themes
    Web3
    Token launch jurisdictions
    Развёртывание
    Self-hosted развёртывание
    Vercel
    Docker
    Monitoring
    Оптимизация производительности
    Backup
    Разработка
    Локальная настройка
    Code Structure
    Компоненты документации
    Community tooling
    Ring MCP Server
    Генеративные изображения (ImageConductor)
    Автономная редакция (Grok)
    OSS vs enterprise
    Лучшие практики
    Workflow
    Code Style
    Производительность
    Testing
    Развёртывание
    Debugging
    Contributing
    Примеры
    Quick Start
    White Label
    Реальные Проекты
    Интеграции
    Ethereum-кошельки (Wagmi v3)

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и комплаенс
    ringdom.org — база LegioX
    Исходники — лицензия MIT (GitHub)

    navigation.docs_sidebar.audience.founderHint

    Добро пожаловать в Ring Platform
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Архитектура
    Data Model
    Real Time
    Security
    Бекенд Сервисы
    Режим k8s-postgres-fcm
    Интеграция Firebase
    Функции
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Messaging
    Notifications
    Push-уведомления через FCM (Ring)
    Протокол Tunnel
    Web3 Кошелек
    Store
    Реферальные коды (Refcodes)
    Интеграция платежей
    PaymentConductor
    SubscriptionConductor
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Система локалей
    Безопасность и соответствие
    NFT Маркетплейс
    Система Стейкинга Токенов
    Паттерны Оптимизации Производительности
    Мобильный Опыт
    API-интерфейс
    Аутентификация
    Email AI-CRM API
    Сущности
    Opportunities
    Messaging
    Notifications
    Wallet
    Store
    Администрирование
    Кастомизация
    Настройка токеномики
    Branding
    Themes
    Web3
    Token launch jurisdictions
    Развёртывание
    Self-hosted развёртывание
    Vercel
    Docker
    Monitoring
    Оптимизация производительности
    Backup
    Разработка
    Локальная настройка
    Code Structure
    Компоненты документации
    Community tooling
    Ring MCP Server
    Генеративные изображения (ImageConductor)
    Автономная редакция (Grok)
    OSS vs enterprise
    Лучшие практики
    Workflow
    Code Style
    Производительность
    Testing
    Развёртывание
    Debugging
    Contributing
    Примеры
    Quick Start
    White Label
    Реальные Проекты
    Интеграции
    Ethereum-кошельки (Wagmi v3)

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и комплаенс
    ringdom.org — база LegioX
    Исходники — лицензия MIT (GitHub)

    navigation.docs_sidebar.audience.founderHint

    Добро пожаловать в Ring Platform
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Архитектура
    Data Model
    Real Time
    Security
    Бекенд Сервисы
    Режим k8s-postgres-fcm
    Интеграция Firebase
    Функции
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Messaging
    Notifications
    Push-уведомления через FCM (Ring)
    Протокол Tunnel
    Web3 Кошелек
    Store
    Реферальные коды (Refcodes)
    Интеграция платежей
    PaymentConductor
    SubscriptionConductor
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Система локалей
    Безопасность и соответствие
    NFT Маркетплейс
    Система Стейкинга Токенов
    Паттерны Оптимизации Производительности
    Мобильный Опыт
    API-интерфейс
    Аутентификация
    Email AI-CRM API
    Сущности
    Opportunities
    Messaging
    Notifications
    Wallet
    Store
    Администрирование
    Кастомизация
    Настройка токеномики
    Branding
    Themes
    Web3
    Token launch jurisdictions
    Развёртывание
    Self-hosted развёртывание
    Vercel
    Docker
    Monitoring
    Оптимизация производительности
    Backup
    Разработка
    Локальная настройка
    Code Structure
    Компоненты документации
    Community tooling
    Ring MCP Server
    Генеративные изображения (ImageConductor)
    Автономная редакция (Grok)
    OSS vs enterprise
    Лучшие практики
    Workflow
    Code Style
    Производительность
    Testing
    Развёртывание
    Debugging
    Contributing
    Примеры
    Quick Start
    White Label
    Реальные Проекты
    Интеграции
    Ethereum-кошельки (Wagmi v3)

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и комплаенс
    ringdom.org — база LegioX
    Исходники — лицензия MIT (GitHub)
    Документация
    Функции
    Документация
    Функции
    Документация
    Функции

    SubscriptionConductor

    Фильтруйте эту страницу как Founder / Developer в боковой панели. Основатели узнают что стоит каждый провайдер и как настроить комиссии; разработчики — архитектуру, контракты модулей провайдеров и детали cron-пайплайнов.

    SubscriptionConductor (v1, Фаза S4) — мульти-провайдерная система биллинга членских подписок Ring Platform. Один SSOT-реестр (subscription_ledger) отслеживает все состояния подписчиков независимо от способа оплаты. Шесть модулей провайдеров реализуют общий контракт SubscriptionProviderModule, а пять cron-пайплайнов поддерживают подписки актуальными.

    Реализация: lib/payments/subscription/.

    Что получают основатели от SubscriptionConductor

    Ваша платформа зарабатывает регулярный доход через членские подписки — с нулевой комиссией платформы на внутренние методы (кредитный баланс, RING-токен, NFT-гейт). Выберите, какие шлюзы включить, настройте переложение комиссий и отслеживайте чистый доход в админ-панели.

    Статус функций

    ПровайдерДеталиШлюзСтатус
    WayForPayрекуррентный биллинг через recTokenWayForPay (UAH)✅ Доступно
    Кредитный балансавтосписание с внутренних RING-кредитовКредитные баллы✅ Доступно
    RING-токенончейн-платёж в SolanaRING (Токены)✅ Доступно
    StripeStripe Subscriptions APIStripe (USD)🔮 TBD
    NFT-гейт12-месячный доступ через soulbound NFTNFT Сертификат🔮 TBD
    PayPalPayPal рекуррентный биллингPayPal (USD)🔮 TBD

    Тарифы комиссий и чистый доход

    Каждый шлюз удерживает свою комиссию. Внутренние методы (кредитный баланс, RING-токен, NFT-гейт) взимают 0% — каждый доллар идёт вашей платформе.

    ПровайдерКомиссия %Фиксированная комиссияВалюта
    WayForPay2.5%—UAH
    Stripe2.9%$0.30USD
    Кредитный баланс0%—USD
    RING-токен0%—RING (Токены)
    NFT-гейт0%—RING
    PayPal2.9%$0.30USD

    Формула чистого дохода: net = gross - (gross × feePercent / 100) - feeFixed. Функция calculateNetRevenue() в subscription-config.ts вычисляет это на сервере; админ-панель показывает gross, fee и net для каждой подписки.

    Конфигурация (ring-config.json)

    Все настройки провайдеров хранятся в ring-config.json в секции payment.gateways:

    • cardPaymentProcessor — карточный шлюз по умолчанию (wayforpay или stripe). Переопределение через PAYMENT_MEMBERSHIP_PROCESSOR=stripe.
    • supportedMethods — провайдеры, доступные пользователям при оформлении.
    • futureMethods — провайдеры с пометкой "Скоро" в UI.
    • gateways.<provider>.feePercent — процентная комиссия, удерживаемая перед вашим чистым доходом.

    Админ-панель

    Суперадмины имеют доступ к /admin/subscriptions:

    • Список подписок — фильтр по провайдеру, статусу, пользователю; каждая строка показывает gross, fee и net доход.
    • Агрегированная статистика — /api/admin/subscriptions/stats возвращает total_active, due_for_payment, разбивки by_provider и by_method.
    • Отслеживание дохода — calculateNetRevenue() вызывается для каждой строки, чтобы основатели видели реальный доход после комиссий шлюзов.

    Архитектура

    Реестр провайдеров

    Шесть модулей провайдеров реализуют контракт SubscriptionProviderModule (lib/payments/subscription/subscription-types.ts). Conductor определяет их по ID провайдера:

    ID провайдераМодульИсточник
    credit_balanceringCreditSubscriptionProviderproviders/ring-credit-subscription.ts
    ring_tokenringTokenSubscriptionProviderproviders/ring-token-subscription.ts
    stripestripeSubscriptionProviderproviders/stripe-subscription.ts
    wayforpaywayforpaySubscriptionProviderproviders/subscription-provider-stubs.ts
    nft_gatenftGateSubscriptionProviderproviders/subscription-provider-stubs.ts
    paypal

    Связанное

    • PaymentConductor — оркестрация одноразовых платежей
    • WayForPay интеграция
    • Кошелёк и кредиты
    • Магазин — поток оформления членства
    • Админ-панель

    SubscriptionConductor

    Фильтруйте эту страницу как Founder / Developer в боковой панели. Основатели узнают что стоит каждый провайдер и как настроить комиссии; разработчики — архитектуру, контракты модулей провайдеров и детали cron-пайплайнов.

    SubscriptionConductor (v1, Фаза S4) — мульти-провайдерная система биллинга членских подписок Ring Platform. Один SSOT-реестр (subscription_ledger) отслеживает все состояния подписчиков независимо от способа оплаты. Шесть модулей провайдеров реализуют общий контракт SubscriptionProviderModule, а пять cron-пайплайнов поддерживают подписки актуальными.

    Реализация: lib/payments/subscription/.

    Что получают основатели от SubscriptionConductor

    Ваша платформа зарабатывает регулярный доход через членские подписки — с нулевой комиссией платформы на внутренние методы (кредитный баланс, RING-токен, NFT-гейт). Выберите, какие шлюзы включить, настройте переложение комиссий и отслеживайте чистый доход в админ-панели.

    Статус функций

    ПровайдерДеталиШлюзСтатус
    WayForPayрекуррентный биллинг через recTokenWayForPay (UAH)✅ Доступно
    Кредитный балансавтосписание с внутренних RING-кредитовКредитные баллы✅ Доступно
    RING-токенончейн-платёж в SolanaRING (Токены)✅ Доступно
    StripeStripe Subscriptions APIStripe (USD)🔮 TBD
    NFT-гейт12-месячный доступ через soulbound NFTNFT Сертификат🔮 TBD
    PayPalPayPal рекуррентный биллингPayPal (USD)🔮 TBD

    Тарифы комиссий и чистый доход

    Каждый шлюз удерживает свою комиссию. Внутренние методы (кредитный баланс, RING-токен, NFT-гейт) взимают 0% — каждый доллар идёт вашей платформе.

    ПровайдерКомиссия %Фиксированная комиссияВалюта
    WayForPay2.5%—UAH
    Stripe2.9%$0.30USD
    Кредитный баланс0%—USD
    RING-токен0%—RING (Токены)
    NFT-гейт0%—RING
    PayPal2.9%$0.30USD

    Формула чистого дохода: net = gross - (gross × feePercent / 100) - feeFixed. Функция calculateNetRevenue() в subscription-config.ts вычисляет это на сервере; админ-панель показывает gross, fee и net для каждой подписки.

    Конфигурация (ring-config.json)

    Все настройки провайдеров хранятся в ring-config.json в секции payment.gateways:

    • cardPaymentProcessor — карточный шлюз по умолчанию (wayforpay или stripe). Переопределение через PAYMENT_MEMBERSHIP_PROCESSOR=stripe.
    • supportedMethods — провайдеры, доступные пользователям при оформлении.
    • futureMethods — провайдеры с пометкой "Скоро" в UI.
    • gateways.<provider>.feePercent — процентная комиссия, удерживаемая перед вашим чистым доходом.

    Админ-панель

    Суперадмины имеют доступ к /admin/subscriptions:

    • Список подписок — фильтр по провайдеру, статусу, пользователю; каждая строка показывает gross, fee и net доход.
    • Агрегированная статистика — /api/admin/subscriptions/stats возвращает total_active, due_for_payment, разбивки by_provider и by_method.
    • Отслеживание дохода — calculateNetRevenue() вызывается для каждой строки, чтобы основатели видели реальный доход после комиссий шлюзов.

    Архитектура

    Реестр провайдеров

    Шесть модулей провайдеров реализуют контракт SubscriptionProviderModule (lib/payments/subscription/subscription-types.ts). Conductor определяет их по ID провайдера:

    ID провайдераМодульИсточник
    credit_balanceringCreditSubscriptionProviderproviders/ring-credit-subscription.ts
    ring_tokenringTokenSubscriptionProviderproviders/ring-token-subscription.ts
    stripestripeSubscriptionProviderproviders/stripe-subscription.ts
    wayforpaywayforpaySubscriptionProviderproviders/subscription-provider-stubs.ts
    nft_gatenftGateSubscriptionProviderproviders/subscription-provider-stubs.ts
    paypal

    Связанное

    • PaymentConductor — оркестрация одноразовых платежей
    • WayForPay интеграция
    • Кошелёк и кредиты
    • Магазин — поток оформления членства
    • Админ-панель

    SubscriptionConductor

    Фильтруйте эту страницу как Founder / Developer в боковой панели. Основатели узнают что стоит каждый провайдер и как настроить комиссии; разработчики — архитектуру, контракты модулей провайдеров и детали cron-пайплайнов.

    SubscriptionConductor (v1, Фаза S4) — мульти-провайдерная система биллинга членских подписок Ring Platform. Один SSOT-реестр (subscription_ledger) отслеживает все состояния подписчиков независимо от способа оплаты. Шесть модулей провайдеров реализуют общий контракт SubscriptionProviderModule, а пять cron-пайплайнов поддерживают подписки актуальными.

    Реализация: lib/payments/subscription/.

    Что получают основатели от SubscriptionConductor

    Ваша платформа зарабатывает регулярный доход через членские подписки — с нулевой комиссией платформы на внутренние методы (кредитный баланс, RING-токен, NFT-гейт). Выберите, какие шлюзы включить, настройте переложение комиссий и отслеживайте чистый доход в админ-панели.

    Статус функций

    ПровайдерДеталиШлюзСтатус
    WayForPayрекуррентный биллинг через recTokenWayForPay (UAH)✅ Доступно
    Кредитный балансавтосписание с внутренних RING-кредитовКредитные баллы✅ Доступно
    RING-токенончейн-платёж в SolanaRING (Токены)✅ Доступно
    StripeStripe Subscriptions APIStripe (USD)🔮 TBD
    NFT-гейт12-месячный доступ через soulbound NFTNFT Сертификат🔮 TBD
    PayPalPayPal рекуррентный биллингPayPal (USD)🔮 TBD

    Тарифы комиссий и чистый доход

    Каждый шлюз удерживает свою комиссию. Внутренние методы (кредитный баланс, RING-токен, NFT-гейт) взимают 0% — каждый доллар идёт вашей платформе.

    ПровайдерКомиссия %Фиксированная комиссияВалюта
    WayForPay2.5%—UAH
    Stripe2.9%$0.30USD
    Кредитный баланс0%—USD
    RING-токен0%—RING (Токены)
    NFT-гейт0%—RING
    PayPal2.9%$0.30USD

    Формула чистого дохода: net = gross - (gross × feePercent / 100) - feeFixed. Функция calculateNetRevenue() в subscription-config.ts вычисляет это на сервере; админ-панель показывает gross, fee и net для каждой подписки.

    Конфигурация (ring-config.json)

    Все настройки провайдеров хранятся в ring-config.json в секции payment.gateways:

    • cardPaymentProcessor — карточный шлюз по умолчанию (wayforpay или stripe). Переопределение через PAYMENT_MEMBERSHIP_PROCESSOR=stripe.
    • supportedMethods — провайдеры, доступные пользователям при оформлении.
    • futureMethods — провайдеры с пометкой "Скоро" в UI.
    • gateways.<provider>.feePercent — процентная комиссия, удерживаемая перед вашим чистым доходом.

    Админ-панель

    Суперадмины имеют доступ к /admin/subscriptions:

    • Список подписок — фильтр по провайдеру, статусу, пользователю; каждая строка показывает gross, fee и net доход.
    • Агрегированная статистика — /api/admin/subscriptions/stats возвращает total_active, due_for_payment, разбивки by_provider и by_method.
    • Отслеживание дохода — calculateNetRevenue() вызывается для каждой строки, чтобы основатели видели реальный доход после комиссий шлюзов.

    Архитектура

    Реестр провайдеров

    Шесть модулей провайдеров реализуют контракт SubscriptionProviderModule (lib/payments/subscription/subscription-types.ts). Conductor определяет их по ID провайдера:

    ID провайдераМодульИсточник
    credit_balanceringCreditSubscriptionProviderproviders/ring-credit-subscription.ts
    ring_tokenringTokenSubscriptionProviderproviders/ring-token-subscription.ts
    stripestripeSubscriptionProviderproviders/stripe-subscription.ts
    wayforpaywayforpaySubscriptionProviderproviders/subscription-provider-stubs.ts
    nft_gatenftGateSubscriptionProviderproviders/subscription-provider-stubs.ts
    paypal

    Связанное

    • PaymentConductor — оркестрация одноразовых платежей
    • WayForPay интеграция
    • Кошелёк и кредиты
    • Магазин — поток оформления членства
    • Админ-панель
    paypalSubscriptionProvider
    providers/subscription-provider-stubs.ts

    Заглушки для WayForPay, NFT Gate и PayPal являются заполнителями; Stripe, Credit Balance и RING Token имеют полные реализации.

    Схема subscription_ledger

    SSOT-коллекция: subscription_ledger. Схема определена в lib/payments/subscription/subscription-ledger-schema.ts (Zod).

    Ключевые поля:

    ПолеТипОписание
    idstringID строки реестра (sub_<ts>_<userIdSuffix>)
    user_idstringID пользователя-владельца
    providerenumstripe, wayforpay, credit_balance, ring_token, nft_gate, paypal
    gatewaystringЧеловеко-читаемая метка (напр. "Stripe", "WayForPay")
    methodenumcard, credit_balance, crypto, nft
    statusenumactive, expired, cancelled, suspended, grace_period
    amountnumberЦена подписки (в минорных единицах)
    currencystringВалюта биллинга
    gateway_fee_percentnumberПроцентная комиссия (напр. 2.9)
    gateway_fee_fixednumberФиксированная комиссия в минорных единицах (напр. 30 для Stripe)
    stripe_subscription_idstring?Stripe-ссылка (если провайдер Stripe)
    wayforpay_rec_tokenstring?Рекуррентный токен WayForPay
    solana_tx_signaturestring?Ончейн-подпись транзакции
    nft_mint_addressstring?Адрес минта NFT-сертификата
    start_timenumberНачало подписки (мс эпохи)
    next_payment_duenumberВремя следующего платежа
    failed_attemptsnumberПоследовательные неудачи платежа (макс 3 → авто expiring)
    auto_renewbooleanФлаг автопродления
    total_paidstringВсего оплачено за всё время
    payments_countnumberКоличество успешных платежей

    API Conductor

    SubscriptionConductor (lib/payments/subscription/subscription-conductor.ts) предоставляет:

    ОперацияСигнатураОписание
    createSubscription(input: CreateSubscriptionInput) → CreateSubscriptionResultМаршрутизация к модулю провайдера, вставка строки реестра
    cancelSubscription(userId, provider, gatewayRef?) → CancelSubscriptionResultОтмена у провайдера + пометка строк реестра
    renewSubscription(userId, provider, gatewayRef?) → RenewSubscriptionResultПродление у провайдера + обновление реестра
    getSubscription(userId) → SubscriptionLedgerRow | nullПоследняя активная подписка пользователя
    getSubscriptions(filter) → SubscriptionLedgerRow[]Запрос по пользователю, провайдеру, статусу, методу, окну оплаты
    getStats() → SubscriptionStatsАгрегированные подсчёты по статусу, провайдеру, методу
    calculateNetRevenue(row) → { gross, fee, net, currency }Чистый доход на строку

    API-маршруты

    МетодПутьНазначениеАвторизация
    POST/api/membership/subscription/createСоздание подписки через conductorСессия
    GET/api/membership/subscription/statusСтатус подписки + балансСессия
    POST/api/membership/subscription/cancelОтмена подпискиСессия
    POST/api/membership/payment/tokenОбработка токен-платежаСессия
    GET/api/admin/subscriptionsСписок всех подписокСуперадмин
    GET/api/admin/subscriptions/statsАгрегированная статистикаСуперадмин

    Cron-пайплайны

    Пять cron-пайплайнов зарегистрированы в lib/processes/registry.ts в категории membership:

    ID пайплайнаCron-путьОбработчикРасписание
    subscription-expiry-check/api/cron/subscription-expiryrunSubscriptionExpiryCheckЕжедневно в полночь
    credit-balance-monthly/api/cron/credit-balance-monthlyrunCreditBalanceMonthlyЕжечасно
    subscription-payment/api/cron/subscription-paymentrunSubscriptionPaymentCheckЕжедневно в 2:00
    solana-batch-payment/api/cron/solana-batch-paymentrunSolanaBatchPaymentЕжедневно в 3:00
    nft-gate-expiry/api/cron/nft-gate-expiryrunNftGateExpiryЕжедневно в 4:00

    Пайплайны запускаются через HTTP cron-задания по cronPath. Обработчики импортируются из lib/processes/subscription/:

    • expiry-check.ts — помечает просроченные подписки как expired и понижает роли пользователей
    • credit-balance-monthly.ts — списывает ежемесячную плату с кредитного баланса
    • subscription-payment.ts — обрабатывает рекуррентные платежи Stripe/WayForPay
    • solana-nft-stubs.ts — пакетные переводы RING-токенов и истечение срока NFT-гейта

    Добавление нового провайдера

    1. Реализуйте контракт SubscriptionProviderModule в providers/<name>-subscription.ts
    2. Зарегистрируйте в subscription-conductor.ts в providerRegistry Map
    3. Добавьте конфигурацию шлюза в ring-config.json payment.gateways.<provider>
    4. Добавьте в массив SUBSCRIPTION_PROVIDERS в subscription-ledger-schema.ts
    5. Обновите getMembershipPaymentOptions() в subscription-config.ts
    6. При необходимости добавьте обработчик cron-пайплайна в lib/processes/subscription/

    Переменные окружения

    json
    
    {
      "payment": {
        "cardPaymentProcessor": "wayforpay",
        "supportedMethods": ["wayforpay", "credit_balance", "ring_token"],
        "futureMethods": ["stripe", "paypal", "nft_gate"],
        "gateways": {
          "wayforpay": { "enabled": true, "feePercent": 2.5, "currency": "UAH" },
          "stripe": { "enabled": false, "feePercent": 2.9, "feeFixedCents": 30, "currency": "USD" },
          "credit_balance": { "enabled": true, "feePercent": 0, "currency": "USD" },
          "ring_token": { "enabled": true, "feePercent": 0, "currency": "RING", "label": "Tokens" },
          "paypal": { "enabled": false, "feePercent": 2.9, "feeFixedCents": 30, "currency": "USD" },
          "nft_gate": { "enabled": false, "feePercent": 0, "currency": "RING", "label": "NFT Certificate" }
        }
      }
    }
    text
    
    Membership upgrade / checkout
            ↓
    lib/payments/subscription/subscription-conductor.ts
            ↓
    Модули провайдеров: stripe | wayforpay | credit_balance | ring_token | nft_gate | paypal
            ↓
    subscription_ledger (PostgreSQL — провайдер-агностический SSOT)
            ↓
    Cron-пайплайны: expiry + payment + credit-balance + solana-batch + nft-gate
    bash
    
    PAYMENT_MEMBERSHIP_PROCESSOR=wayforpay    # Переопределение карточного шлюза для членства
    WAYFORPAY_MERCHANT_ACCOUNT=your_merchant
    WAYFORPAY_SECRET_KEY=your_secret
    STRIPE_SECRET_KEY=sk_live_...
    STRIPE_WEBHOOK_SECRET=whsec_...
    paypalSubscriptionProvider
    providers/subscription-provider-stubs.ts

    Заглушки для WayForPay, NFT Gate и PayPal являются заполнителями; Stripe, Credit Balance и RING Token имеют полные реализации.

    Схема subscription_ledger

    SSOT-коллекция: subscription_ledger. Схема определена в lib/payments/subscription/subscription-ledger-schema.ts (Zod).

    Ключевые поля:

    ПолеТипОписание
    idstringID строки реестра (sub_<ts>_<userIdSuffix>)
    user_idstringID пользователя-владельца
    providerenumstripe, wayforpay, credit_balance, ring_token, nft_gate, paypal
    gatewaystringЧеловеко-читаемая метка (напр. "Stripe", "WayForPay")
    methodenumcard, credit_balance, crypto, nft
    statusenumactive, expired, cancelled, suspended, grace_period
    amountnumberЦена подписки (в минорных единицах)
    currencystringВалюта биллинга
    gateway_fee_percentnumberПроцентная комиссия (напр. 2.9)
    gateway_fee_fixednumberФиксированная комиссия в минорных единицах (напр. 30 для Stripe)
    stripe_subscription_idstring?Stripe-ссылка (если провайдер Stripe)
    wayforpay_rec_tokenstring?Рекуррентный токен WayForPay
    solana_tx_signaturestring?Ончейн-подпись транзакции
    nft_mint_addressstring?Адрес минта NFT-сертификата
    start_timenumberНачало подписки (мс эпохи)
    next_payment_duenumberВремя следующего платежа
    failed_attemptsnumberПоследовательные неудачи платежа (макс 3 → авто expiring)
    auto_renewbooleanФлаг автопродления
    total_paidstringВсего оплачено за всё время
    payments_countnumberКоличество успешных платежей

    API Conductor

    SubscriptionConductor (lib/payments/subscription/subscription-conductor.ts) предоставляет:

    ОперацияСигнатураОписание
    createSubscription(input: CreateSubscriptionInput) → CreateSubscriptionResultМаршрутизация к модулю провайдера, вставка строки реестра
    cancelSubscription(userId, provider, gatewayRef?) → CancelSubscriptionResultОтмена у провайдера + пометка строк реестра
    renewSubscription(userId, provider, gatewayRef?) → RenewSubscriptionResultПродление у провайдера + обновление реестра
    getSubscription(userId) → SubscriptionLedgerRow | nullПоследняя активная подписка пользователя
    getSubscriptions(filter) → SubscriptionLedgerRow[]Запрос по пользователю, провайдеру, статусу, методу, окну оплаты
    getStats() → SubscriptionStatsАгрегированные подсчёты по статусу, провайдеру, методу
    calculateNetRevenue(row) → { gross, fee, net, currency }Чистый доход на строку

    API-маршруты

    МетодПутьНазначениеАвторизация
    POST/api/membership/subscription/createСоздание подписки через conductorСессия
    GET/api/membership/subscription/statusСтатус подписки + балансСессия
    POST/api/membership/subscription/cancelОтмена подпискиСессия
    POST/api/membership/payment/tokenОбработка токен-платежаСессия
    GET/api/admin/subscriptionsСписок всех подписокСуперадмин
    GET/api/admin/subscriptions/statsАгрегированная статистикаСуперадмин

    Cron-пайплайны

    Пять cron-пайплайнов зарегистрированы в lib/processes/registry.ts в категории membership:

    ID пайплайнаCron-путьОбработчикРасписание
    subscription-expiry-check/api/cron/subscription-expiryrunSubscriptionExpiryCheckЕжедневно в полночь
    credit-balance-monthly/api/cron/credit-balance-monthlyrunCreditBalanceMonthlyЕжечасно
    subscription-payment/api/cron/subscription-paymentrunSubscriptionPaymentCheckЕжедневно в 2:00
    solana-batch-payment/api/cron/solana-batch-paymentrunSolanaBatchPaymentЕжедневно в 3:00
    nft-gate-expiry/api/cron/nft-gate-expiryrunNftGateExpiryЕжедневно в 4:00

    Пайплайны запускаются через HTTP cron-задания по cronPath. Обработчики импортируются из lib/processes/subscription/:

    • expiry-check.ts — помечает просроченные подписки как expired и понижает роли пользователей
    • credit-balance-monthly.ts — списывает ежемесячную плату с кредитного баланса
    • subscription-payment.ts — обрабатывает рекуррентные платежи Stripe/WayForPay
    • solana-nft-stubs.ts — пакетные переводы RING-токенов и истечение срока NFT-гейта

    Добавление нового провайдера

    1. Реализуйте контракт SubscriptionProviderModule в providers/<name>-subscription.ts
    2. Зарегистрируйте в subscription-conductor.ts в providerRegistry Map
    3. Добавьте конфигурацию шлюза в ring-config.json payment.gateways.<provider>
    4. Добавьте в массив SUBSCRIPTION_PROVIDERS в subscription-ledger-schema.ts
    5. Обновите getMembershipPaymentOptions() в subscription-config.ts
    6. При необходимости добавьте обработчик cron-пайплайна в lib/processes/subscription/

    Переменные окружения

    json
    
    {
      "payment": {
        "cardPaymentProcessor": "wayforpay",
        "supportedMethods": ["wayforpay", "credit_balance", "ring_token"],
        "futureMethods": ["stripe", "paypal", "nft_gate"],
        "gateways": {
          "wayforpay": { "enabled": true, "feePercent": 2.5, "currency": "UAH" },
          "stripe": { "enabled": false, "feePercent": 2.9, "feeFixedCents": 30, "currency": "USD" },
          "credit_balance": { "enabled": true, "feePercent": 0, "currency": "USD" },
          "ring_token": { "enabled": true, "feePercent": 0, "currency": "RING", "label": "Tokens" },
          "paypal": { "enabled": false, "feePercent": 2.9, "feeFixedCents": 30, "currency": "USD" },
          "nft_gate": { "enabled": false, "feePercent": 0, "currency": "RING", "label": "NFT Certificate" }
        }
      }
    }
    text
    
    Membership upgrade / checkout
            ↓
    lib/payments/subscription/subscription-conductor.ts
            ↓
    Модули провайдеров: stripe | wayforpay | credit_balance | ring_token | nft_gate | paypal
            ↓
    subscription_ledger (PostgreSQL — провайдер-агностический SSOT)
            ↓
    Cron-пайплайны: expiry + payment + credit-balance + solana-batch + nft-gate
    bash
    
    PAYMENT_MEMBERSHIP_PROCESSOR=wayforpay    # Переопределение карточного шлюза для членства
    WAYFORPAY_MERCHANT_ACCOUNT=your_merchant
    WAYFORPAY_SECRET_KEY=your_secret
    STRIPE_SECRET_KEY=sk_live_...
    STRIPE_WEBHOOK_SECRET=whsec_...
    paypalSubscriptionProvider
    providers/subscription-provider-stubs.ts

    Заглушки для WayForPay, NFT Gate и PayPal являются заполнителями; Stripe, Credit Balance и RING Token имеют полные реализации.

    Схема subscription_ledger

    SSOT-коллекция: subscription_ledger. Схема определена в lib/payments/subscription/subscription-ledger-schema.ts (Zod).

    Ключевые поля:

    ПолеТипОписание
    idstringID строки реестра (sub_<ts>_<userIdSuffix>)
    user_idstringID пользователя-владельца
    providerenumstripe, wayforpay, credit_balance, ring_token, nft_gate, paypal
    gatewaystringЧеловеко-читаемая метка (напр. "Stripe", "WayForPay")
    methodenumcard, credit_balance, crypto, nft
    statusenumactive, expired, cancelled, suspended, grace_period
    amountnumberЦена подписки (в минорных единицах)
    currencystringВалюта биллинга
    gateway_fee_percentnumberПроцентная комиссия (напр. 2.9)
    gateway_fee_fixednumberФиксированная комиссия в минорных единицах (напр. 30 для Stripe)
    stripe_subscription_idstring?Stripe-ссылка (если провайдер Stripe)
    wayforpay_rec_tokenstring?Рекуррентный токен WayForPay
    solana_tx_signaturestring?Ончейн-подпись транзакции
    nft_mint_addressstring?Адрес минта NFT-сертификата
    start_timenumberНачало подписки (мс эпохи)
    next_payment_duenumberВремя следующего платежа
    failed_attemptsnumberПоследовательные неудачи платежа (макс 3 → авто expiring)
    auto_renewbooleanФлаг автопродления
    total_paidstringВсего оплачено за всё время
    payments_countnumberКоличество успешных платежей

    API Conductor

    SubscriptionConductor (lib/payments/subscription/subscription-conductor.ts) предоставляет:

    ОперацияСигнатураОписание
    createSubscription(input: CreateSubscriptionInput) → CreateSubscriptionResultМаршрутизация к модулю провайдера, вставка строки реестра
    cancelSubscription(userId, provider, gatewayRef?) → CancelSubscriptionResultОтмена у провайдера + пометка строк реестра
    renewSubscription(userId, provider, gatewayRef?) → RenewSubscriptionResultПродление у провайдера + обновление реестра
    getSubscription(userId) → SubscriptionLedgerRow | nullПоследняя активная подписка пользователя
    getSubscriptions(filter) → SubscriptionLedgerRow[]Запрос по пользователю, провайдеру, статусу, методу, окну оплаты
    getStats() → SubscriptionStatsАгрегированные подсчёты по статусу, провайдеру, методу
    calculateNetRevenue(row) → { gross, fee, net, currency }Чистый доход на строку

    API-маршруты

    МетодПутьНазначениеАвторизация
    POST/api/membership/subscription/createСоздание подписки через conductorСессия
    GET/api/membership/subscription/statusСтатус подписки + балансСессия
    POST/api/membership/subscription/cancelОтмена подпискиСессия
    POST/api/membership/payment/tokenОбработка токен-платежаСессия
    GET/api/admin/subscriptionsСписок всех подписокСуперадмин
    GET/api/admin/subscriptions/statsАгрегированная статистикаСуперадмин

    Cron-пайплайны

    Пять cron-пайплайнов зарегистрированы в lib/processes/registry.ts в категории membership:

    ID пайплайнаCron-путьОбработчикРасписание
    subscription-expiry-check/api/cron/subscription-expiryrunSubscriptionExpiryCheckЕжедневно в полночь
    credit-balance-monthly/api/cron/credit-balance-monthlyrunCreditBalanceMonthlyЕжечасно
    subscription-payment/api/cron/subscription-paymentrunSubscriptionPaymentCheckЕжедневно в 2:00
    solana-batch-payment/api/cron/solana-batch-paymentrunSolanaBatchPaymentЕжедневно в 3:00
    nft-gate-expiry/api/cron/nft-gate-expiryrunNftGateExpiryЕжедневно в 4:00

    Пайплайны запускаются через HTTP cron-задания по cronPath. Обработчики импортируются из lib/processes/subscription/:

    • expiry-check.ts — помечает просроченные подписки как expired и понижает роли пользователей
    • credit-balance-monthly.ts — списывает ежемесячную плату с кредитного баланса
    • subscription-payment.ts — обрабатывает рекуррентные платежи Stripe/WayForPay
    • solana-nft-stubs.ts — пакетные переводы RING-токенов и истечение срока NFT-гейта

    Добавление нового провайдера

    1. Реализуйте контракт SubscriptionProviderModule в providers/<name>-subscription.ts
    2. Зарегистрируйте в subscription-conductor.ts в providerRegistry Map
    3. Добавьте конфигурацию шлюза в ring-config.json payment.gateways.<provider>
    4. Добавьте в массив SUBSCRIPTION_PROVIDERS в subscription-ledger-schema.ts
    5. Обновите getMembershipPaymentOptions() в subscription-config.ts
    6. При необходимости добавьте обработчик cron-пайплайна в lib/processes/subscription/

    Переменные окружения

    json
    
    {
      "payment": {
        "cardPaymentProcessor": "wayforpay",
        "supportedMethods": ["wayforpay", "credit_balance", "ring_token"],
        "futureMethods": ["stripe", "paypal", "nft_gate"],
        "gateways": {
          "wayforpay": { "enabled": true, "feePercent": 2.5, "currency": "UAH" },
          "stripe": { "enabled": false, "feePercent": 2.9, "feeFixedCents": 30, "currency": "USD" },
          "credit_balance": { "enabled": true, "feePercent": 0, "currency": "USD" },
          "ring_token": { "enabled": true, "feePercent": 0, "currency": "RING", "label": "Tokens" },
          "paypal": { "enabled": false, "feePercent": 2.9, "feeFixedCents": 30, "currency": "USD" },
          "nft_gate": { "enabled": false, "feePercent": 0, "currency": "RING", "label": "NFT Certificate" }
        }
      }
    }
    text
    
    Membership upgrade / checkout
            ↓
    lib/payments/subscription/subscription-conductor.ts
            ↓
    Модули провайдеров: stripe | wayforpay | credit_balance | ring_token | nft_gate | paypal
            ↓
    subscription_ledger (PostgreSQL — провайдер-агностический SSOT)
            ↓
    Cron-пайплайны: expiry + payment + credit-balance + solana-batch + nft-gate
    bash
    
    PAYMENT_MEMBERSHIP_PROCESSOR=wayforpay    # Переопределение карточного шлюза для членства
    WAYFORPAY_MERCHANT_ACCOUNT=your_merchant
    WAYFORPAY_SECRET_KEY=your_secret
    STRIPE_SECRET_KEY=sk_live_...
    STRIPE_WEBHOOK_SECRET=whsec_...