Реалізація холдування коштів на сайті

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація холдування коштів на сайті
Середня
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація холдирування платежу на веб-сайті

Холдирування (авторизація без списання) — механізм, при якому гроші блокуються на карті покупця, але не надходять продавцю до явного підтвердження. Використовується там, де окончательна сума або факт виконання замовлення невідомі в момент оплати: доставка з оплатою по факту, бронювання з змінною вартістю, предзамовлення.

Як працює двостадійна оплата

Процес складається з двох операцій: authorize (авторизація, блокування коштів) і capture (захист, фактичне списання). Між ними — довільний проміжок часу, але з обмеженням: більшість банків знімають холд через 7 днів, деякі через 30. Якщо capture не відбувся — холд снімається автоматично, гроші повертаються.

Stripe: authorize + capture

У Stripe двостадійна оплата реалізується через capture_method: manual:

$paymentIntent = \Stripe\PaymentIntent::create([
    'amount'         => $order->total_cents,
    'currency'       => 'eur',
    'capture_method' => 'manual', // не списувати одразу
    'payment_method_types' => ['card'],
    'metadata'       => ['order_id' => $order->id],
]);

Після підтвердження 3DS покупцем PaymentIntent переходить у статус requires_capture. Гроші заблоковані, але не списані. Коли замовлення готове до відправки:

\Stripe\PaymentIntent::capture($order->stripe_payment_intent_id, [
    'amount_to_capture' => $finalAmountCents, // можна менше ініціального
]);

Capture можна виконати на суму, меншу заблокованої — наприклад, якщо частина товару виявилася недоступна. На більшу — нельзя.

YooKassa: двостадійна оплата

$payment = $client->createPayment([
    'amount'   => ['value' => '1500.00', 'currency' => 'RUB'],
    'capture'  => false, // двостадійна оплата
    'payment_method_data' => ['type' => 'bank_card'],
    'confirmation' => ['type' => 'redirect', 'return_url' => $returnUrl],
    'description' => 'Замовлення #' . $order->id,
], uniqid('', true));

Коли готові списати:

$client->capturePayment(
    ['amount' => ['value' => '1500.00', 'currency' => 'RUB']],
    $order->yookassa_payment_id,
    uniqid('', true)
);

Відмена холду (cancel authorization)

Якщо замовлення відмінено до capture — потрібно явно відмінити авторизацію, інакше гроші залишаються заблокованими до istечення строку:

// Stripe
\Stripe\PaymentIntent::cancel($order->stripe_payment_intent_id, [
    'cancellation_reason' => 'abandoned',
]);

// YooKassa
$client->cancelPayment($order->yookassa_payment_id, uniqid('', true));

Моніторинг istекаючих холдів

Строк дії авторизації — критичний параметр. Потрібен фоновий процес, який знаходить холди, близькі до istечення:

// Команда, запускається раз на годину
$expiringSoon = Order::where('payment_status', 'authorized')
    ->where('authorized_at', '<', now()->subDays(6)) // Stripe дає 7 днів
    ->get();

foreach ($expiringSoon as $order) {
    // Сповістити менеджера або автоматично скасувати
    Notification::send($order->manager, new AuthorizationExpiring($order));
}

Зберігати authorized_at в таблиці замовлень — обов'язково. Строк Stripe — 7 днів для більшості карт, до 31 дня для деяких. Краще орієнтуватися на 5–6 днів як безопасний ліміт.

Partial capture

Stripe підтримує partial capture — захист суми менше авторизованої. Різниця автоматично розблокується. Це корисно для сценаріїв з змінною вартістю доставки: спочатку авторизуємо максимум, по факту списуємо реальну вартість.

\Stripe\PaymentIntent::capture($intentId, [
    'amount_to_capture' => $actualAmountCents,
]);
// Остача ($authorizedAmount - $actualAmount) автоматично розблокується

CloudPayments та більшість російських провайдерів partial capture також підтримують, але синтаксис і поведінка потрібно перевіряти в документації конкретного шлюзу — відмінності є.