API и надёжная интеграция

Сверка платежей для B2B SaaS: счета, оплаты и доступ

Три списка — оплаты, счета и подписки — должны сходиться по одному номеру. Разбираем, как это делать за пятнадцать минут в день.

Короткий ответ и границы сценария

B2B SaaS нужна сверка не только суммы: invoice, платёж, организация, период тарифа и выданное право должны сходиться по устойчивым идентификаторам. Материал рассчитан на финансовой и продуктовой команды B2B-сервиса с тарифами, счетами за период и несколькими рабочими пространствами. Сначала определите бизнес-объект, который изменится после оплаты: заказ, бронь, период доступа, лицензия или обязательство перед клиентом.

Компания оплачивает годовой тариф для workspace. Система сохраняет снимок invoice, после payment.paid добавляет entitlement ровно один раз и включает операцию в дневной реестр; несовпадение суммы не исправляется вручную без журнала. Это конкретный пример модели, а не универсальное разрешение для любой категории. Условия подключения, способы оплаты и документы подтверждаются для проекта во время модерации.

Интеграция платежей — это протокол состояний, а не один HTTP-запрос. Сервер проекта создаёт платёж, сохраняет payment_id и pay_url, отдаёт ссылку клиенту, принимает подписанные события и идемпотентно меняет заказ. Каждый переход должен быть наблюдаемым и повторяемым.

Как выбрать рабочий вариант

Сравнивайте варианты по тому, какое действие нужно подтвердить и кто отвечает за следующий шаг. В таблице — три контрольные точки именно для темы «сверка платежей для B2B SaaS».

Контрольная точкаКак зафиксироватьС чем связать
billing accountЗаписать принятое решение, владельца и критерий готовности.payment_id и внутренний order_id.
снимок invoiceСохранить выбранное значение и версию условий.entitlement и ожидаемый результат.
order_id периодаОпределить проверку, состояние ошибки и безопасный повтор.реестр расхождений, payment_id и время обработки.
Платёжный API проверяет подпись, сохраняет событие и обновляет аналитику
Схема сценария. Визуальный путь для запроса «сверка платежей для B2B SaaS»: от сохранённого заказа до подтверждённого результата.
billing accountЗафиксировать объект и условия до создания платежа.
order_id периодаСвязать заказ с order_id, payment_id и точной суммой.
entitlementВыполнить результат один раз после проверенного события.

Шесть точек, которые определяют результат

billing account

Контрольная точка «billing account» задаёт исходные данные для материала «Сверка платежей для B2B SaaS: invoice, order_id и доступ». Зафиксируйте решение в карточке заказа до создания платежа, чтобы повторный запрос не создавал новую продажу случайно.

снимок invoice

Пункт «снимок invoice» должен быть понятен покупателю до перехода в форму: покажите сумму, назначение и ожидаемый результат. Интерфейс отдельно объясняет ожидание, успех, отмену и истечение, не подменяя серверный статус красивым экраном.

order_id периода

Для пункта «order_id периода» определите техническое доказательство завершения: проверенное событие, совпавшие сумма и валюта, известные order_id и payment_id. Только после этой проверки запускайте продуктовую выдачу или исполнение заказа.

payment_id

У элемента «payment_id» должен быть владелец исключений. Ему нужна история попыток и правило, которое объясняет, можно ли безопасно повторить создание, отправку ссылки или выдачу без доступа к API-ключам.

entitlement

Требование «entitlement» проверьте повторной доставкой callback. Два одинаковых события не должны дважды продлевать доступ, резервировать место, начислять баланс или отправлять товар; ограничение фиксируют на уровне данных.

реестр расхождений

Для точки «реестр расхождений» заранее опишите возврат, спор и задержку результата. Покупателю нужен понятный канал поддержки, а команде — связь между исходным заказом, платежом, документом и обратной операцией.

Пошаговая схема

  1. billing account. Ограничьте таймаут исходящего запроса и логируйте trace-id без ключей и персональных данных. Запишите входные данные, ответственного и условие завершения. Если нужен денежный результат, сообщение пользователя и визуальный редирект не заменяют проверенный серверный статус.
  2. снимок invoice. Генерируйте уникальный X-Nonce для каждой попытки, но сохраняйте order_id при безопасном повторе создания. Запишите входные данные, ответственного и условие завершения. Если нужен денежный результат, сообщение пользователя и визуальный редирект не заменяют проверенный серверный статус.
  3. order_id периода. Сохраняйте raw body webhook до проверки подписи и сравнивайте HMAC в constant-time режиме. Запишите входные данные, ответственного и условие завершения. Если нужен денежный результат, сообщение пользователя и визуальный редирект не заменяют проверенный серверный статус.
  4. payment_id. Обрабатывайте payment.paid, payment.canceled и payment.expired как явные состояния. Запишите входные данные, ответственного и условие завершения. Если нужен денежный результат, сообщение пользователя и визуальный редирект не заменяют проверенный серверный статус.
  5. entitlement. Проверяйте интеграцию тестовыми сценариями, включая повтор события и недоступность вашего callback URL. Запишите входные данные, ответственного и условие завершения. Если нужен денежный результат, сообщение пользователя и визуальный редирект не заменяют проверенный серверный статус.

