Быстрый старт — Биржа фрилансеров
С помощью этой статьи вы можете провести свою первую Безопасную сделку в ЮKassa. В этом сценарии платформа получит вознаграждение после успешного платежа.
В статье описан самый простой сценарий интеграции. Все возможности ЮKassa и подробные инструкции по интеграции описаны в разделе Интеграция.
 
Описание сценария
Биржа фрилансеров — это платформа, на которой фрилансеры размещают объявления об услугах, которые они оказывают, ищут заказчиков и взаимодействуют с ними. Платформа получает вознаграждение после платежа и не возвращает вознаграждение, если сделка не состоялась.
На платформе покупатель собирается приобрести услугу за 800 рублей. За проведение сделки платформа получит 200 рублей. Продавец хочет получить выплату на банковскую карту.
Чтобы провести Безопасную сделку:
  1. Получите данные для выплаты
  2. Создайте сделку
  3. Примите оплату от покупателя
  4. Сделайте выплату продавцу
 
Шаг 1. Получите данные для выплаты
Чтобы провести выплату, вам нужно получить данные банковской карты продавца. Получение и хранение номера карты подпадает под действие стандарта PCI DSS, поэтому ЮKassa хранит эти данные на своей стороне.
Чтобы получить данные карты для выплаты, разместите у себя на сайте специальный виджет и отобразите продавцу форму для ввода данных. Когда продавец введет данные своей банковской карты, виджет вернет вам синоним банковской карты — идентификатор карты в системе ЮKassa, который нужно использовать для проведения выплат, — и данные для отображения карты в интерфейсе.
Сейчас, при проведении пробной сделки, скопируйте код ниже и сохраните его в файл формата HTML. Откройте в браузере получившуюся страницу, введите данные банковской карты для выплаты, после этого откройте консоль и сохраните полученный синоним для проведения выплаты. Синоним банковской карты можно использовать несколько раз и для разных выплат.
Пример кода
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Получение данных банковской карты продавца с помощью виджета ЮKassa</title>

  <!--Подключение библиотеки-->
  <script src="https://static.yoomoney.ru/payouts-data-widget-front/widget.js"></script>
 </head>
 <body>
  <p>Ниже отобразится форма для ввода номера банковской карты.</p>

  <!--Контейнер, в котором будет отображаться форма ввода номера карты-->
  <div id="payout-form"></div>

  <script>
  //Инициализация виджета. Все параметры обязательные.
  const payoutsData = new window.PayoutsData({
    successCallback(data) {
      //Обработка ответа с токеном карты
      console.log(data)
    },
    errorCallback(error) {
      //Обработка ошибок
      console.log(error)
    }
  });

  //Отображение платежной формы в контейнере
  payoutsData.render('payout-form')
    //После отображения платежной формы метод render возвращает Promise (можно не использовать).
    .then(() => {
      //Код, который нужно выполнить после отображения платежной формы.
  });
  </script>
 </body>
</html>
 
Шаг 2. Создайте сделку
Создайте сделку, в рамках которой будете принимать оплату от покупателя и делать выплату продавцу. Для этого отправьте ЮKassa запрос с данными для аутентификации, ключом идемпотентности (подойдет любое случайное значение), типом сделки (
safe_deal
 — Безопасная сделка) и с указанием, что вознаграждение платформы нужно перечислить после успешного платежа (
fee_moment=payment_succeeded
).
Пример запроса на создание сделки
cURL
curl https://api.yookassa.ru/v3/deals \
  -X POST \
  -u <Идентификатор магазина>:<Секретный ключ> \
  -H 'Idempotence-Key: <Ключ идемпотентности>' \
  -H 'Content-Type: application/json' \
  -d '{
        "type":"safe_deal",
        "fee_moment":"deal_closed",
        "metadata":{
            "order_id":"37"
        },
        "description":"SAFE_DEAL 123554642-2432FF344R"
      }'
В ответ на запрос ЮKassa вернет созданный объект сделки.
Пример созданного объекта сделки
JSON
{
   "type":"safe_deal",
   "fee_moment":"payment_succeeded",
   "id":"dl-286415b5-0022-5000-8000-06d214f8e64c",
   "balance":{
      "value":"0.00",
      "currency":"RUB"
   },
   "payout_balance":{
      "value":"0.00",
      "currency":"RUB"
   },
   "status":"opened",
   "created_at":"2021-06-22T15:29:57.996378Z",
   "expires_at":"2021-06-24T15:29:57.996399Z",
   "metadata":{
      "order_id":"37"
   },
   "description":"SAFE_DEAL 123554642-2432FF344R",
   "test":true
}
Сохраните идентификатор сделки (значение параметра
id
в созданном объекте). Он понадобится вам при проведении операций в составе сделки и получения информации о сделке.
 
