К содержимому

Быстрый старт: первый счёт за 5 минут

Ниже — работающий код, а не список шагов. Он использует демо-магазин, поэтому запускается сразу: скопировали, выполнили, увидели ссылку на оплату. Адрес API у демо и боевого контура один — меняются только токен и идентификатор магазина; доступы выдаются при подключении.

Показать схему обмена
sequenceDiagram
    participant S as Ваш сервер
    participant I as API Инвойсбокс
    participant K as Покупатель
    participant P as Платёжная страница
    S->>I: POST /order/order — создание заказа
    I-->>S: paymentUrl
    S->>K: ссылка на оплату (или QR-код)
    K->>P: оплата
    P->>I: подтверждение
    I->>S: POST-уведомление о смене статуса
    S-->>I: 200 {"status":"success"}

Проверьте доступ

Демо-токен уже подставлен — метод авторизации вернёт идентификатор пользователя.

curl -X GET 'https://api.invoicebox.ru/v3/security/api/auth/auth' \
  -H 'Authorization: Bearer b37c4c689295904ed21eee5d9a48d42e' \
  -H 'User-Agent: MyApp 1.0'

Выставьте счёт

Один запрос создаёт заказ и возвращает paymentUrl — ссылку, которую вы отправляете покупателю.

curl -X POST 'https://api.invoicebox.ru/v3/billing/api/order/order' \
  -H 'Authorization: Bearer b37c4c689295904ed21eee5d9a48d42e' \
  -H 'Content-Type: application/json' \
  -H 'User-Agent: MyApp 1.0' \
  -d '{
  "merchantId": "ffffffff-ffff-ffff-ffff-ffffffffffff",
  "merchantOrderId": "demo-order-1785862862042",
  "amount": 12000,
  "vatAmount": 0,
  "currencyId": "RUB",
  "languageId": "ru",
  "description": "Оплата бронирования № 4412",
  "expirationDate": "2026-08-05T17:01:02+00:00",
  "successUrl": "https://shop.example.com/order/4412?result=success",
  "failUrl": "https://shop.example.com/order/4412?result=fail",
  "returnUrl": "https://shop.example.com/order/4412?result=return",
  "basketItems": [
    {
      "sku": "room-deluxe",
      "name": "Проживание в номере «Делюкс», 2 ночи",
      "measure": "шт",
      "measureCode": "796",
      "quantity": 1,
      "amount": 12000,
      "amountWoVat": 12000,
      "totalAmount": 12000,
      "totalVatAmount": 0,
      "vatCode": "RUS_VAT0",
      "type": "service",
      "paymentType": "full_prepayment"
    }
  ],
  "customer": {
    "type": "legal",
    "name": "ООО «Ромашка»",
    "vatNumber": "7701234560",
    "taxRegistrationReasonCode": "770101001",
    "phone": "79001112233",
    "email": "buh@example.invbox.ru"
  }
}'
(Опционально) Оплата на месте — покажите QR-код

Ту же ссылку можно превратить в QR-код и показать покупателю: он оплатит камерой телефона или приложением Инвойсбокс, ничего не отправляя. Так работают кассы, стойки и торговые залы — метод создания заказа тот же, меняется только способ доставки ссылки. Подробнее — в описании ответа.

Хотите выполнить без копирования — нажмите «Выполнить» на странице Создание заказа.

Примите уведомление об оплате

Когда покупатель оплатит, Инвойсбокс отправит POST-уведомление на ваш URL. Проверьте подпись и ответьте HTTP 200 с телом {"status":"success"} — иначе уведомление придёт повторно.

// Псевдокод обработчика
const signatureOk = verifyHmac(request.rawBody, request.headers['x-signature'], SIGN_KEY);
// Внимание: код ответа всегда 200 — отказ передаётся телом, а не HTTP-кодом
if (!signatureOk) return response(200, { status: 'error', code: 'signature_error' });
if (request.body.status !== 'completed') return response(200, { status: 'success' });
if (!amountMatches(request.body)) return response(200, { status: 'error', code: 'order_wrong_amount' });
markOrderPaid(request.body.merchantOrderId); // идемпотентно: то же уведомление может прийти снова
return response(200, { status: 'success' });

Подробности и примеры проверки подписи — Уведомление по умолчанию.

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

Что пришло по вашему демо-заказу
Пока ничего. Создайте демо-заказ кнопкой «Выполнить» — на странице создания заказа или в демо-сценарии, — откройте ссылку на оплату и оплатите: на демо-контуре деньги не списываются. Уведомление приходит через несколько секунд.

Ключ подписи демо-магазина — 5a3797956281681be7cbb33ffc390ea1, метод hash_hmac, алгоритм sha1: с ними тот же расчёт можно повторить у себя. Свой ключ и адрес уведомлений задаются в личном кабинете; на localhost уведомление не придёт — нужен публичный адрес по HTTPS. Пока обработчика нет, статус заказа читают запросом — Получение заказа.

(Опционально) Возврат, отгрузки, холдирование

Возврат — POST refund-order; частичная отгрузка — shipment; резерв суммы с последующим списанием — холдирование.

(Опционально) Без единой строки кода

Платёжный виджет или готовый модуль для вашей CMS/CRM закрывают ту же задачу без разработки.

Что дальше

Перед выходом в прод пройдите чеклист запуска — он занимает 10 минут и снимает типовые проблемы: идемпотентность, обработку ошибок, боевой URL уведомлений.