The Daily Newsstand · Free, Always
Monday, October 12, 2026

Как работает безопасная сделка и как интегрировать платёжный сценарий с ролями и правилами через API

Translate

Не стоит доверять людям, которые обещают выполнить задачу после полной предоплаты: возможно, они действительно всё сделают, но есть риск, что они пропадут с деньгами и перестанут отвечать на звонки. Чтобы не полагаться на добросовестность контрагента, есть техническое решение. Это безопасная сделка — модель расчётов, которая исключает элемент доверия. 

В статье рассказываю, как работает платёжный сценарий с ролями, статусами, сроками, правилами выплат и обработкой спорных ситуаций. Привожу примеры, разбираю техническую интеграцию решения для безопасных сделок через API, настройку комиссий, URL-уведомлений и фискализации.

Безопасная сделка — это модель расчётов, при которой деньги покупателя или заказчика удерживаются до подтверждения выполнения обязательств продавцом или исполнителем. Как только условия сделки выполнены, средства разблокируются и перечисляются на счёт исполнителя. Это платёжный сценарий, в котором реализованы технические гарантии безопасности.

На связи Александр Черепанов, руководитель сопровождения площадок и маркетплейсов в Монете. В статье расскажу, что такое безопасная сделка, как это работает и как подключить платёжный сервис на сайт, чтобы реализовать этот сценарий. 

Покажу, как изнутри выглядит приём оплаты от одного участника и передача средств второму участнику, как настроить правила сделки, добавить URL-уведомления и фискализацию.

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

Что такое безопасная сделка для онлайн-площадки

Безопасную сделку используют маркетплейсы, фриланс-платформы, некоторые сервисы по размещению объявлений. Менеджеры и продакты онлайн-площадок считают этот финансово-правовой механизм способом гарантии выполнения обязательств. Если есть риск, что заказ не будет выполнен, оплата удерживается до подтверждения результата.

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

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

Из-за того, что покупатель не может оценить качество товара или услуги до момента оплаты, он сильно рискует получить не то, что ожидал (или не получить ничего). Безопасная сделка даёт покупателям уверенность в честности транзакции и возможность быстро вернуть деньги без судебных разбирательств, если что-то пойдёт не так.

Пример. Покупатель приобретает подержанный ноутбук через доску объявлений. На этой платформе правила могут быть настроены таким образом, что после оплаты продавцу приходит уведомление о сделке, но деньги остаются на счёте платёжного сервиса. Продавец получит их, только когда ноутбук будет доставлен и покупатель подтвердит исправность устройства.

Продавцам это тоже выгодно: если в обычных сделках есть вероятность неуплаты или отмены платежа, то при использовании безопасной сделки оплата заранее зарезервирована. Продавец получит деньги после выполнения условий договора: например, когда покупатель заберёт товар и подтвердит, что всё в порядке.

Сервис безопасных сделок: что это и какие подходы есть на рынке

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

Сценарий может быть реализован по-разному:

  • как внутренний механизм гарантии финансовой безопасности площадки или гарант-сервиса;

  • как модуль платёжного сервиса «Безопасная сделка», который встраивается в онлайн-площадку через API.

Я разбираю «Безопасную сделку» как инструмент платёжного сервиса. Мне важно показать архитектуру и принципы того, как он удерживает и распределяет деньги и какие риски снимает с платформы.

Многие крупные платформы и гаранты исторически реализовывали безопасные сделки на своих счетах без внешнего платёжного сервиса — на своей платёжной инфраструктуре. Модель расчётов можно встретить на биржах услуг и образовательных платформах, например на Kwork и Яндекс Исполнителях. Правила, уровень безопасности и степень регулирования зависят от платформы.

Чем безопасная сделка отличается от предоплаты

При стандартной предоплате средства перечисляются на счёт продавца до получения товара. Покупатель рискует потерять деньги при недобросовестности контрагента. Но такая схема подходит для повседневных покупок и при сотрудничестве с известными продавцами с хорошей репутацией.

