Краткий ответ: подключить LiqPay или WayForPay к WooCommerce можно через готовый платёжный плагин или через свой модуль оплаты. Правильное подключение должно не просто перенаправлять покупателя на оплату, а создавать заказ, передавать сумму, номер заказа, валюту, получать callback от платёжной системы, проверять подпись, менять статус заказа и писать ошибки в лог WooCommerce.
WooCommerce из коробки не содержит встроенной оплаты LiqPay или WayForPay. Эти платёжные системы подключаются как отдельные payment gateway модули.
На практике проблема не в том, чтобы показать кнопку оплаты. Основные ошибки появляются после оплаты:
pending;processing, хотя оплата не прошла;Для магазина важно, чтобы 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 не оформляет заказ.
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Есть два основных варианта: готовый плагин или кастомный payment gateway.
| Вариант | Когда подходит | Минусы |
|---|---|---|
| Готовый плагин | Нужно быстро включить оплату без разработки | Не всегда есть логи, гибкие статусы и нормальная обработка ошибок |
| Кастомный модуль оплаты | Нужны точные статусы, callback, CRM, Telegram, нестандартная логика | Требует разработки и тестирования |
| Доработка существующего плагина | Плагин почти подходит, но не хватает деталей | Нужно аккуратно не сломать обновления |
Если магазин простой, можно начать с готового плагина. Если есть CRM, Telegram, Новая Почта, нестандартные статусы, предоплата, частичная оплата или подписки, лучше делать отдельную доработку WooCommerce.
Для LiqPay обычно нужны:
public_key;private_key;Для WayForPay обычно нужны:
merchantAccount;merchantSecretKey;merchantDomainName;returnUrl;serviceUrl.Секретные ключи нельзя вставлять в HTML, JavaScript, data-атрибуты, публичные файлы темы или открытый репозиторий. Их нужно хранить на сервере: в настройках плагина с закрытым доступом или в wp-config.php.
Оплата должна менять статус заказа только после подтверждения от платёжной системы.
| Событие | Статус WooCommerce | Комментарий |
|---|---|---|
| Заказ создан, оплаты ещё нет | pending |
Покупатель только перешёл к оплате |
| Платёж успешный | processing или completed |
Для физических товаров чаще processing |
| Платёж отклонён | failed |
Можно добавить note с причиной |
| Покупатель закрыл оплату | pending |
Не нужно автоматически считать заказ отменённым сразу |
| Возврат платежа | refunded |
Зависит от логики магазина |
| Ошибка callback | Не менять статус | Сначала проверить подпись и сумму |
Ошибка в статусах может сломать весь процесс: менеджер увидит заказ как оплаченный, CRM получит неверный этап, Telegram отправит неправильное уведомление, а склад начнёт собирать неоплаченный заказ.
Callback URL платёжной системы нельзя кешировать.
Из кеша нужно исключить:
wc-api endpoint, если он используется;Если callback попадает в кеш, платёжная система может получить красивую HTML-страницу вместо технической обработки. В итоге деньги списаны, но WooCommerce не меняет статус заказа.
Если магазин передаёт заказы в CRM, важно решить, когда именно отправлять данные: при создании заказа или после успешной оплаты.
Для интернет-магазинов часто работает такая схема:
Если оплата, CRM и доставка работают вместе, полезно заранее продумать общую логику. Для этого подойдут материалы Интеграция WooCommerce с CRM и Интеграция WooCommerce с Новой Почтой.
Важно: код ниже — технический пример структуры платёжной интеграции. Он может повлиять на оплату, статусы заказов, checkout и безопасность магазина. Не используйте его без тестов на копии сайта. Для рабочего проекта нужно сверить параметры и алгоритм подписи с актуальной документацией LiqPay или WayForPay.
Куда вставлять: файл 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' );
Куда вставлять: в отдельный мини-плагин или в класс вашего платёжного шлюза 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;
}
Такая проверка нужна, чтобы не отправлять в платёжную систему пустые, битые или неподдерживаемые заказы.
Куда вставлять: в отдельный плагин. Для платёжных шлюзов не стоит использовать 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() нужно сформировать платёжную форму или редирект по правилам платёжной системы.
Куда вставлять: в мини-плагин платёжного шлюза. Этот код помогает понять, доходит ли 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.
Куда вставлять: в обработчик 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.
Куда вставлять: в 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 магазин должен принимать оплату без ручного изменения статусов.
Хороший результат выглядит так:
pending;Готовый плагин подходит, если нужно быстро включить оплату и стандартная логика магазина несложная.
Перед установкой проверьте:
Кастомный модуль нужен, если стандартного плагина недостаточно.
Например:
Для надёжной интеграции полезно иметь кнопку в заказе: “Проверить оплату”. Она отправляет запрос в платёжную систему и сверяет статус по номеру заказа или transaction ID.
Это помогает, когда:
Если платёжная система или CRM отвечают медленно, тяжёлые операции лучше выносить в фон.
Например, после успешного callback можно:
Страница возврата покупателя не является надёжным подтверждением. Статус заказа нужно менять после серверного callback и проверки подписи.
Без проверки подписи любой внешний запрос может попытаться изменить статус заказа. Для платёжной интеграции это критическая ошибка безопасности.
Даже при правильном order ID нужно проверить сумму и валюту. Иначе можно отметить заказ оплаченным при некорректном платеже.
Callback должен обрабатываться PHP-кодом, а не кешем. Если кеш возвращает HTML, платёжная система может не передать статус в WooCommerce.
После тестов нужно проверить live-ключи, режим магазина, домен, callback URL и реальную оплату на небольшой сумме.
Для физических товаров чаще нужен processing, потому что заказ ещё нужно собрать и отправить. completed обычно подходит для цифровых товаров или услуг, если процесс полностью завершён.
Private key, secret key и другие секреты нельзя отдавать в браузер. Все подписи и callback-проверки должны выполняться на сервере.
debug.log.returnUrl или result_url.WP_DEBUG_LOG./wp-content/debug.log.payment_complete().wp_mail.Выбор зависит от условий банка, методов оплаты, комиссии, кабинета, поддержки, нужных валют, Apple Pay, Google Pay, рассрочки и удобства API. Технически оба варианта можно подключить к WooCommerce через платёжный gateway.
Да, можно сделать свой WooCommerce payment gateway. Но нужно реализовать редирект или виджет оплаты, callback, проверку подписи, проверку суммы, смену статуса заказа и логирование ошибок.
Чаще всего WooCommerce не получает или не обрабатывает callback. Причина может быть в неправильном callback URL, кеше, firewall, ошибке подписи, PHP fatal error или тестовом режиме.
Да. Без проверки подписи нельзя доверять входящему запросу. Подпись защищает заказ от поддельного callback-запроса.
Можно только если бизнес-логика это допускает. Для физических товаров обычно лучше статус processing, потому что заказ ещё нужно собрать, упаковать и отправить.
Письмо часто зависит от смены статуса заказа. Если статус не изменился после callback, письмо может не отправиться. Также нужно проверить SMTP, настройки WooCommerce Email и почтовые логи.
Да. Лучше отправлять Telegram-уведомление после подтверждения оплаты через callback, а не сразу после создания заказа. Так менеджер не будет получать ложные уведомления о неоплаченных заказах.
Да. Обычно заказ создаётся в CRM при оформлении, а после callback от LiqPay или WayForPay сделка обновляется как оплаченная. Это снижает риск ручных ошибок у менеджеров.
Callback может блокировать кеш-плагин, Cloudflare, ModSecurity, security-плагин, ограничение POST-запросов, неправильный SSL или редирект между www и non-www.
Да. Тестовый режим не всегда показывает все реальные сценарии. После настройки live-ключей стоит проверить реальную оплату на небольшой сумме, callback, статус заказа, письмо, CRM и уведомления.
Подключение LiqPay или WayForPay к WooCommerce — это не только установка платёжной кнопки. Нормальная интеграция должна создавать заказ, отправлять покупателя на оплату, принимать серверный callback, проверять подпись, сверять сумму и валюту, менять статус заказа и записывать ошибки в лог.
Готовый плагин подходит для стандартного магазина. Кастомный модуль нужен, если оплата связана с CRM, Telegram, Новой Почтой, нестандартными статусами, частичной оплатой, подписками или сложной логикой checkout.
Самое важное правило: заказ нельзя считать оплаченным только по факту возврата покупателя на сайт. Надёжное подтверждение оплаты — это проверенный серверный ответ от LiqPay или WayForPay.
Об авторе