Подключение LiqPay / WayForPay к WooCommerce: оплата, callback и статусы заказов

Автор:vkuzyomko

Подключение LiqPay / WayForPay к WooCommerce: оплата, callback и статусы заказов

Краткий ответ: подключить LiqPay или WayForPay к WooCommerce можно через готовый платёжный плагин или через свой модуль оплаты. Правильное подключение должно не просто перенаправлять покупателя на оплату, а создавать заказ, передавать сумму, номер заказа, валюту, получать callback от платёжной системы, проверять подпись, менять статус заказа и писать ошибки в лог WooCommerce.

Причина

WooCommerce из коробки не содержит встроенной оплаты LiqPay или WayForPay. Эти платёжные системы подключаются как отдельные payment gateway модули.

На практике проблема не в том, чтобы показать кнопку оплаты. Основные ошибки появляются после оплаты:

  • покупатель оплатил, но заказ остался в статусе pending;
  • заказ перешёл в processing, хотя оплата не прошла;
  • платёж прошёл, но WooCommerce не получил callback;
  • callback заблокировал кеш, firewall или security-плагин;
  • подпись платежа не проверяется;
  • тестовый режим остался включённым на рабочем сайте;
  • сумма в платёжной системе не совпадает с суммой заказа;
  • после оплаты покупателя возвращает на неправильную страницу;
  • письма WooCommerce не отправляются после успешной оплаты;
  • CRM или Telegram получают заказ раньше подтверждения оплаты.

Для магазина важно, чтобы WooCommerce доверял не странице “Спасибо за заказ”, а серверному ответу от LiqPay или WayForPay. Редирект покупателя может не сработать, браузер может закрыться, интернет может пропасть. Callback от платёжной системы — более надёжная точка подтверждения оплаты.

Диагностика

Перед подключением нужно понять, какая логика оплаты нужна именно вашему магазину.

Вопрос Почему важно Что проверить
Какая система нужна: LiqPay или WayForPay? У них разные кабинеты, ключи, callback и подписи Условия, комиссии, валюты, методы оплаты
Нужна ли оплата картой, Apple Pay, Google Pay? Не все методы могут быть активны сразу Настройки мерчанта
Когда менять статус заказа? Нельзя отмечать заказ оплаченным до подтверждения Callback, статус платежа, сумма
Куда возвращать покупателя? После оплаты нужна правильная страница заказа returnUrl, result_url
Куда платёжная система отправляет callback? По нему WooCommerce узнаёт результат оплаты serviceUrl, server_url, endpoint плагина
Есть ли кеш на callback URL? Кеш может вернуть HTML вместо обработки платежа Исключения кеша, CDN, Cloudflare
Нужна ли передача оплаты в CRM? CRM должна получать правильный статус оплаты Интеграция WooCommerce с CRM

Если после подключения оплаты покупатель не может завершить заказ, нужно отдельно проверить checkout, JavaScript, AJAX и кеш. Подробно это разобрано в статье WooCommerce не оформляет заказ.

Нужно быстро решить проблему на сайте?

Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.

Оставить заявку

Решение

1. Выбрать способ подключения

Есть два основных варианта: готовый плагин или кастомный payment gateway.

Вариант Когда подходит Минусы
Готовый плагин Нужно быстро включить оплату без разработки Не всегда есть логи, гибкие статусы и нормальная обработка ошибок
Кастомный модуль оплаты Нужны точные статусы, callback, CRM, Telegram, нестандартная логика Требует разработки и тестирования
Доработка существующего плагина Плагин почти подходит, но не хватает деталей Нужно аккуратно не сломать обновления

Если магазин простой, можно начать с готового плагина. Если есть CRM, Telegram, Новая Почта, нестандартные статусы, предоплата, частичная оплата или подписки, лучше делать отдельную доработку WooCommerce.

2. Получить ключи в кабинете платёжной системы

Для LiqPay обычно нужны:

  • public_key;
  • private_key;
  • рабочий или тестовый режим;
  • URL возврата покупателя;
  • серверный callback URL.

Для WayForPay обычно нужны:

  • merchantAccount;
  • merchantSecretKey;
  • merchantDomainName;
  • returnUrl;
  • serviceUrl.

Секретные ключи нельзя вставлять в HTML, JavaScript, data-атрибуты, публичные файлы темы или открытый репозиторий. Их нужно хранить на сервере: в настройках плагина с закрытым доступом или в wp-config.php.

