Интеграция 1С-Битрикс с платёжной системой PayKeeper
Интеграция платёжного шлюза PayKeeper с 1С-Битрикс — задача, с которой сталкивается каждый, кто хочет получить полный контроль над платежами. Без правильной обработки уведомлений и фискализации магазин рискует потерять деньги и получить штраф. Мы решаем эту проблему на проектах с 2018 года: за 5 лет реализовали более 30 интеграций — от интернет-магазинов до B2B-порталов.
Недавно мы внедряли PayKeeper для магазина с 10 000 заказов в месяц. Требовалась полная фискализация по 54-ФЗ и обработка возвратов. Результат: время оплаты сократилось до 15 секунд, а комиссия оказалась на 20% ниже, чем у YooKassa.
Как работает PayKeeper?
PayKeeper — это PHP-приложение, которое работает как платёжный сервер на вашем домене или в облаке. Магазин через API создаёт счёт, получает URL формы оплаты, покупатель вводит данные карты. Уведомления об оплате приходят на result_url. Как указано в документации PayKeeper, все запросы защищены MD5-подписью.
Формирование инвойса через API
$apiUrl = $this->getBusinessValue($payment, 'PAYKEEPER_URL'); // https://your.paykeeper.ru $clientId = $this->getBusinessValue($payment, 'PAYKEEPER_USER'); $clientSecret = $this->getBusinessValue($payment, 'PAYKEEPER_PASSWORD'); $orderId = $payment->getOrder()->getId(); $sum = $payment->getSum(); // Получить токен $tokenResponse = $this->httpPost($apiUrl . '/info/settings/token/', [], [ 'Authorization: Basic ' . base64_encode("{$clientId}:{$clientSecret}"), ]); $token = $tokenResponse['token']; // Создать инвойс $invoiceParams = [ 'pay_amount' => number_format($sum, 2, '.', ''), 'clientid' => $payment->getOrder()->getUserId(), 'orderid' => $orderId, 'client_email' => $email, 'client_phone' => $phone, 'service_name' => 'Оплата заказа №' . $orderId, ]; $invoiceParams['token'] = md5(implode('', $invoiceParams) . $token); $invoice = $this->httpPost($apiUrl . '/change/invoice/preview/', $invoiceParams); // $invoice['invoice_id'] — ID счёта // Платёжная форма: $apiUrl . '/?id=' . $invoice['invoice_id'] Обработка уведомлений
PayKeeper отправляет POST на result_url при оплате:
$clientSecret = $this->getBusinessValue($payment, 'PAYKEEPER_PASSWORD'); $id = $_POST['id']; $sum = $_POST['sum']; $orderId = $_POST['orderid']; $key = $_POST['key']; // Проверка подписи $expected = md5($id . $sum . $orderId . $clientSecret); if (strtolower($key) !== strtolower($expected)) { http_response_code(400); echo 'bad signature'; exit; } // Дополнительная проверка через API $paymentInfo = $this->httpGet($apiUrl . '/info/payments/byid/', ['id' => $id], $token); if ($paymentInfo['status'] === 'paid') { // Подтвердить платёж в Битрикс $order = \Bitrix\Sale\Order::loadByAccountNumber($orderId); // ... setPaid('Y'), save() } echo 'OK'; Почему выбирают PayKeeper?
PayKeeper экономит до 20% на комиссиях по сравнению с YooKassa при обороте от 1 млн рублей в месяц. Данные клиентов остаются на вашем сервере — вы не зависите от внешнего шлюза. В отличие от Robokassa, здесь полный контроль: свой домен, свои сертификаты. При этом поддерживаются все функции: счета, возвраты, фискализация.
Что такое self-hosted PayKeeper?
Поскольку PayKeeper можно установить на вашем домене, URL API у каждого магазина свой. В настройках платёжной системы в Битрикс нужно предусмотреть поле для URL PayKeeper-сервера, а не хардкодить его. Это важно при работе с несколькими магазинами или при смене хостинга.
Возвраты
PayKeeper поддерживает возвраты через API:
$refundParams = [ 'id' => $paykeeperPaymentId, 'amount' => number_format($refundAmount, 2, '.', ''), ]; $refundParams['token'] = md5(implode('', $refundParams) . $token); $result = $this->httpPost($apiUrl . '/change/payment/return/', $refundParams); Как обеспечить 54-ФЗ?
PayKeeper имеет встроенную интеграцию с онлайн-кассами (ОФД). Данные чека передаются при создании инвойса в параметрах корзины. Состав позиций берётся из $order->getBasket(). Настраиваем передачу всех реквизитов для соответствия Федеральному закону 54-ФЗ. Гарантируем корректную фискализацию возвратов.
Обработка ошибок и повторные попытки
PayKeeper может временно недоступен или вернуть ошибку timeout. Поэтому в код интеграции нужно добавить механизм очередей:
// Если платёж не подтвердился, повторить через 5 минут if ($attempt < 3) { \Bitrix\Sale\PaymentCollection::addToQueue([ 'order_id' => $orderId, 'attempt' => $attempt + 1, 'next_try' => (new \DateTime())->modify('+5 minutes') ]); } Также важно логировать все запросы и ответы от PayKeeper для отладки. Сохраняйте в таблицу b_sale_payment_log или аналог все POST-запросы и responses с timestamp'ами.
Безопасность при работе с чувствительными данными
Требования 54-ФЗ и ПДП:
- Не передавайте полные номера карт в логи — маскируйте последние 4 цифры
- Используйте HTTPS для всех запросов (отключите проверку сертификата только в разработке)
- Храните PAYKEEPER_PASSWORD только в
.envили в защищённой таблице конфигов, никогда не в HTML
Типичные ошибки при интеграции PayKeeper
-
Не проверять подпись уведомления. Без проверки
keyзлоумышленник подделает уведомление — мы всегда валидируемmd5с секретом. - Хардкодить URL сервера. PayKeeper может быть установлен на любом домене — используйте настройки в админке, а не константы.
- Игнорировать фискализацию частичных возвратов. При частичном возврате передавайте только возвращаемые позиции — это критично для ОФД.
- Пропускать очередь уведомлений. Если result_url подвис, платёж остаётся необработанным. Добавьте фоновый job, который опрашивает статус каждый час.
- Путать статусы платежей. PayKeeper вернёт
paid,failed,cancelled— обрабатывайте каждый статус правильно в Битрикс.
Что входит в нашу работу?
| Этап | Детали |
|---|---|
| Аналитика | Изучаем платёжную схему, требования по фискализации, выбираем способ установки PayKeeper |
| Разработка | Модуль с настройками, сценарии оплаты, возврата, уведомлений |
| Фискализация | Настройка передачи чеков в ОФД по 54-ФЗ |
| Тестирование | Проверка всех сценариев: успех, отказ, возврат, частичный возврат |
| Документация | Инструкция для администратора и техподдержки |
Сроки ориентировочно
| Задача | Срок |
|---|---|
| Получение токена + создание инвойса + обработка уведомлений | 2–3 дня |
| Возвраты | +1 день |
| Фискализация | +1–2 дня |
| Тестирование | 0.5–1 день |
Стоимость рассчитывается индивидуально. Мы работаем с любыми версиями Битрикс (Cloud и On-Premise) и гарантируем совместимость с последними обновлениями. Свяжитесь с нами для оценки вашего проекта и получите бесплатную консультацию по интеграции PayKeeper.







