Інтеграція CloudKassir з 1С-Бітрікс
Магазин на 1С-Бітрікс приймає онлайн-оплату, але Федеральний закон №54-ФЗ вимагає видавати фіскальний чек у момент розрахунку. Підключили хмарний сервіс CloudKassir — чеки не йдуть. Типова помилка: неправильний мапінг ПДВ, обрізані назви товарів, відсутність callback. Ми такі кейси виправляли десятками. Наші інженери з 10+ річним досвідом інтеграції Бітрікса підготували робочий код. Нижче — перевірена реалізація обробника платежів з CloudKassir під ключ, включаючи callback і часткові повернення.
CloudKassir — хмарний сервіс фіскалізації за 54-ФЗ. Працює за моделлю OrangeData та Атол Онлайн: обладнання на стороні сервісу, плата за чек розраховується індивідуально, без фізичних кас. API простіше — авторизація Basic Auth, немає клієнтських сертифікатів. Але складності залишаються: мапінг ставок ПДВ, асинхронність, коректне оформлення позицій. Ми розберемо кожен етап. Оцінимо ваш проект безкоштовно — пишіть.
Як працює інтеграція?
API CloudKassir: структура
Базовий URL: https://api.cloudkassir.ru/v1/. Авторизація: Basic Auth, логін і пароль з особистого кабінету.
Ключові методи:
-
POST /receipts— відправити чек -
GET /receipts/{id}— статус обробки чека -
POST /receipts/correction— чек корекції
Відповідь на POST /receipts повертає id — внутрішній ідентифікатор задачі. Сам чек у відповіді не міститься, потрібно опитувати GET /receipts/{id}.
Структура чека
$receipt = [
'external_id' => 'order-' . $orderId . '-' . time(),
'receipt' => [
'client' => [
'email' => $customerEmail, // обязательно email или телефон
],
'company' => [
'email' => $shopEmail,
'sno' => 'osn', // osn, usn_income, usn_income_outcome
'inn' => $inn,
'payment_address' => $siteUrl,
],
'items' => $this->buildItems($payment),
'payments' => [
[
'type' => 2, // 1-наличные, 2-электронные
'sum' => $payment->getSum(),
],
],
'total' => $payment->getSum(),
],
'timestamp' => date('d.m.Y H:i:s'),
'type' => 'sell', // sell, sell_return
'url' => $callbackUrl,
];
Поле url — адреса для callback після фіскалізації. CloudKassir надішле POST з даними чека: fn, fd, fpd, QR-код. Це зручніше за polling, якщо є білий IP.
Побудова позицій чека
private function buildItems(\Bitrix\Sale\Payment $payment): array
{
$order = $payment->getOrder();
$items = [];
foreach ($order->getBasket() as $basketItem) {
$items[] = [
'name' => mb_substr($basketItem->getField('NAME'), 0, 128),
'price' => $basketItem->getPrice(),
'quantity' => $basketItem->getQuantity(),
'sum' => $basketItem->getFinalPrice(),
'payment_method' => 'full_payment', // предоплата / полный расчёт
'payment_object' => 'commodity', // товар, услуга, работа
'vat' => $this->getVatTag($basketItem->getField('VAT_RATE')),
];
}
if ($order->getDeliveryPrice() > 0) {
$items[] = [
'name' => 'Доставка',
'price' => $order->getDeliveryPrice(),
'quantity' => 1.0,
'sum' => $order->getDeliveryPrice(),
'payment_method' => 'full_payment',
'payment_object' => 'service',
'vat' => 'none',
];
}
return $items;
}
Довжина назви обмежена 128 символами — mb_substr обов'язковий. Поле vat приймає значення: none, vat0, vat10, vat110, vat20, vat120. Мапінг зі ставки ПДВ Бітрікс у рядок CloudKassir:
private function getVatTag(?float $vatRate): string
{
return match(true) {
$vatRate === null || $vatRate == 0 => 'none',
$vatRate == 0.1 => 'vat10',
$vatRate == 0.2 => 'vat20',
default => 'none',
};
}
Обробник платіжної системи в Бітрікс
Інтеграція реалізується як обробник у /local/php_interface/include/sale_payment/cloudkassir/. Клас успадковує \Bitrix\Sale\PaySystem\ServiceHandler.
Чек надсилається в методі processRequest() — після отримання підтвердження від платіжної системи (банку). Не при створенні замовлення, а саме після підтвердження факту оплати.
public function processRequest(
\Bitrix\Sale\Payment $payment,
\Bitrix\Main\Request $request
): \Bitrix\Sale\PaySystem\ServiceResult {
$result = new \Bitrix\Sale\PaySystem\ServiceResult();
// Сначала помечаем платёж как оплаченный
$result->setOperationType(\Bitrix\Sale\PaySystem\ServiceResult::MONEY_COMING);
// Затем отправляем чек
$this->sendReceipt($payment);
return $result;
}
Якщо чек надіслати до підтвердження оплати — порушення 54-ФЗ: чек має бути сформований у момент розрахунку.
Обробка повернень та callback
Чому важливий callback і як зберегти фіскальні дані?
При надходженні callback від CloudKassir (після успішної фіскалізації) зберігаємо дані у властивості замовлення:
public function handleCallback(array $callbackData): void
{
$orderId = $this->extractOrderId($callbackData['external_id']);
$order = \Bitrix\Sale\Order::load($orderId);
$propCollection = $order->getPropertyCollection();
$propCollection->getItemByOrderPropertyCode('CLOUDKASSIR_FN')
->setValue($callbackData['fn']);
$propCollection->getItemByOrderPropertyCode('CLOUDKASSIR_FD')
->setValue($callbackData['fd']);
$propCollection->getItemByOrderPropertyCode('CLOUDKASSIR_FPD')
->setValue($callbackData['fpd']);
$order->save();
}
Властивості замовлення CLOUDKASSIR_FN, CLOUDKASSIR_FD, CLOUDKASSIR_FPD створюються вручну в адміністративній частині перед запуском інтеграції. Callback позбавляє необхідності опитувати статус чека вручну. Без callback доведеться крутити polling кожні кілька секунд, що створює зайве навантаження на сервер. Якщо ваш сервер має білий IP, callback — кращий варіант.
Як реалізувати повні та часткові повернення?
При поверненні оплати надсилається чек з type: sell_return. Склад позицій має збігатися з оригінальним чеком. CloudKassir не зв'язує чеки за ID автоматично — правильність складу на стороні вашого коду.
Для часткових повернень (тільки частина товарів) — у items передаються лише повернуті позиції з їх фактичною кількістю та сумами.
// Пример формирования частичного возврата
$receipt['type'] = 'sell_return';
$receipt['receipt']['items'] = $this->buildPartialReturnItems($order, $returnedItemIds);
Переконайтеся, що payment_method та payment_object заповнені коректно. CloudKassir не виконує звірку з оригінальним чеком — відповідальність за коректність даних лежить на вашому коді.
CloudKassir проти on-premise
| Параметр | CloudKassir | On-premise каса |
|---|---|---|
| Обладнання | Не потрібно | Фіскальний реєстратор |
| Інтеграція | API, 3–4 дні | 1–2 тижні |
| Мобільність | Будь-який інтернет | Прив'язка до місця |
Передоплата та розрахунки в кілька етапів
Якщо магазин приймає передоплату (наприклад, 50% при замовленні, 50% при доставці), потрібно надсилати два чеки:
- При першому платежі: позиції з
payment_method: prepayment(абоadvance), типsell - При закритті розрахунку: позиції з
payment_method: full_payment, типsell
Це вимога 54-ФЗ. CloudKassir його підтримує, Бітрікс з коробки — ні. Логіку двох чеків потрібно реалізовувати кастомно, орієнтуючись на статуси замовлення та тип платежу.
CloudKassir надає тестовий стенд: https://demo.cloudkassir.ru. Тестові облікові дані видаються при реєстрації. У тестовому режимі чеки не передаються в ФНП — можна безпечно налагоджувати структуру запитів.
Строки та вартість
| Склад | Строк |
|---|---|
| Прихід + повернення, Basic Auth | 3–4 дні |
| + Callback обробник + збереження ФД | +1 день |
| + Передоплатна схема (два чеки) | +2 дні |
Що входить в роботу
- Реалізація обробника платежів з відправкою чеків
- Створення властивостей замовлення для фіскальних даних (ФН, ФД, ФПД)
- Налаштування callback для автоматичного збереження фіскальних ознак
- Реалізація підтримки часткових повернень та передоплатних схем
- Тестування на demo-стенді CloudKassir
- Документація з експлуатації та підтримка 30 днів після здачі
Чек-лист запуску інтеграції
- Зареєструватися в CloudKassir, отримати логін/пароль.
- Створити властивості замовлення
CLOUDKASSIR_FN,CLOUDKASSIR_FD,CLOUDKASSIR_FPD. - Розмістити обробник у
/local/php_interface/include/sale_payment/cloudkassir/. - Налаштувати callback URL (якщо є білий IP).
- Перевірити мапінг ставок ПДВ.
- Виконати тестову оплату на demo-стенді.
- Перевірити збереження фіскальних даних у властивостях замовлення.
- Якщо є передоплата — реалізувати два чеки.
- Запустити на бойовому стенді та проконтролювати перші чеки.
- Передати документацію замовнику.
Більше 80 проектів з фіскалізації, 10+ років досвіду з Бітрікс. Ми супроводжуємо інтеграцію на всіх етапах. Отримайте консультацію щодо вашого завдання — оцінимо проект протягом дня.