3. Настроить статусы WooCommerce

Оплата должна менять статус заказа только после подтверждения от платёжной системы.

Событие Статус WooCommerce Комментарий
Заказ создан, оплаты ещё нет pending Покупатель только перешёл к оплате
Платёж успешный processing или completed Для физических товаров чаще processing
Платёж отклонён failed Можно добавить note с причиной
Покупатель закрыл оплату pending Не нужно автоматически считать заказ отменённым сразу
Возврат платежа refunded Зависит от логики магазина
Ошибка callback Не менять статус Сначала проверить подпись и сумму

Ошибка в статусах может сломать весь процесс: менеджер увидит заказ как оплаченный, CRM получит неверный этап, Telegram отправит неправильное уведомление, а склад начнёт собирать неоплаченный заказ.

4. Исключить callback из кеша

Callback URL платёжной системы нельзя кешировать.

Из кеша нужно исключить:

  • страницу checkout;
  • страницу оплаты заказа;
  • страницу order received;
  • endpoint платёжного плагина;
  • wc-api endpoint, если он используется;
  • callback URL LiqPay или WayForPay;
  • страницы с параметрами ответа оплаты.

Если callback попадает в кеш, платёжная система может получить красивую HTML-страницу вместо технической обработки. В итоге деньги списаны, но WooCommerce не меняет статус заказа.

5. Проверить связь с CRM и доставкой

Если магазин передаёт заказы в CRM, важно решить, когда именно отправлять данные: при создании заказа или после успешной оплаты.

Для интернет-магазинов часто работает такая схема:

  • заказ создан → отправить лид в CRM;
  • оплата прошла → обновить сделку как оплаченную;
  • доставка выбрана → передать данные Новой Почты;
  • статус изменился → обновить этап сделки.

Если оплата, CRM и доставка работают вместе, полезно заранее продумать общую логику. Для этого подойдут материалы Интеграция WooCommerce с CRM и Интеграция WooCommerce с Новой Почтой.

Код

Важно: код ниже — технический пример структуры платёжной интеграции. Он может повлиять на оплату, статусы заказов, checkout и безопасность магазина. Не используйте его без тестов на копии сайта. Для рабочего проекта нужно сверить параметры и алгоритм подписи с актуальной документацией LiqPay или WayForPay.

1. Хранить ключи в wp-config.php

Куда вставлять: файл wp-config.php, выше строки /* That's all, stop editing! */.

define( 'SC_LIQPAY_PUBLIC_KEY', 'your_liqpay_public_key' );
define( 'SC_LIQPAY_PRIVATE_KEY', 'your_liqpay_private_key' );

define( 'SC_WFP_MERCHANT_ACCOUNT', 'your_wayforpay_merchant_account' );
define( 'SC_WFP_SECRET_KEY', 'your_wayforpay_secret_key' );

2. Проверить, что заказ можно отправлять на оплату

Куда вставлять: в отдельный мини-плагин или в класс вашего платёжного шлюза WooCommerce.

function sc_payment_get_order_for_gateway( $order_id ) {
    $order = wc_get_order( $order_id );

    if ( ! $order ) {
        return false;
    }

    if ( $order->get_total() <= 0 ) {
        return false;
    }

    if ( ! in_array( $order->get_currency(), array( 'UAH' ), true ) ) {
        return false;
    }

    return $order;
}

Такая проверка нужна, чтобы не отправлять в платёжную систему пустые, битые или неподдерживаемые заказы.

3. Базовая структура WooCommerce payment gateway

Куда вставлять: в отдельный плагин. Для платёжных шлюзов не стоит использовать functions.php, потому что код оплаты должен жить независимо от темы.

add_filter( 'woocommerce_payment_gateways', 'sc_register_custom_payment_gateways' );

function sc_register_custom_payment_gateways( $gateways ) {
    $gateways[] = 'SC_Gateway_LiqPay_Example';
    return $gateways;
}

add_action( 'plugins_loaded', 'sc_init_liqpay_gateway_example' );