Шаг 3. Примите оплату от покупателя
Проведите один платеж, в рамках которого покупатель оплатит сразу все затраты за проведение Безопасной сделки.
Пример: услуга продавца стоит 800 рублей, проведение сделки на вашей платформе — 200 рублей. Всего покупатель заплатит 1 000 рублей. От этой суммы ЮKassa рассчитает свое вознаграждение за проведение платежа. Например, если комиссия 4,5%, вознаграждение ЮKassa составит 45 рублей. Свою комиссию ЮKassa взимает из вашего вознаграждения, поэтому в итоге продавец получит 800 рублей, ЮKassa — 45 рублей, а вы — 155 рублей.
 
1. Создайте платеж
Отправьте ЮKassa запрос с данными для аутентификации, ключом идемпотентности и данными для проведения платежа в составе сделки:
  • В объекте
    amount
    передайте общую сумму платежа, которую ЮKassa спишет с покупателя (сумма вознаграждения продавца и вознаграждения вашей платформы). Комиссия ЮKassa за проведение платежа рассчитывается из этой суммы, а взимается из вашего вознаграждения.
  • В объекте
    deal
    передайте данные о сделке: идентификатор сделки и массив
    settlements
    с данными о том, какую сумму нужно выплатить продавцу. Разница между суммой платежа и суммой выплаты должна быть больше эквайринговой комиссии ЮKassa.
Пример запроса на создание платежа в составе сделки
cURL
curl https://api.yookassa.ru/v3/payments \
  -X POST \
  -u <Идентификатор магазина>:<Секретный ключ> \
  -H 'Idempotence-Key: <Ключ идемпотентности>' \
  -H 'Content-Type: application/json' \
  -d '{
        "amount": {
          "value": "1000.00",
          "currency": "RUB"
        },
        "capture": true,
        "confirmation": {
          "type": "redirect",
          "return_url": "https://example.com/return_url"
        },
        "description": "Заказ №37",
        "deal": {
          "id": "dl-286415b5-0022-5000-8000-06d214f8e64c",
          "settlements": [{
            "type": "payout",
            "amount": {
              "value": "800.00",
              "currency": "RUB"
            }
          }]
        },
        "metadata": {
          "order_id": "37"
        }
      }'
В ответ на запрос ЮKassa вернет созданный объекта платежа в статусе
pending
. Это значит, что платеж создан, но покупатель его еще не подтвердил.
Пример тела ответа
JSON
{
    "id": "286415ea-000f-5000-9000-10a1ef011b6c",
    "status": "pending",
    "paid": false,
    "amount": {
        "value": "1000.00",
        "currency": "RUB"
    },
    "confirmation": {
        "type": "redirect",
        "confirmation_url": "https://yoomoney.ru/checkout/payments/v2/contract?orderId=286415ea-000f-5000-9000-10a1ef011b6c"
    },
    "created_at": "2021-06-22T15:30:50.312Z",
    "deal": {
        "id": "dl-286415b5-0022-5000-8000-06d214f8e64c",
        "settlements": [{
            "type": "payout",
            "amount": {
                "value": "800.00",
                "currency": "RUB"
            }
        }]
    },
    "description": "Заказ №37",
    "metadata": {
        "order_id": "37"
    },
  "recipient": {
    "account_id": "100001",
    "gateway_id": "1000001"
  },
    "refundable": false,
    "test": true
}
Сохраните идентификатор платежа (значение параметра
id
в созданном объекте). Он понадобится вам для получения информации о платеже, для проведения возвратов и отправки данных для чеков (при необходимости).
Сохраните
confirmation_url
 — он понадобится для оплаты.
 
