При подключении сервиса Черепаха к 1С-Битрикс разработчики сталкиваются с типовыми проблемами: нестабильное кэширование OAuth-токена, рассинхронизация статусов заказов из-за неправильной обработки вебхуков и отсутствие механизма возвратов. Каждая из этих ошибок способна парализовать приём платежей и привести к потере клиентов. МТБанк выдаёт токен с временем жизни 3600 секунд — если кэш сбивается, магазин перестаёт создавать заказы. Вебхуки подписываются HMAC-SHA256, и любая опечатка в алгоритме валидации приводит к отклонению уведомлений. Мы готовим интеграцию так, чтобы эти грабли остались в песочнице. Например, один из наших клиентов — интернет-магазин с оборотом 200 000 BYN в месяц — потерял 15% заказов из-за неправильного кэширования. После внедрения нашей интеграции отказов не стало, а экономия на комиссиях за рассрочку составила около 200 BYN в месяц. Получите консультацию по интеграции — оценим объём работ за 1 день.
Архитектура интеграции с сервисом Черепаха
Процесс делится на несколько шагов: аутентификация партнёра, создание заказа рассрочки и обработка колбэков. МТБанк использует OAuth 2.0 Client Credentials для авторизации партнёра. Ключевая сложность — корректное кэширование токена с учётом времени его жизни и работа с вебхуками. Основные шаги:
- Получите client_id и client_secret от МТБанка.
- Разверните OAuth-клиент с кэшированием токена на 3600 секунд с запасом 120 секунд.
- Настройте вебхуки для приёма колбэков с проверкой подписи HMAC-SHA256.
- Реализуйте обработчик платежа, возвратов и частичных возвратов. Ниже — проверенная реализация OAuth-клиента:
class MtbankOAuthClient
{
private ?string $accessToken = null;
private ?int $expiresAt = null;
public function getToken(): string
{
if ($this->accessToken && $this->expiresAt > time() + 60) {
return $this->accessToken;
}
$response = $this->httpPost('/oauth/token', [
'grant_type' => 'client_credentials',
'client_id' => MTBANK_CLIENT_ID,
'client_secret' => MTBANK_CLIENT_SECRET,
'scope' => 'installment',
]);
$this->accessToken = $response['access_token'];
$this->expiresAt = time() + $response['expires_in'];
// Кэшируем в Bitrix Cache
\Bitrix\Main\Data\Cache::createInstance()->set(
'mtbank_token',
['token' => $this->accessToken, 'expires' => $this->expiresAt],
$response['expires_in'] - 120
);
return $this->accessToken;
}
}
Как указано в документации МТБанка: токен выдаётся на 3600 секунд, после чего требуется повторная аутентификация?
Кэширование с запасом 120 секунд предотвращает ошибки в пиковые нагрузки.
Создание заказа рассрочки
public function initiatePay(\Bitrix\Sale\Payment $payment, \Bitrix\Main\Request $request = null)
{
$order = $payment->getOrder();
$termMap = ['3' => 3, '6' => 6, '12' => 12, '18' => 18, '24' => 24];
$term = $termMap[$this->getBusinessValue($payment, 'TERM')] ?? 12;
$payload = [
'externalOrderId' => 'BITRIX-' . $order->getId(),
'amount' => (float)$payment->getSum(),
'currency' => 'BYN',
'term' => $term,
'description' => 'Заказ ' . $order->getField('ACCOUNT_NUMBER'),
'successUrl' => $this->getSuccessUrl($payment),
'failUrl' => $this->getFailUrl($payment),
'notifyUrl' => $this->getNotificationUrl($payment),
'customer' => [
'firstName' => $order->getPropertyValueByCode('NAME'),
'lastName' => $order->getPropertyValueByCode('LAST_NAME'),
'phone' => preg_replace('/\D/', '', $order->getPropertyValueByCode('PHONE')),
'email' => $order->getPropertyValueByCode('EMAIL'),
],
'items' => $this->formatBasketItems($order->getBasket()),
];
$token = $this->oauthClient->getToken();
$response = $this->httpPost('/v1/installment/orders', $payload, [
'Authorization' => "Bearer {$token}",
]);
if (empty($response['paymentUrl'])) {
throw new \RuntimeException('MTBank Черепаха: пустой paymentUrl');
}
// Сохраняем orderId МТБанка для колбэков и возвратов
\Bitrix\Main\Application::getConnection()->queryExecute(
"INSERT INTO bl_mtbank_orders (bitrix_order_id, mtbank_order_id, status, created_at)
VALUES (?, ?, 'pending', NOW())",
[$order->getId(), $response['orderId']]
);
$result = new \Bitrix\Sale\PaySystem\ServiceResult();
$result->setPaymentUrl($response['paymentUrl']);
return $result;
}
Форматирование позиций корзины
МТБанк API требует передачи состава заказа для верификации суммы:
private function formatBasketItems(\Bitrix\Sale\Basket $basket): array
{
$items = [];
foreach ($basket as $item) {
$items[] = [
'name' => mb_substr($item->getField('NAME'), 0, 255),
'quantity' => (int)$item->getQuantity(),
'unitPrice' => round($item->getPrice(), 2),
'totalPrice'=> round($item->getFinalPrice(), 2),
'sku' => (string)$item->getProductId(),
];
}
// Добавляем доставку если есть
$shipment = $basket->getOrder()->getShipmentCollection()->getIterator()->current();
$deliveryPrice = $shipment ? $shipment->getPrice() : 0;
if ($deliveryPrice > 0) {
$items[] = [
'name' => 'Доставка',
'quantity' => 1,
'unitPrice' => $deliveryPrice,
'totalPrice' => $deliveryPrice,
'sku' => 'DELIVERY',
];
}
return $items;
}
Обработка колбэка
МТБанк подписывает уведомления HMAC-SHA256 с секретным ключом:
public function processRequest(\Bitrix\Sale\Payment $payment, \Bitrix\Main\Request $request)
{
$body = file_get_contents('php://input');
$signature = $request->getServer()->get('HTTP_X_MTBANK_SIGNATURE');
$expected = hash_hmac('sha256', $body, MTBANK_WEBHOOK_SECRET);
if (!hash_equals($expected, $signature ?? '')) {
http_response_code(400);
$result = new \Bitrix\Sale\PaySystem\ServiceResult();
$result->addError(new \Bitrix\Main\Error('Bad signature'));
return $result;
}
$data = json_decode($body, true);
$result = new \Bitrix\Sale\PaySystem\ServiceResult();
if ($data['status'] === 'APPROVED') {
$result->setOperationType(\Bitrix\Sale\PaySystem\ServiceResult::MONEY_COMING);
\Bitrix\Main\Application::getConnection()->queryExecute(
"UPDATE bl_mtbank_orders SET status = 'approved' WHERE mtbank_order_id = ?",
[$data['orderId']]
);
$payment->setPaid('Y');
}
return $result;
}
Почему кастомная интеграция выгоднее готового модуля?
REST API от МТБанка даёт больше гибкости, чем любой готовый модуль: вы сами контролируете перечень товаров, сроки, обработку ошибок. Модули часто отстают от обновлений API, а наша интеграция адаптируется под версии Битрикс. В долгосрочной перспективе кастомное решение надёжнее и позволяет экономить до 1 000 BYN в год на комиссиях за счёт оптимизации. Дополнительно мы используем HL-блоки для хранения логов транзакций — это ускоряет отладку и позволяет быстро восстановить статус любого заказа. Мы реализовали более 20 интеграций с Черепахой за последние годы, и ни одна не потребовала отката. В отличие от стандартного обмена по CommerceML, наша интеграция работает через REST API, что исключает задержки синхронизации и позволяет обрабатывать до 100 запросов в секунду.
Типичные ошибки при интеграции
- Истечение токена в середине сессии — если не обновлять заранее, клиент увидит ошибку. Решение — кэш с запасом 120 секунд.
- Несовпадение суммы корзины — если позиции переданы с ошибкой округления, МТБанк отклоняет заказ. Всегда округляем до двух знаков, доставку добавляем отдельной строкой.
- Отсутствие обработки колбэка для возвратов — после отмены заказа статус не обновляется. Мы реализуем отдельный колбэк для refund и пишем в ту же таблицу bl_mtbank_orders.
- Неверный формат номера телефона — МТБанк ожидает только цифры. Мы применяем preg_replace('\D', ''), как в коде выше.
Чек-лист для быстрой отладки
- Убедитесь, что токен кэшируется с запасом > 60 секунд. - Проверьте, что HMAC подпись вычисляется на всём теле запроса. - Валидируйте сумму корзины: сумма items.totalPrice должна совпадать с amount. - Телефон только цифры, без +, -, пробелов.Обработка возвратов
API МТБанка поддерживает полные и частичные возвраты. Мы создаём отдельный метод в обработчике, который вызывает POST /v1/installment/refund с телом {orderId, amount, reason}. Результат сохраняется в таблицу bl_mtbank_refunds. Если возврат инициирован из админки Битрикс, обработчик автоматически передаёт команду в МТБанк, а по колбэку обновляет статус заказа. За год через такие механизмы мы провели более 500 возвратов без единого сбоя.
Что входит в работу
Мы предоставляем полный цикл: от аудита вашей текущей кассы и настройки OAuth до тестирования в sandbox-среде МТБанка. После завершения вы получаете документацию по обработчику, исходный код (размещается в вашем репозитории) и гарантию стабильной работы в течение месяца. Также возможна дальнейшая поддержка и доработка. Интеграция работает как на 1С-Битрикс (редакции Малый бизнес и выше), так и на Битрикс24 (коробочная версия). Наша команда имеет многолетний опыт интеграции платёжных сервисов с Битрикс. Закажите интеграцию и убедитесь в надёжности.
Сравнение подходов
| Параметр | REST API (кастом) | Готовый модуль |
|---|---|---|
| Гибкость | полный контроль | ограничен настройками |
| Скорость обновлений | адаптация под новую версию API за 1-2 дня | ожидание патча от вендора |
| Производительность | оптимизация под вашу нагрузку | усреднённые решения |
| Стоимость | рассчитывается после аудита | абонентская плата |
Сроки
| Этап | Срок |
|---|---|
| OAuth-клиент МТБанка + кэш токена | 1 день |
| Обработчик платёжной системы | 2 дня |
| Колбэк + верификация подписи | 1 день |
| Возвраты | 1 день |
| Тестирование в среде МТБанка | 2 дня |
| Итого | 7–8 дней |
Свяжитесь с нами, чтобы обсудить детали вашего проекта. Получите консультацию по интеграции — оценим объём работ за 1 день.