Шестая точка — реестр расхождений — завершает цикл. Она должна быть видна в личном кабинете или внутренней системе проекта, чтобы поддержка могла восстановить ход операции без доступа к секретным ключам и без просьбы прислать скриншот.

Как собрать сценарий на RollyPay

Backend создаёт платёж методом POST /api/v1/payments. Для задачи «сверка платежей для B2B SaaS» он передаёт X-API-Key, новый X-Nonce и стабильный order_id, связанный с пунктом «billing account». В ответ сохраняются payment_id и pay_url.

Результат приходит на callback_url. До JSON-разбора сервер проверяет X-Signature как HMAC-SHA256 от X-Timestamp + "." + raw body, затем сверяет сумму, валюту, order_id и ожидаемый переход «order_id периода».

Выдача по payment.paid защищается уникальным ключом, связанным с «entitlement». payment.canceled и payment.expired закрывают попытку, но не стирают историю; повтор события заканчивается тем же итогом без повторного побочного эффекта.

Для темы «Сверка платежей для B2B SaaS: invoice, order_id и доступ» условия и варианты подключения собраны на странице решения RollyPay. Там можно сопоставить сценарий с продуктом, а здесь сохранить инструкцию и контрольные детали для реализации.

Частые ошибки

Нет внутреннего объекта продажи. Пункт «billing account» существует только в переписке, поэтому платёж нельзя однозначно связать с товаром или обязательством. Сначала создайте внутренний заказ и только затем внешний платёж.

Интерфейс принят за доказательство. Пункт «снимок invoice» может быть кнопкой, QR, ссылкой или экраном возврата. Денежный результат всё равно подтверждают серверное состояние и проверенное событие.

Разорваны данные процесса. Пункты «order_id периода» и «entitlement» должны быть связаны через order_id, payment_id, сумму, валюту и последнее событие. Тогда повтор или позднее подтверждение обрабатываются безопасно.

Нет владельца исключений. Пункт «реестр расхождений» включает возврат, истечение, спор и сбой доставки. Для каждого случая нужны статус, ответственная роль и понятное сообщение покупателю.

Что проверить до публикации

Для server-to-server запросов RollyPay используется X-API-Key, а X-Nonce защищает от повтора одного запроса. Уникальный order_id является естественным ключом идемпотентности создания платежа. Секреты хранятся только на backend и не попадают в браузер, мобильный клиент или репозиторий.

Webhook подписывается HMAC-SHA256 по строке X-Timestamp, точка и исходное тело запроса. Проверка выполняется до JSON-разбора; после неё обработчик сверяет событие, сумму, валюту и заказ, фиксирует event/payment_id и отвечает 2xx только после надёжного сохранения результата.

  • Категория проекта и предмет продажи описаны одинаково на сайте, в боте и в заявке на подключение.
  • Цена, валюта, срок действия предложения и правила возврата видны до оплаты.
  • Секреты находятся только на сервере, а журнал не содержит API-ключей и полного тела с чувствительными данными.
  • Успех, отмена, истечение, повтор события и недоступность callback проверены до реальных продаж.
  • Налоговый или кассовый документ создаётся по правилам статуса продавца и связан с заказом.

Практические заметки для запуска

billing account. Ограничьте таймаут исходящего запроса и логируйте trace-id без ключей и персональных данных. Владелец шага, сохраняемый идентификатор и проверяемый результат определяются заранее. Связка с пунктом «order_id периода» фиксируется в данных заказа, а не остаётся устной договорённостью. Для темы «Сверка платежей для B2B SaaS: invoice, order_id и доступ» это упрощает поддержку, повторную доставку события и разбор спорной операции.

Частые вопросы

С чего начать подключение по этому сценарию?

Начните с внутреннего заказа и точки «billing account»: определите продавца, предмет продажи, сумму и результат, который можно выдать только после подтверждения.

Можно ли считать переход на успешную страницу подтверждением оплаты?

Нет. Редирект нужен для интерфейса. Состояние заказа меняют после проверенного серверного события и сверки payment_id, order_id, суммы и валюты.

Что делать, если webhook пришёл повторно?

Сохраните уникальный ключ обработки и верните успешный ответ без повторного действия. Особенно важно не дублировать элемент «entitlement».

Какие данные нужны поддержке для разбора?

Достаточно order_id, payment_id, времени, суммы, последнего статуса и результата шага «реестр расхождений». API-ключи и signing secret передавать поддержке нельзя.

Источники и документация