function sc_init_liqpay_gateway_example() {
    if ( ! class_exists( 'WC_Payment_Gateway' ) ) {
        return;
    }

    class SC_Gateway_LiqPay_Example extends WC_Payment_Gateway {
        public function __construct() {
            $this->id                 = 'sc_liqpay_example';
            $this->method_title       = 'LiqPay Example';
            $this->method_description = 'Example LiqPay gateway structure for WooCommerce.';
            $this->has_fields         = false;

            $this->init_form_fields();
            $this->init_settings();

            $this->title       = $this->get_option( 'title' );
            $this->description = $this->get_option( 'description' );

            add_action(
                'woocommerce_update_options_payment_gateways_' . $this->id,
                array( $this, 'process_admin_options' )
            );
        }

        public function init_form_fields() {
            $this->form_fields = array(
                'enabled' => array(
                    'title'   => 'Enable/Disable',
                    'type'    => 'checkbox',
                    'label'   => 'Enable LiqPay Example',
                    'default' => 'no',
                ),
                'title' => array(
                    'title'   => 'Title',
                    'type'    => 'text',
                    'default' => 'Оплата картой LiqPay',
                ),
                'description' => array(
                    'title'   => 'Description',
                    'type'    => 'textarea',
                    'default' => 'Оплата банковской картой через LiqPay.',
                ),
            );
        }

        public function process_payment( $order_id ) {
            $order = sc_payment_get_order_for_gateway( $order_id );

            if ( ! $order ) {
                wc_add_notice( 'Ошибка оплаты. Заказ не найден или сумма некорректна.', 'error' );

                return array(
                    'result' => 'failure',
                );
            }

            $order->update_status( 'pending', 'Покупатель перенаправлен на оплату.' );

            return array(
                'result'   => 'success',
                'redirect' => $this->get_return_url( $order ),
            );
        }
    }
}

Это не полный LiqPay-шлюз, а безопасная базовая структура. В реальном модуле вместо get_return_url() нужно сформировать платёжную форму или редирект по правилам платёжной системы.

4. Логирование callback от платёжной системы

Куда вставлять: в мини-плагин платёжного шлюза. Этот код помогает понять, доходит ли callback до WordPress.

add_action( 'woocommerce_api_sc_payment_callback', 'sc_payment_callback_logger' );

function sc_payment_callback_logger() {
    $raw_body = file_get_contents( 'php://input' );

    if ( function_exists( 'wc_get_logger' ) ) {
        wc_get_logger()->info(
            'Payment callback received. Body: ' . $raw_body,
            array(
                'source' => 'sc-payment-callback',
            )
        );
    }

    status_header( 200 );
    echo 'OK';
    exit;
}

Callback URL для такого endpoint будет выглядеть примерно так:

https://example.com/?wc-api=sc_payment_callback

Этот URL нужно исключить из кеша и указать в настройках платёжной системы как серверный callback URL, если ваша реализация использует wc-api.

5. Безопасная смена статуса заказа после оплаты

Куда вставлять: в обработчик callback после проверки подписи, суммы, валюты и ID заказа.

function sc_mark_order_paid_after_gateway_confirm( $order_id, $transaction_id, $gateway_name ) {
    $order = wc_get_order( $order_id );

    if ( ! $order ) {
        return false;
    }

    if ( $order->is_paid() ) {
        return true;
    }

    $order->payment_complete( $transaction_id );

    $order->add_order_note(
        'Оплата подтверждена через ' . $gateway_name . '. Transaction ID: ' . $transaction_id
    );

    return true;
}

Нельзя вызывать payment_complete() только потому, что покупатель вернулся на страницу “Спасибо за заказ”. Сначала нужно получить и проверить серверное подтверждение от LiqPay или WayForPay.

6. Проверка суммы перед сменой статуса

Куда вставлять: в callback-обработчик перед payment_complete().

function sc_is_gateway_amount_valid( $order, $paid_amount, $paid_currency ) {
    if ( ! $order instanceof WC_Order ) {
        return false;
    }

    $order_total    = (float) $order->get_total();
    $gateway_total  = (float) $paid_amount;
    $order_currency = $order->get_currency();

    if ( $order_currency !== $paid_currency ) {
        return false;
    }

    if ( abs( $order_total - $gateway_total ) > 0.01 ) {
        return false;
    }

    return true;
}

Эта проверка защищает от ситуации, когда callback пришёл по правильному заказу, но сумма или валюта не совпадает.

Результат

После правильного подключения LiqPay или WayForPay магазин должен принимать оплату без ручного изменения статусов.

Хороший результат выглядит так:

  • покупатель выбирает LiqPay или WayForPay на checkout;
  • WooCommerce создаёт заказ в статусе pending;
  • покупатель переходит на оплату или видит платёжный виджет;
  • платёжная система отправляет server callback;
  • сайт проверяет подпись, заказ, сумму и валюту;
  • WooCommerce меняет статус заказа после подтверждения;
  • в заказе сохраняется transaction ID;
  • ошибки пишутся в WooCommerce logs;
  • CRM и Telegram получают корректный статус оплаты;
  • callback не кешируется и не блокируется firewall.

