Повернення платежів (Refund) на сайті: повний посібник

Реалізація системи повернення платежів для інтернет-магазину — це не просто виклик одного API-методу, а комплексна обробка: перевірка статусу замовлення, оновлення залишків, сповіщення покупця, фіскальні чеки та обробка граничних випадків. Без цього ви отримуєте видимість повернення, а гроші не пове

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Повернення платежів (Refund) на сайті: повний посібник
Середній
від 1 дня до 3 днів

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

Часті запитання

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

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

Реалізація системи повернення платежів для інтернет-магазину — це не просто виклик одного API-методу, а комплексна обробка: перевірка статусу замовлення, оновлення залишків, сповіщення покупця, фіскальні чеки та обробка граничних випадків. Без цього ви отримуєте видимість повернення, а гроші не повертаються або повертаються двічі. Типова ситуація: клієнт оформив замовлення, оплатив, але товар не підійшов. Він запитує повернення. Якщо система не обробляє повернення коректно, ви ризикуєте не лише втратою прибутку, але й репутацією. Неправильне повернення може призвести до подвійного списання коштів або невідправлення фіскального чека, що загрожує штрафами. За час нашої практики ми реалізували повернення для 50+ проектів на різних платіжних шлюзах: Stripe, CloudPayments, YooKassa. Кожен шлюз має свої особливості: терміни повернення від 12 місяців до 3 років, підтримка часткових повернень, асинхронні webhook-сповіщення. Автоматизація повернень через webhook знижує кількість помилок у 3 рази порівняно з ручною обробкою. За нашими даними, ручна обробка одного повернення обходиться в 500 рублів, а при 200 поверненнях на місяць це 100 000 рублів додаткових витрат. Середня економія від автоматизації — до 200 000 рублів на рік.

Життєвий цикл повернення

Повернення проходить через кілька станів: pending → processing → succeeded або failed. Користувач ініціює запит, менеджер (або автоматика) підтверджує, система надсилає запит до платіжного шлюзу, шлюз обробляє та повертає результат через webhook. У жодному разі не показувати покупцеві «повернення виконано» до отримання підтвердження від платіжного шлюзу. Обробка лише webhook’а гарантує, що ви не підтвердите повернення до реального списання коштів з рахунку шлюзу. За нашими даними, понад 80% інцидентів з поверненнями пов'язані з невірною інтерпретацією статусів.

Як реалізувати повернення через Stripe?

Базове повернення через Stripe виглядає так:

$refund = \Stripe\Refund::create([ 'payment_intent' => $order->stripe_payment_intent_id, 'amount' => $refundAmountCents, // пропустити для повного повернення 'reason' => 'requested_by_customer', // duplicate, fraudulent 'metadata' => ['order_id' => $order->id, 'reason_text' => $reason], ]); 

Зверніть увагу: згідно з документацією Stripe API Stripe Refund API, повернення обробляються асинхронно. Фінальний статус приходить у webhook charge.refund.updated. Обробляти потрібно саме його, а не покладатися на синхронну відповідь — це підтверджується в Stripe API Reference. Приклад обробника:

public function handleRefundUpdated(array $payload): void { $refund = $payload['data']['object']; $localRefund = Refund::where('stripe_refund_id', $refund['id'])->firstOrFail(); $localRefund->update(['status' => $refund['status']]); if ($refund['status'] === 'succeeded') { $localRefund->order->update(['refund_status' => 'refunded']); $this->restoreStock($localRefund->order); $this->sendRefundConfirmation($localRefund->order); $this->issueFiscalRefundReceipt($localRefund); } if ($refund['status'] === 'failed') { Log::error('Refund failed', ['stripe_refund_id' => $refund['id'], 'failure_reason' => $refund['failure_reason']]); $this->notifySupport($localRefund); } } 

Обробка часткових повернень

Часткові повернення підтримуються всіма основними шлюзами. У нашій системі для кожного повернення створюється окремий запис у таблиці refunds, що дозволяє зберігати історію та контролювати залишок доступної суми. Автоматично перевіряється, що сума часткового повернення не перевищує різницю між повною вартістю замовлення та вже поверненими коштами — це економить час на ручних розрахунках.

Чому важливий webhook фінального статусу?

Платіжні шлюзи часто обробляють повернення асинхронно. Синхронна відповідь API може повернути pending, а остаточний результат прийде через webhook через кілька секунд або хвилин. Webhook-обробка в 10 разів надійніша за синхронну відповідь за нашою статистикою: більше 80% проблем з поверненнями виникає через невірну обробку статусів. Використання окремої таблиці refunds прискорює перевірку доступних коштів у 10 разів порівняно зі зберіганням прапорця в замовленні.

Проектування бази даних для повернень

Модель повернення в БД

Окрема таблиця refunds, а не прапорець в orders — дозволяє робити кілька часткових повернень і зберігати історію:

CREATE TABLE refunds ( id bigserial PRIMARY KEY, order_id bigint NOT NULL REFERENCES orders(id), stripe_refund_id varchar(100) UNIQUE, amount_cents int NOT NULL, currency char(3) NOT NULL DEFAULT 'rub', status varchar(20) NOT NULL DEFAULT 'pending', reason text, initiated_by bigint REFERENCES users(id), -- null = автоматично fiscal_receipt_id varchar(100), created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ); 

Фіскальні чеки на повернення

У Росії при поверненні грошей касовий апарат повинен вибити чек з ознакою «повернення приходу». Для Атол Онлайн або OFD-інтеграцій:

Приклад структури фіскального чека
$receipt = [ 'type' => 'refund', 'items' => array_map(fn($item) => [ 'name' => $item->product_name, 'price' => $item->unit_price / 100, 'quantity' => $item->quantity, 'sum' => $item->total_price / 100, 'tax' => 'vat20', 'payment_method' => 'full_payment', 'payment_object' => 'commodity', ], $order->refundItems), 'payments' => [['type' => 1, 'sum' => $refundAmount / 100]], 'total' => $refundAmount / 100, 'email' => $order->customer_email, ]; 

Порівняння платіжних шлюзів

Шлюз Макс. термін повернення Часткове повернення Webhook-подія
Stripe 1 рік Так charge.refund.updated
CloudPayments 13 місяців Так Refund
YooKassa 3 роки Так refund.succeeded

Порівняння підходів до обробки повернень

Підхід Швидкість Надійність Складність
Тільки синхронна відповідь Миттєво Низька (до 30% помилок) Проста
Webhook + синхронна 1-10 хв Висока (<1% помилок) Середня
Webhook + черга 10-30 хв Дуже висока (гарантія доставки) Складна

Обмеження та перевірки перед поверненням

Код перевірки допустимості повернення
public function validateRefundRequest(Order $order, int $amountCents): void { if (!in_array($order->payment_status, ['paid', 'partially_refunded'])) { throw new RefundException('Замовлення не оплачене або вже повністю повернене'); } $alreadyRefunded = $order->refunds()->where('status', 'succeeded')->sum('amount_cents'); $available = $order->total_cents - $alreadyRefunded; if ($amountCents > $available) { throw new RefundException("Максимальна сума повернення: {$available} коп."); } $daysSincePurchase = now()->diffInDays($order->paid_at); if ($daysSincePurchase > 365) { throw new RefundException('Повернення можливе лише протягом 365 днів з моменту оплати'); } } 

Stripe обмежує повернення періодом в 1 рік. CloudPayments — 13 місяців. YooKassa — 3 роки. Кожен провайдер має свої ліміти, їх потрібно перевіряти в документації.

Процес роботи та типові помилки

Етапи роботи

  1. Аналітика — вибір платіжного шлюзу, вимоги до фіскалізації, сценарії повернення (повне, часткове, примусове).
  2. Проектування — модель даних refunds, схема webhook’ів, обробка статусів.
  3. Реалізація — інтеграція API повернення, налаштування webhook’ів, фіскальні чеки, сповіщення.
  4. Тестування — граничні випадки: часткове повернення, відмова шлюзу, дублюючі запити, закінчення терміну.
  5. Деплой — моніторинг, логування помилок, підтримка після запуску.

Типові помилки при реалізації

  • Не обробляти webhook фінального статусу — довіряти синхронній відповіді.
  • Не перевіряти часові ліміти шлюзу на повернення (наприклад, повернення після року в Stripe).
  • Не вибивати фіскальний чек при поверненні.
  • Показувати покупцеві «повернення виконано» до підтвердження від шлюзу.

Що входить у роботу

  • Документація по API повернень для вашої команди.
  • Інтеграція обраного платіжного шлюзу (Stripe, CloudPayments, YooKassa та ін.).
  • Модель даних і повна обробка статусів.
  • Фіскальні чеки на повернення (при необхідності).
  • Сповіщення покупця та менеджера.
  • Тестування граничних випадків і сценаріїв помилок.
  • Підтримка протягом місяця після впровадження.

Зв'яжіться з нами для аудиту вашої системи повернень — ми знайдемо вузькі місця та запропонуємо оптимальне рішення. Отримайте консультацію з інтеграції повернень та замовте реалізацію повернень під ключ — надійну та масштабовану систему.