2. Реализуйте нужный сценарий подтверждения
Для оплаты перенаправьте покупателя на 
confirmation_url
, чтобы он мог подтвердить платеж.
Сейчас, при проведении пробной сделки, перейдите по ссылке из 
confirmation_url
, введите данные для оплаты и подтвердите платеж. Если вы сейчас проводите платеж для тестовой интернет-площадки, для оплаты используйте банковскую карту со следующими данными:
  • номер — 5555555555554477
  • срок действия — 01/30 (или другая дата, больше текущей)
  • CVC — 123 (или три любые цифры)
  • код для прохождения 3-D Secure — 123 (или три любые цифры)
 
3. Дождитесь подтверждения платежа покупателем
Платеж можно считать успешным, как только он перешел в статус
succeeded
. Если покупатель передумает платить или что-то пойдет не так, платеж перейдет в статус
canceled
.
Чтобы узнать статус платежа, подпишитесь на уведомления от ЮKassa. Также вы можете следить за статусом, запрашивая информацию о платеже  с удобной для вас периодичностью (например, после того, как пользователь вернулся на 
return_url
). Для этого вам понадобится идентификатор платежа.
Пример платежа в статусе succeeded
JSON
{
    "id": "286415ea-000f-5000-9000-10a1ef011b6c",
    "status": "succeeded",
    "paid": true,
    "amount": {
        "value": "1000.00",
        "currency": "RUB"
    },
  "authorization_details": {
    "rrn": "10000000000",
    "auth_code": "000000",
    "three_d_secure": {
      "applied": true
    }
  },
    "captured_at": "2021-06-22T16:00:16.451Z",
    "created_at": "2021-06-22T15:30:50.312Z",
    "deal": {
        "id": "dl-286415b5-0022-5000-8000-06d214f8e64c",
        "settlements": [{
            "type": "payout",
            "amount": {
                "value": "800.00",
                "currency": "RUB"
            }
        }]
    },
    "description": "Заказ №37",
    "income_amount": {
        "value": "955.00",
        "currency": "RUB"
    },
    "metadata": {
        "order_id": "37"
    },
    "payment_method": {
        "type": "bank_card",
        "id": "286415ea-000f-5000-9000-10a1ef011b6c",
        "saved": false,
        "card": {
            "first6": "555555",
            "last4": "4477",
            "expiry_month": "01",
            "expiry_year": "2030",
            "card_type": "MasterCard",
            "issuer_country": "US"
        },
        "title": "Bank card *4477"
    },
    "recipient": {
        "account_id": "100001",
        "gateway_id": "1000001"
    },
    "refundable": true,
    "refunded_amount": {
        "value": "0.00",
        "currency": "RUB"
    },
    "test": true
}
Когда платеж перейдет в статус
succeeded
, ЮKassa переведет вам вознаграждение и пополнит баланс сделки. На балансе сделки и в параметре
payout_balance
окажется сумма, необходимая для выплаты продавцу.
Пример сделки после пополнения баланса
JSON
{
   "type":"safe_deal",
   "fee_moment":"payment_succeeded",
   "id":"dl-286415b5-0022-5000-8000-06d214f8e64c",
   "balance":{
      "value":"800.00",
      "currency":"RUB"
   },
   "payout_balance":{
      "value":"800.00",
      "currency":"RUB"
   },
   "status":"opened",
   "created_at":"2021-06-22T15:29:57.996378Z",
   "expires_at":"2021-06-24T15:29:57.996399Z",
   "metadata":{
      "order_id":"37"
   },
   "description":"SAFE_DEAL 123554642-2432FF344R",
   "test":true
}
 
Шаг 4. Сделайте выплату продавцу
Проведите выплату, используя полученный синоним банковской карты.
 
1. Создайте выплату
Отправьте ЮKassa запрос с данными для аутентификации, ключом идемпотентности и данными для выплаты на банковскую карту:
  • в объекте
    amount
    передайте сумму, которую нужно выплатить продавцу;
  • в параметре
    payout_token
    передайте синоним банковской карты продавца;
  • в объекте
    deal
    передайте идентификатор сделки.
Пример запроса на создание выплаты
cURL
curl https://api.yookassa.ru/v3/payouts \
  -X POST \
  -u <Идентификатор магазина>:<Секретный ключ> \
  -H 'Idempotence-Key: <Ключ идемпотентности>' \
  -H 'Content-Type: application/json' \
  -d '{
        "amount": {
          "value": "800.00",
          "currency": "RUB"
        },
        "payout_token": "<Синоним банковской карты>",
        "description": "Выплата по заказу №37",
        "metadata": {
          "order_id": "37"
        },
        "deal": {
          "id": "dl-286415b5-0022-5000-8000-06d214f8e64c"
        }
      }'