Дополнительные способы

Подключение через готовый плагин

Готовый плагин подходит, если нужно быстро включить оплату и стандартная логика магазина несложная.

Перед установкой проверьте:

  • когда плагин обновлялся;
  • поддерживает ли он вашу версию WooCommerce;
  • есть ли тестовый режим;
  • есть ли лог ошибок;
  • проверяет ли он подпись callback;
  • правильно ли меняет статусы заказов;
  • не создаёт ли дубли уведомлений;
  • можно ли настроить title и description метода оплаты;
  • работает ли он с вашим кеш-плагином;
  • не ломает ли checkout на мобильном.

Подключение через кастомный модуль

Кастомный модуль нужен, если стандартного плагина недостаточно.

Например:

  • нужно отправлять разные статусы в CRM;
  • нужно создавать ТТН только после успешной оплаты;
  • нужно отправлять Telegram-уведомление после payment callback;
  • нужно поддержать частичную оплату;
  • нужно логировать все запросы и ответы;
  • нужно добавить повторную проверку статуса платежа;
  • нужно разделять способы оплаты по ролям, сумме или товарам;
  • нужно адаптировать оплату под мультиязычный сайт.

Проверка статуса платежа вручную

Для надёжной интеграции полезно иметь кнопку в заказе: “Проверить оплату”. Она отправляет запрос в платёжную систему и сверяет статус по номеру заказа или transaction ID.

Это помогает, когда:

  • callback не дошёл;
  • покупатель закрыл страницу оплаты;
  • платёж завис в промежуточном статусе;
  • менеджер видит деньги в кабинете, но заказ в WooCommerce остался pending;
  • нужно быстро восстановить правильный статус заказа.

Фоновая обработка через Action Scheduler

Если платёжная система или CRM отвечают медленно, тяжёлые операции лучше выносить в фон.

Например, после успешного callback можно:

  • сразу подтвердить оплату;
  • поставить в очередь отправку в CRM;
  • поставить в очередь Telegram-уведомление;
  • поставить в очередь создание ТТН;
  • не заставлять покупателя ждать внешние сервисы.

Частые ошибки

Считать редирект покупателя подтверждением оплаты

Страница возврата покупателя не является надёжным подтверждением. Статус заказа нужно менять после серверного callback и проверки подписи.

Не проверять подпись callback

Без проверки подписи любой внешний запрос может попытаться изменить статус заказа. Для платёжной интеграции это критическая ошибка безопасности.

Не сверять сумму и валюту

Даже при правильном order ID нужно проверить сумму и валюту. Иначе можно отметить заказ оплаченным при некорректном платеже.

Кешировать callback URL

Callback должен обрабатываться PHP-кодом, а не кешем. Если кеш возвращает HTML, платёжная система может не передать статус в WooCommerce.

Оставлять тестовый режим включённым

После тестов нужно проверить live-ключи, режим магазина, домен, callback URL и реальную оплату на небольшой сумме.

Ставить статус completed для всех заказов

Для физических товаров чаще нужен processing, потому что заказ ещё нужно собрать и отправить. completed обычно подходит для цифровых товаров или услуг, если процесс полностью завершён.

Хранить секретный ключ в frontend

Private key, secret key и другие секреты нельзя отдавать в браузер. Все подписи и callback-проверки должны выполняться на сервере.

Диагностика проблем

Платёж прошёл, но заказ остался pending

  • Проверьте callback URL в кабинете LiqPay или WayForPay.
  • Проверьте WooCommerce logs.
  • Проверьте debug.log.
  • Проверьте, не кешируется ли callback.
  • Проверьте, не блокирует ли callback Cloudflare, ModSecurity или security-плагин.
  • Проверьте, совпадает ли сумма платежа с суммой заказа.
  • Проверьте, проходит ли проверка подписи.

Покупателя не возвращает на сайт

  • Проверьте returnUrl или result_url.
  • Проверьте HTTPS.
  • Проверьте редиректы www/non-www.
  • Проверьте страницу order received.
  • Проверьте постоянные ссылки WordPress.

Callback получает ошибку 403

  • Проверьте security-плагин.
  • Проверьте Cloudflare firewall events.
  • Проверьте ModSecurity на хостинге.
  • Исключите callback endpoint из правил защиты.
  • Проверьте, не блокируются ли POST-запросы без cookies.