При безопасной сделке от Монеты средства списываются с карты покупателя и поступают на «Счёт безопасной сделки» — это счёт незавершённых расчётов 30232, который открывает небанковская кредитная организация (НКО) или банк. Деньги хранятся у нейтральной стороны до наступления заранее прописанных условий. Площадка управляет сделкой, но не имеет прямого доступа к средствам.

Деньги поступают продавцу после того, как покупатель подтвердит, что все условия сделки выполнены, или истечёт срок апелляции. Все финансовые операции проходят по защищённым протоколам. Сервис берёт за это комиссию.

Кому подходит безопасная сделка

Безопасная сделка важна, если есть две стороны сделки (покупатель и продавец), платформа выступает гарантом расчётов, есть риск невыполнения обязательств и недоверие между пользователями. Защита обеих сторон сделки нужна на следующих типах онлайн-площадок:

  • маркетплейсы защищают покупателя и продавца, удерживая оплату до подтверждения получения товара или выполнения заказа;

  • сервисы фриланса и услуг гарантируют специалисту оплату работы, а заказчику — получение результата до перевода средств или решение споров при несоблюдении сроков;

  • доски объявлений позволяют покупателям не бояться переводить оплату при покупке б/у вещей и быстро возвращать деньги за некачественные товары;

  • сервисы аренды помогают защитить обе стороны при бронировании жилья, транспорта или оборудования, удерживая оплату до начала аренды;

  • P2P-платформы снижают риск мошенничества между пользователями, которые совершают сделки напрямую друг с другом;

  • сервисы доставки обеспечивают безопасный расчёт между клиентом, исполнителем и платформой после подтверждения оказания услуги;

  • площадки по продаже цифровых услуг позволяют переводить деньги в момент передачи актива: например, при продаже доменов, прав на ПО, игровых ценностей.

Основные модели безопасной сделки

Архитектура безопасной сделки адаптируется под особенности продукта. Выбор модели зависит от того, какой у бизнеса предмет договора, насколько автоматизированы процессы и из каких этапов состоит процедура подтверждения обязательств сторон. В PayAnyWay от Монеты модель можно указать заранее. 

По предмету договора:

  • Физические товары: деньги резервируются до получения продукта, переводятся, если покупателя всё устраивает.

  • Услуги и работы: средства резервируются до начала выполнения обязательств или по этапам, переводятся после приёмки.

  • Цифровые товары: оплата привязана к передаче актива.

  • Недвижимость, авто, бизнес: деньги резервируются до выполнения условий сделки, переводятся после подтверждения по правилам платформы.

По технологической модели:

  • Эскроу: сервис удерживает деньги до выполнения условий. Если возникает спор, решение принимает специалист на основе доказательств сторон.

  • Автоматизированная безопасная сделка: условия задаются заранее и обрабатываются автоматически. Например, перевод после статуса доставки.

  • Гарантийное удержание: основная сумма перечисляется сразу, а остаток удерживается на период действия гарантии.

  • Модель с арбитром: при возникновении спора решение передаётся специалисту-арбитру, который был назначен или выбран сторонами заранее.

Как работает безопасная сделка: путь денег и статусов внутри онлайн-площадки

Перед тем как оформить безопасную сделку через онлайн-площадку, продавец создаёт карточку товара или услуги. Он указывает предмет сделки, стоимость, сроки выполнения и дополнительные условия. Дальше может происходить следующее:

  1. Покупатель производит оплату через безопасную сделку. 

  2. Платёжный сервис, подключённый к онлайн-площадке, резервирует средства на счёте безопасной сделки и уведомляет об этом площадку.

  3. Исполнитель или продавец исполняет свои обязательства.

  4. Клиент принимает товар или результат услуги и подтверждает, что его всё устраивает. 

  5. Платформа принимает решение о переводе — деньги перечисляются продавцу.

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

Техническая интеграция безопасной сделки через API