В ответ на запрос ЮKassa вернет созданный объект выплаты.
Пример созданного объекта выплаты
JSON
{
  "id": "po-2864222a-0003-5000-9000-002440655dd7",
  "amount": {
    "value": "800.00",
    "currency": "RUB"
  },
  "status": "pending",
  "payout_destination": {
    "type": "bank_card",
    "card": {
            "first6": "510621",
            "last4": "1882",
            "card_type": "MasterCard",
            "issuer_country": "RU",
            "issuer_name": "YOOMONEY NBCO LLC"
        }
  },
  "description": "Выплата по заказу №37",
  "created_at": "2021-06-22T16:23:06.965Z",
  "deal": {
    "id": "dl-286415b5-0022-5000-8000-06d214f8e64c"
  },
  "metadata": {
    "order_id": "37"
  },
  "test": true
}
 
2. Дождитесь подтверждения, что выплата успешна
Дождитесь, когда банк получателя согласует выплату и ЮKassa изменит статус объекта выплаты на 
succeeded
. При необходимости периодически отправляйте ЮKassa запросы на получение информации о выплате.
Пример успешно проведенной выплаты
JSON
{
    "id": "po-2864222a-0003-5000-9000-002440655dd7",
    "amount": {
        "value": "800.00",
        "currency": "RUB"
    },
    "status": "succeeded",
    "payout_destination": {
        "type": "bank_card",
        "card": {
            "first6": "510621",
            "last4": "1882",
            "card_type": "MasterCard",
            "issuer_country": "RU",
            "issuer_name": "YOOMONEY NBCO LLC"
        }
    },
    "description": "Выплата по заказу №37",
    "created_at": "2021-06-22T16:23:06.965Z",
    "deal": {
        "id": "dl-286415b5-0022-5000-8000-06d214f8e64c"
    },
    "metadata": {
        "order_id": "37"
    },
    "test": true
}
После успешной выплаты ЮKassa автоматически закроет сделку.
Пример закрытой сделки
JSON
{
   "type":"safe_deal",
   "fee_moment":"payment_succeeded",
   "id":"dl-286415b5-0022-5000-8000-06d214f8e64c",
   "balance":{
      "value":"0.00",
      "currency":"RUB"
   },
   "payout_balance":{
      "value":"0.00",
      "currency":"RUB"
   },
   "status":"closed",
   "created_at":"2021-06-22T15:29:57.996378Z",
   "expires_at":"2021-06-24T15:29:57.996399Z",
   "metadata":{
      "order_id":"37"
   },
   "description":"SAFE_DEAL 123554642-2432FF344R",
   "test":true
}
Готово! Вы провели свою первую Безопасную сделку с помощью ЮKassa.
 
Дальнейшие шаги
Ознакомьтесь с основами работы с API. Если проводили сделку для тестовой интернет-площадки, получите идентификатор и секретный ключ настоящей интернет-площадки.
Ознакомьтесь с деталями интеграции Безопасной сделки:
  • Общий сценарий интеграции: какие этапы еще могут быть, кроме тех, которые были в этой статье, какие из этапов нужно выполнять в строгой последовательности, а какие — нет.
  • Заключение сделки: дополнительные параметры, которые можно передать в запросе, условия закрытия сделки.
  • Прием оплаты от покупателя: какие есть возможности, отличия от стандартного процесса оплаты, примеры проведения платежей в рамках сделки.
  • Возврат оплаты покупателю: какие есть особенности возврата для разных сценариев проведения сделки, что важно учесть при возврате.
  • Отправка данных для чеков (если используете решение ЮKassa для работы по 54-ФЗ): когда нужно формировать чеки, какие данные нужны и как их отправлять.
  • Выплаты продавцу: какие есть возможности и ограничения, как провести выплату, какие могут быть причины отмены выплаты.
Выберите те возможности ЮKassa, которые вам нужны, и проинтегрируйтесь в соответствии с инструкциями.

Есть вопросы или замечания по документации?

Можем созвониться и обсудить их лично: мы поможем вам разобраться, а вы нам — понять, что тут нужно улучшить. Для этого оставьте свои контакты и выберите время.
Да, хочу обсудить
 
Что почитать еще
Справочник APIВходящие уведомленияТестирование Безопасной сделки