Формирование корзины и создание платежа

При переходе покупателя «в корзину» - сайт магазина должен подготовить платеж через систему Octo, чтобы получить ссылку для перенаправления покупателя на платежные страницы Octo. Для этого с сервера (из недоступной для покупателя зоны) магазина должен быть выполнен запрос:

URL: https://secure.octo.uz/prepare_payment

Method: POST

Content-type: application/json

Тело запроса:

{
  "octo_shop_id": 10000,
  "octo_secret": "2d45df74-bb95-47cf-a616-8d6dcee2e10d",
  "shop_transaction_id": "uniq shop transaction_id",
  "auto_capture": true,
  "test": false,
  "init_time": "2018-03-30 11:22:33",
  "user_data": {
    "user_id": "уникальный ИД_пользователя в системе магазина",
    "phone": "79001112233",
    "email": "user@mail.com"
  },
  "total_sum": 103.33,
  "currency": "USD",
  "description": "Название платежа, например: Авиаперелет Москва-Сингапур",
  "basket": [
    {
      "position_desc": "Йогурт MANON клубничный",
      "count": 2,
      "price": 33.99
    },
    {
      "position_desc": "Йогурт MANON банановый",
      "count": 1,
      "price": 31.99
    }
  ],
  "payment_methods": [
    {
      "method": "bank_card"
    },
    {
      "method": "qiwi"
    }
  ],
  "return_url": "http://merchant.site.uz/return_URL",
  "notify_url": "http://merchant.site.uz/send_me_status_URL",
  "language": "uz",
  "ttl": 15
}

Описание полей запроса:

Поле Обязательное Описание
octo_shop_id да Уникальный ID магазина (доступен в ЛК магазина)
octo_secret да Персональный секретный ключ магазина, который генерируется в ЛК магазина. Должен содержаться в безопасной недоступной зоне сайта магазина.
shop_transaction_id да Уникальный идентификатор транзакции на стороне магазина. Используется OCTO для предотвращения случайного дублирования транзакций.
auto_capture нет Если true, то ПС Octo будет автоматически подтверждать списание средств со счета покупателя. Если false, то после авторизации платежа Octo будет ожидать от магазина дополнительного подтверждения окончательного завершения транзакции. По умолчанию false.
test нет Тестовый платёж или нет
init_time да время создания платежа yyyy-MM-dd HH:mm:ss
user_data нет Информация о покупателе, используется для отображения на странице оплаты
user_id да ID пользователя в БД магазина. Обязательно в случае передачи всего блока user_data.
phone да Обязательно в случае передачи всего блока user_data.
email да Обязательно в случае передачи всего блока user_data.
total_sum да Итоговая сумма платежа
currency да Валюта. Варианты: “USD”, “UZS”
description да Описание товара
basket нет Блок детальной информации по корзине. Если присутствует, то будет отображен покупателю при оплате.
position_desc да Название позиции в чеке. Обязательно в случае передачи всего блока basket.
supplier_shop_id нет ID магазина поставщика данного товара в системе OCTO (используется для сплиттинга платежей в marketplace)
count да Число таких позиций. Обязательно в случае передачи всего блока basket.
price да Цена одной позиции. Обязательно в случае передачи всего блока basket.
payment_methods нет Множество доступных покупателю методов оплаты. Если не передается, то будут предложены все доступные методы.
method да Название одного метода из вариантов: bank_card, qiwi, yandex, uzcard, mir_card, humo. Обязательно в случае передачи всего блока payment_methods.
return_url да URL на который следует перенаправить покупателя после завершения оплаты. URL должен содержать уникальный параметр, идентифицирующий конкретный платеж.
notify_url нет URL на который сервер OCTO будет отправлять нотификации об изменении статуса платежа. Если не установлен, то используется общий URL, который установлен в личном кабинете.
language нет Язык платежной формы. По умолчанию - язык браузера или en. Допустимые значения:
oz - узбекский, латиница
uz - узбекский, кирилица
en - английский
ru - русский
ttl нет Время жизни платежа с момента создания (в минутах). По истечению этого времени провести платеж будет невозможно.
customer_ip нет IP-адрес покупателя. Если указан, то сервис OCTO сверяет его с IP-адресом плательщика и в случае отличия блокирует оплату.

Ответ ПС Octo на запрос формирования платежа

В ответ на запрос магазина ПС Octo отвечает следующим JSON в теле ответа:

{
  "error": 0,
  "status": "created",
  "shop_transaction_id": "uniq shop transaction_id",
  "octo_payment_UUID": "1145df74-bb95-47cf-a616-8d6dcee2e222",
  "octo_pay_url": "https://pay.octo.uz/pay_wisard/1145df74-bb95-47cf-a616-8d6dcee2e222"
}

Описание полей ответа Octo:

Поле Обязательное Описание
status да (если error=0) Статус данного платежа в системе Octo, один из:

created - платеж создан
canceled - платеж отменен
wait_user_action - ожидает действий пользователя
waiting_for_capture - платеж авторизован и ожидает подтверждения магазином
succeeded - платеж успешно выполнен
shop_transaction_id да (если error=0) Уникальный идентификатор транзакции на стороне магазина.
octo_payment_UUID да (если error=0) Уникальный идентификатор транзакции в ПС Octo.
octo_pay_url да (если error=0) URL на который следует перенаправить покупателя для совершения платежа
error да Код ошибки. Варианты:

0 - нет ошибок
1 - ошибка формата данных
2 - ошибка авторизации
3 - итоговая сумма по корзине (basket) не сходится с total_sum
4 - внутренняя ошибка сервиса
5 - статус магазина не позволяет создавать реальные платежи
6 - недопустимая валюта
7 - неизвестный или недопустимый по тарифу метод платежа
8 - для позиции корзины указан недопустимый ID поставщика supplier_shop_id
9 - отсутствует notify_url и при этом auto_capture == false
errorMessage нет детальное описание ошибки
transfer_sum нет Сумма по счету за вычетом комиссии Octo, доступная для возврата средств покупателю
refunded_sum нет Возвращенная покупателю сумма