Разберу, как онлайн-платформа может реализовать на своём сайте безопасную сделку на примере решения от Монеты. Для инициализации перевода денег платформа отправляет запрос через интерфейс MONETA.MerchantAPI — API с набором методов для управления транзакциями на стороне сервера. Он позволяет встроить платёжные сценарии в архитектуру маркетплейса. Обмен данными осуществляется по протоколам XML или JSON.

1) Для перевода средств со счёта безопасной сделки маркетплейса на счёт продавца маркетплейса в Монете информационная система онлайн-площадки формирует запрос PaymentRequest. В атрибутах перевода необходимо указать номер базовой операции в поле PARENTID — это платёж на транзитный счёт торговой площадки.

Запрос:

{
   "Envelope":{
      "Header":{
         "Security":{
            "UsernameToken":{
               "Username":"логин",
               "Password":"пароль"
            }
         }
      },
      "Body":{
         "PaymentRequest":{
            "payer":"НОМЕР ТРАНЗИТНОГО СЧЁТА ПЛОЩАДКИ",
            "payee":"НОМЕРА РАСШИРЕННОГО СЧЁТА ПРОДАВЦА",
            "amount":"сумма",
            "clientTransaction":"внешний идентификатор транзакции",
            "operationInfo":{
               "attribute":[
                  {
                     "key":"PARENTID",
                     "value":"12345678"
                  }
               ]
            }
         }
      }
   }
}

Ответ:

{
  "Envelope":{
    "Body":{
      "PaymentResponse":{
        "transaction": "номер операции в системе МОНЕТА.РУ",
        "dateTime": "2019-01-25T15:35:32.000+03:00",
        "status": "SUCCESS",
        "clientTransaction": "внешний идентификатор транзакции"
      }
    }
  }
}
<?php

$sdkAppFileName = __DIR__ . "/../moneta-sdk-lib/autoload.php";
include_once($sdkAppFileName);

try {
    $monetaSdk = new \Moneta\MonetaSdk();
    $monetaSdk->checkMonetaServiceConnection();

    $request = new \Moneta\Types\PaymentRequest();

    //номер счёта (в системе МОНЕТА.РУ) для списания средств
    //номер транзитного счёта магазина/маркетплейса
    $request->payer = '';

    //номер счёта (в системе МОНЕТА.РУ) для зачисления средств
    //номер расширенного счёта организации/продавца
    $request->payee = '';

    //сумма перевода
    $request->amount = '10.00';

    //номер транзакции в учётной системе магазина/маркетплейса.
    $request->clientTransaction = 'my-order-id-10_2';

    //платёжный пароль магазина/маркетплейса.
    $request->paymentPassword = '*******************';

    $operation = new \Moneta\Types\OperationInfo();

    //в параметре указывается номер базовой операции — это операция платежа на транзитный счёт магазина/маркетплейса.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'PARENTID';
    $attribute->value = '';
    $operation->addAttribute($attribute);

    $request->operationInfo = $operation;

    //запрос на перевод средств внутри системы МОНЕТА.РУ
    //с транзитного счёта магазина/маркетплейса на расширенный счёт организации (продавца)
    $result = $monetaSdk->monetaService->Payment($request);

    if (!$result['id']) {
        throw new Exception(print_r($result, true));
    }

    echo "Запрос обработан.";

    foreach ($result['attribute'] as $key => $attribute) {
        if ('statusid' === $attribute['key']) {
            if ((new \Moneta\Types\OperationStatus())::SUCCEED !== $attribute['value']) {
                echo " Операция НЕ проведена полностью.";
            }
            break;
        }
    }

} catch (Exception $e) {
    echo "Ошибка:<br />";
    echo "<pre>" . $e->getMessage() . "</pre>";
}

2) Для перевода денег со счёта продавца на банковские реквизиты продавца тоже необходимо использовать запрос PaymentRequest. Кроме того, можно выводить и из ЛК, и по настроенному шаблону (например, каждый день платёжное сальдо за предыдущий день).

Запрос:

{
   "Envelope":{
      "Header":{
         "Security":{
            "UsernameToken":{
               "Username":"Username",
               "Password":"Password"
            }
         }
      },
      "Body":{
         "PaymentRequest":{
            "payer":НОМЕР РАСШИРЕННОГО СЧЁТА ПРОДАВЦА,
            "payee":5,
            "amount":10,
            "clientTransaction":"Внешний номер операции",
            "paymentPassword":*****,
            "isPayerAmount":true,
            "operationInfo":{
               "attribute":[
                  {
                     "key":"WIREPAYMENTPURPOSE",
                     "value":"Перечисление суммы переводов денежных средств по Договору № ___ от DD.MM.YYYY. НДС не облагается."
                  }
               ]
            }
         }
      }
   }
}
<?php

$sdkAppFileName = __DIR__ . "/../moneta-sdk-lib/autoload.php";
include_once($sdkAppFileName);

try {
    $monetaSdk = new \Moneta\MonetaSdk();
    $monetaSdk->checkMonetaServiceConnection();

    $request = new \Moneta\Types\PaymentRequest();

    //номер счёта (в системе МОНЕТА.РУ) для списания средств
    //номер расширенного счёта организации (продавца)
    $request->payer = '';

    //получатель перевода
    //5 — будет осуществлён банковский перевод по реквизитам; в банк организации (продавца)
    $request->payee = '5';

    //сумма перевода
    $request->amount = '10.00';

    //номер транзакции в учётной системе магазина/маркетплейса.
    $request->clientTransaction = 'my-order-id-10_3';

    //платёжный пароль магазина/маркетплейса.
    $request->paymentPassword = '***********';

    $request->isPayerAmount = true;

    $request->description = 'Перечисление на банковские реквизиты организации (продавца)';

    //запрос на перевод средств
    //с расширенного счёта организации (продавца) на банковские реквизиты организации (продавца)
    $result = $monetaSdk->monetaService->Payment($request);

    if (!$result['id']) {
        throw new Exception(print_r($result, true));
    }

    echo "Запрос обработан.";

    foreach ($result['attribute'] as $key => $attribute) {
        if ('statusid' === $attribute['key']) {
            if ((new \Moneta\Types\OperationStatus())::SUCCEED !== $attribute['value']) {
                echo " Операция НЕ проведена полностью.";
            }
            break;
        }
    }

} catch (Exception $e) {
    echo "Ошибка:<br />";
    echo "<pre>" . $e->getMessage() . "</pre>";
}

Настройки комиссий для продавцов

Онлайн-площадка может задавать размер комиссии для продавца: например, установить разные ставки по категориям товаров или в зависимости от оборота селлера. При этом в договоре об информационно-техническом взаимодействии будет прописан максимальный размер этой комиссии.

Значение комиссии площадка передаёт в поле SOURCETARIFFMULTIPLIER в процентах в запросе на перевод со счёта безопасной сделки маркетплейса на счёт продавца. Кроме того, есть возможность списывать комиссию в сумме в рублях, если обговорить эти условия при подключении.

Запрос:

{
  "Envelope": {
    "Header": {
      "Security": {
        "UsernameToken": {
          "Username": "логин",
          "Password": "пароль"
        }
      }
    },
    "Body": {
      "PaymentRequest": {
        "payer": "НОМЕР ТРАНЗИТНОГО СЧЁТА ПЛОЩАДКИ",
        "payee": "НОМЕРА РАСШИРЕННОГО СЧЁТА ПРОДАВЦА",
        "amount": "сумма",
        "clientTransaction": "внешний идентификатор транзакции",
        "operationInfo": {
          "attribute": [
            {
              "key": "PARENTID",
              "value": "12345678"
            },
            {
              "key": "SOURCETARIFFMULTIPLIER",
              "value": "0.015"
            }
          ]
        }
      }
    }
  }
}
где "value": "0.015" — значение в процентах.

Ответ:

{
  "Envelope":{
    "Body":{
      "PaymentResponse":{
        "transaction": "номер операции в системе МОНЕТА.РУ",
        "dateTime": "2019-01-25T15:35:32.000+03:00",
        "status": "SUCCESS",
        "clientTransaction": "внешний идентификатор транзакции"
      }
    }
  }
}
<?php