Callback получает ошибку 500

  • Включите WP_DEBUG_LOG.
  • Проверьте /wp-content/debug.log.
  • Проверьте PHP version.
  • Проверьте конфликт платёжного плагина с темой.
  • Проверьте fatal error в server error log.

Заказ отмечается оплаченным без оплаты

  • Проверьте, где вызывается payment_complete().
  • Проверьте, не меняет ли статус кастомный код.
  • Проверьте, не включён ли тестовый режим.
  • Проверьте, не используется ли thank you page как подтверждение оплаты.
  • Проверьте логи платёжного gateway.

Письма WooCommerce не отправляются после оплаты

  • Проверьте, меняется ли статус заказа.
  • Проверьте настройки WooCommerce Emails.
  • Проверьте SMTP.
  • Проверьте wp_mail.
  • Проверьте логи почтового плагина.

После оплаты не создаётся ТТН или не обновляется CRM

  • Проверьте, на какой статус завязана интеграция.
  • Проверьте, доходит ли callback оплаты.
  • Проверьте очередь Action Scheduler.
  • Проверьте логи CRM и доставки.
  • Проверьте, не отправляются ли данные до подтверждения оплаты.

FAQ

Что лучше подключить к WooCommerce: LiqPay или WayForPay?

Выбор зависит от условий банка, методов оплаты, комиссии, кабинета, поддержки, нужных валют, Apple Pay, Google Pay, рассрочки и удобства API. Технически оба варианта можно подключить к WooCommerce через платёжный gateway.

Можно ли подключить LiqPay или WayForPay без плагина?

Да, можно сделать свой WooCommerce payment gateway. Но нужно реализовать редирект или виджет оплаты, callback, проверку подписи, проверку суммы, смену статуса заказа и логирование ошибок.

Почему заказ не меняет статус после оплаты?

Чаще всего WooCommerce не получает или не обрабатывает callback. Причина может быть в неправильном callback URL, кеше, firewall, ошибке подписи, PHP fatal error или тестовом режиме.

Нужно ли проверять подпись платежа?

Да. Без проверки подписи нельзя доверять входящему запросу. Подпись защищает заказ от поддельного callback-запроса.

Можно ли менять заказ на completed сразу после оплаты?

Можно только если бизнес-логика это допускает. Для физических товаров обычно лучше статус processing, потому что заказ ещё нужно собрать, упаковать и отправить.

Почему оплата прошла, но письмо клиенту не пришло?

Письмо часто зависит от смены статуса заказа. Если статус не изменился после callback, письмо может не отправиться. Также нужно проверить SMTP, настройки WooCommerce Email и почтовые логи.

Можно ли отправлять Telegram после успешной оплаты?

Да. Лучше отправлять Telegram-уведомление после подтверждения оплаты через callback, а не сразу после создания заказа. Так менеджер не будет получать ложные уведомления о неоплаченных заказах.

Можно ли связать оплату с CRM?

Да. Обычно заказ создаётся в CRM при оформлении, а после callback от LiqPay или WayForPay сделка обновляется как оплаченная. Это снижает риск ручных ошибок у менеджеров.

Почему callback блокируется?

Callback может блокировать кеш-плагин, Cloudflare, ModSecurity, security-плагин, ограничение POST-запросов, неправильный SSL или редирект между www и non-www.

Нужно ли тестировать реальную оплату?

Да. Тестовый режим не всегда показывает все реальные сценарии. После настройки live-ключей стоит проверить реальную оплату на небольшой сумме, callback, статус заказа, письмо, CRM и уведомления.

Вывод

Подключение LiqPay или WayForPay к WooCommerce — это не только установка платёжной кнопки. Нормальная интеграция должна создавать заказ, отправлять покупателя на оплату, принимать серверный callback, проверять подпись, сверять сумму и валюту, менять статус заказа и записывать ошибки в лог.

Готовый плагин подходит для стандартного магазина. Кастомный модуль нужен, если оплата связана с CRM, Telegram, Новой Почтой, нестандартными статусами, частичной оплатой, подписками или сложной логикой checkout.

Самое важное правило: заказ нельзя считать оплаченным только по факту возврата покупателя на сайт. Надёжное подтверждение оплаты — это проверенный серверный ответ от LiqPay или WayForPay.

Об авторе

vkuzyomko administrator