Налаштування розділення платежів (Split Payments) на 1С-Бітрікс
Split payment — автоматичний розподіл суми платежу між кількома отримувачами в момент транзакції. Актуально для маркетплейсів: покупець платить одну суму, платформа автоматично переказує частки продавцям та утримує комісію. В 1С-Бітрікс це нестандартний функціонал — реалізується через платіжний агрегатор з підтримкою splits.
Коли потрібен split payment
- Маркетплейс — замовлення містить товари від кількох продавців, кожному потрібно перевести свою частку
- Партнерська модель — відсоток від платежу йде реферралу або агенту
- Холдингова структура — кілька юридичних осіб, один сайт
Без split payment альтернатива — ручні перекази за підсумками періоду (раз на тиждень/місяць). Це погано масштабується та створює касові розриви.
ЮКаса: Split через Marketplace API
ЮКаса підтримує split через параметр transfers при створенні платежу:
$payment = $yookassaClient->createPayment([
'amount' => ['value' => '10000.00', 'currency' => 'RUB'],
'capture' => true,
'description' => 'Замовлення з кількома продавцями',
'transfers' => [
[
// Переказ продавцю 1 (7000 грн.)
'account_id' => 'seller_yookassa_account_id_1',
'amount' => ['value' => '7000.00', 'currency' => 'RUB'],
'platform_fee_amount' => ['value' => '700.00', 'currency' => 'RUB'], // комісія платформи
'description' => 'Замовлення ' . $orderId . ': товари продавця 1',
'metadata' => ['seller_id' => $sellerId1],
],
[
// Переказ продавцю 2 (2000 грн., залишок 1000 грн. — комісія платформи)
'account_id' => 'seller_yookassa_account_id_2',
'amount' => ['value' => '2000.00', 'currency' => 'RUB'],
'platform_fee_amount' => ['value' => '200.00', 'currency' => 'RUB'],
'description' => 'Замовлення ' . $orderId . ': товари продавця 2',
'metadata' => ['seller_id' => $sellerId2],
],
],
'metadata' => ['order_id' => $orderId],
], uniqid('', true));
Сума всіх transfers.amount не повинна перевищувати загальну суму платежу. Різниця осідає на рахунку платформи.
Розрахунок часток в 1С-Бітрікс
class SplitPaymentCalculator
{
public function calculate(\Bitrix\Sale\Order $order): array
{
$transfers = [];
$platformFeeRate = 0.10; // 10% комісія платформи
foreach ($order->getBasket()->getOrderableItems() as $item) {
$sellerId = $item->getField('SELLER_ID');
$itemTotal = $item->getFinalPrice();
$sellerAmount = $itemTotal * (1 - $platformFeeRate);
$platformFee = $itemTotal * $platformFeeRate;
$transfers[$sellerId]['amount'] = ($transfers[$sellerId]['amount'] ?? 0) + $sellerAmount;
$transfers[$sellerId]['fee'] = ($transfers[$sellerId]['fee'] ?? 0) + $platformFee;
}
// Приводимо до формату ЮКаси
$result = [];
foreach ($transfers as $sellerId => $data) {
$seller = SellerTable::getById($sellerId)->fetch();
$result[] = [
'account_id' => $seller['YOOKASSA_ACCOUNT_ID'],
'amount' => ['value' => number_format($data['amount'], 2, '.', ''), 'currency' => 'RUB'],
'platform_fee_amount' => ['value' => number_format($data['fee'], 2, '.', ''), 'currency' => 'RUB'],
];
}
return $result;
}
}
Повернення при split payment
Повернення split-платежу вимагає вказати, з чийого рахунку здійснюється повернення:
$refund = $yookassaClient->createRefund([
'payment_id' => $paymentId,
'amount' => ['value' => $refundAmount, 'currency' => 'RUB'],
'sources' => [
[
'account_id' => $sellerAccountId,
'amount' => ['value' => $refundAmount, 'currency' => 'RUB'],
'platform_fee_amount' => ['value' => $platformFeeToRefund, 'currency' => 'RUB'],
],
],
], uniqid('', true));
Терміни
| Завдання | Термін |
|---|---|
| Розрахунок часток + інтеграція з ЮКаса transfers | 2–3 дні |
| Таблиця акаунтів продавців + прив'язка | 1 день |
| Логіка повернення при split | 1 день |