$sdkAppFileName = __DIR__ . "/../moneta-sdk-lib/autoload.php";
include_once($sdkAppFileName);

try {
    $monetaSdk = new \Moneta\MonetaSdk();
    $monetaSdk->checkMonetaServiceConnection();

    $request = new \Moneta\Types\PaymentRequest();

    //номер счёта (в системе МОНЕТА.РУ) для списания средств
    $request->payer = '';

    //номер счёта (в системе МОНЕТА.РУ) для зачисления средств
    $request->payee = '';

    //сумма перевода
    $request->amount = '20.00';

    //номер транзакции в учётной системе магазина/маркетплейса.
    $request->clientTransaction = 'my-order-id-20';

    //платёжный пароль магазина/маркетплейса.
    $request->paymentPassword = '*******************';

    $operation = new \Moneta\Types\OperationInfo();

    //в параметре указывается номер базовой операции — это операция платежа на транзитный счёт магазина/маркетплейса.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'PARENTID';
    $attribute->value = '';
    $operation->addAttribute($attribute);

    //в параметре указывается значение комиссии, которую взимает магазин/маркетплейс с организации/продавца.
    $attribute = new \Moneta\Types\KeyValueAttribute();
    $attribute->key = 'SOURCETARIFFMULTIPLIER';
    $attribute->value = '0.015';    //1,5%
    $operation->addAttribute($attribute);

    $request->operationInfo = $operation;

    //запрос на перевод средств внутри системы МОНЕТА.РУ
    //с транзитного счёта магазина/маркетплейса на расширенный счёт организации (продавца)
    $result = $monetaSdk->monetaService->Payment($request);

    if (!$result['id']) {
        throw new Exception(print_r($result, true));
    }

    echo "Запрос обработан.";

    foreach ($result['attribute'] as $key => $attribute) {
        if ('statusid' === $attribute['key']) {
            if ((new \Moneta\Types\OperationStatus())::SUCCEED !== $attribute['value']) {
                echo " Операция НЕ проведена полностью.";
            }
            break;
        }
    }

} catch (Exception $e) {
    echo "Ошибка:<br />";
    echo "<pre>" . $e->getMessage() . "</pre>";
}

Выстраивание работы с URL-уведомлениями

Автоматический учёт транзакций в инфраструктуре онлайн-площадки реализуется через механизм HTTP-уведомлений (вебхуков). Работа с URL-уведомлениями избавляет от необходимости вручную отслеживать операции.

Уведомления инициируются на стороне платёжного сервиса при изменении состояния транзакции. Система отправляет POST-запрос на адрес площадки, передавая полный набор данных об операции.

Для защиты от несанкционированной подмены данных и имитации запросов сторонними ресурсами в протоколе используется параметр MNT_SIGNATURE.

URL-уведомления: действия при списании/зачислении средств

Действия при списании/зачислении средств

url?MNT_COMMAND=…& MNT_OPERATION_ID=…& MNT_ID=…& MNT_CURRENCY_CODE=…& MNT_AMOUNT=…& MNT_CORRACCOUNT=…& MNT_TEST_MODE=…& MNT_TRANSACTION_ID=…& MNT_SUBSCRIBER_ID=…& MNT_SIGNATURE=…

В ответ мы ждём HTTP-статус 200 и слово SUCCESS.

MNT_COMMAND:

  • DEBIT — списание средств.

  • CREDIT — зачисление средств.

  • CANCELLED_DEBIT — отмена списания средств.

  • CANCELLED_CREDIT — отмена зачисления средств.

  • AUTHORISE — авторизация средств проведена.

MNT_SIGNATURE рассчитывается следующим образом:

MNT_SIGNATURE = md5(MNT_COMMAND + MNT_ID + MNT_TRANSACTION_ID + MNT_OPERATION_ID + MNT_AMOUNT + MNT_CURRENCY_CODE + MNT_SUBSCRIBER_ID + MNT_TEST_MODE + Код_проверки_целостности_данных)

Кроме основных параметров, будут переданы некоторые атрибуты, если они есть в операции (список периодически меняется):

parentid, isrefund, yandexpayercode, yandexaccount, webmoneywmid, webmoneypurse,

moneymailpayer, contacttransferordernumber, wiretransferordernumber, cardnumber,

payeecardnumber, paymenttoken, smsmshphone, smsphone, netelleraccount, alauserid,

rapidamphone, qiwiphone, dmrbuyeremail, amegaphone, alfaidclient, impulsplusphone

Для операций возврата во всех уведомлениях будет передан 'isrefund=1'.

Пример:

MNT_COMMAND = AUTHORISE & MNT_OPERATION_ID=102345423 & MNT_ID=96801571 &

MNT_CURRENCY_CODE=RUB & MNT_AMOUNT=10.00 & MNT_CORRACCOUNT=13655088 & MNT_TEST_MODE=0 &

MNT_TRANSACTION_ID=qynt-514-pqme&MNT_SIGNATURE=ed56b32f21cb8aa5e7e99b75345a0207

MNT_SIGNATURE = md5('AUTHORISE96801571qynt-514-pqme10234542310.00RUB0QWERTY');

(допустим, Код проверки целостности данных в магазине равен QWERTY)

Поля ввода:

  • Вызвать URL после списания средств.

  • Вызвать URL после авторизации средств.

  • Вызвать URL после зачисления средств.

  • Вызвать URL после отмены списания средств.

  • Вызвать URL после отмены зачисления средств.

Фискализация и отчётность

Расчёты на онлайн-площадках регулируются требованиями №54-ФЗ. После платежа необходимо сформировать фискальный документ (чек), отправить его покупателю и передать данные о расчётах в налоговые органы.

Если онлайн-площадка внедряет платёжный сервис, фискализацию можно организовать по одному из трёх сценариев:

  1. Онлайн-кассы получателей — юридических лиц и ИП. Каждый продавец или исполнитель использует собственную ККТ и формирует чеки по своим операциям. Платформе необходимо настроить передачу данных о платежах в кассу соответствующего получателя.

  2. Онлайн-касса платформы. Площадка использует собственную ККТ и берёт фискализацию на себя, работая в статусе банковского платёжного агента / платёжного агента (БПА/ПА). В этом случае чеки по операциям получателей формируются через кассовую инфраструктуру платформы.

  3. Онлайн-касса БПА/ПА PayAnyWay. Фискализацию берёт на себя платёжный сервис, поэтому площадке не нужно подключать и администрировать собственную кассовую инфраструктуру. Формирование чеков можно встроить в платёжный сценарий и автоматизировать вместе с обработкой операций.

Данные шифруются и через оператора фискальных данных (ОФД) передаются в ФНС, система отправляет электронные чеки покупателям на почту или по СМС. В интерфейсе платёжного сервиса доступна отчётность, которая позволяет сопоставлять банковские выписки с фискальными документами.

Главное о том, как работает безопасная сделка для онлайн-площадок

Безопасная сделка помогает и покупателям, и продавцам, и онлайн-площадкам: она исключает элемент доверия и даёт проводить оплату с техническими гарантиями выполнения условий сделки. Деньги перечисляются на счёт безопасной сделки и временно удерживаются там, что снижает риск мошенничества с обеих сторон. Платёжный сервис играет роль независимого посредника и управляет транзитным счётом. 

Чтобы подключить на сайт безопасную сделку, можно интегрировать инструмент платёжного сервиса через MerchantAPI. Это поможет управлять ролями, определять комиссии для участников, обновлять статусы оплат через защищённые URL-уведомления. При подключении кассы получится соблюдать требования №54-ФЗ, автоматически формировать чеки и передавать данные в налоговую.

P. S. Примеры API-запросов, сценарии подключения платёжной формы, параметры для приёма платежей, настройки выплат и вебхук-уведомлений можно посмотреть в документации Монеты.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.