Диагностика проблемы: статус заказа не обновляется после оплаты через платёжный шлюз
Одна из частых проблем при интеграции WooCommerce с платёжными шлюзами — заказ остаётся в статусе "ожидает оплаты" или "в обработке", даже если оплата прошла успешно. Это приводит к путанице в учёте заказов и задержке их обработки.
Проверьте, что именно происходит после оплаты:
- Платёжный шлюз возвращает ли корректный callback (IPN, webhook) на ваш сайт?
- Обрабатывается ли callback WooCommerce и меняется ли статус заказа?
- Нет ли ошибок в логах WooCommerce или веб-сервера при получении уведомления от шлюза?
Как проверить логи WooCommerce
В админке WordPress перейдите в WooCommerce > Статус > Логи и выберите логи, связанные с вашим платёжным шлюзом (например, название файла содержит payment или gateway). В логах ищите ошибки и подтверждения получения уведомлений.
Проверка callback от платёжного шлюза
Используйте инструменты типа RequestBin или ngrok для локального тестирования, чтобы убедиться, что платёжный шлюз отправляет уведомление на правильный URL.
Пошаговое решение: автоматизация обновления статуса заказа
Если платёжный шлюз корректно отправляет уведомления, но статус не меняется, можно вручную обрабатывать callback и обновлять статус заказа. Ниже пример кода для хука, который обновляет статус заказа при успешной оплате:
add_action('woocommerce_api_custom_gateway', 'custom_gateway_process_payment');
function custom_gateway_process_payment() {
// Получаем ID заказа из callback
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
if (!$order_id) {
status_header(400);
exit('Order ID missing');
}
$order = wc_get_order($order_id);
if (!$order) {
status_header(404);
exit('Order not found');
}
// Проверяем параметры оплаты и статус
$payment_status = isset($_GET['payment_status']) ? sanitize_text_field($_GET['payment_status']) : '';
if ($payment_status === 'success') {
// Обновляем статус заказа на "завершён"
$order->update_status('completed', 'Оплата подтверждена автоматически через callback платёжного шлюза.');
echo 'OK';
} else {
$order->update_status('failed', 'Оплата не прошла.');
echo 'Payment failed';
}
exit;
}Обратите внимание, что адрес для callback будет выглядеть так: https://ваш-сайт.ru/wc-api/custom_gateway?order_id=123&payment_status=success. В реальной интеграции параметры и проверка подписи (хешей) должны быть более надёжными.
Добавление проверки подписи безопасности
Чтобы избежать подделки запросов, добавьте проверку подписи, которую шлюз должен передавать:
function verify_gateway_signature($params, $signature) {
$secret_key = 'ваш-секретный-ключ';
ksort($params);
$data_string = http_build_query($params);
$hash = hash_hmac('sha256', $data_string, $secret_key);
return hash_equals($hash, $signature);
}Вызовите эту функцию перед обработкой статуса заказа.
Проверка результата после внедрения
- Совершите тестовую оплату через платёжный шлюз с тестовым заказом.
- Проверьте, что статус заказа сменился на
completedили другой нужный статус. - Просмотрите логи ошибок и убедитесь, что callback успешно обработан без ошибок.
- Проверьте, что в истории заказа добавлено примечание о смене статуса.
Частые ошибки и их исправление
- Неправильный URL callback: Проверьте настройки платёжного шлюза, URL должен совпадать с
https://ваш-сайт.ru/wc-api/название_шлюза. - Отсутствие проверки подписи: Без проверки подписи статус могут менять посторонние лица — добавьте проверку.
- Ошибки в обработчике callback: Используйте функции
wc_get_order()для загрузки заказа и методыupdate_status(), избегайте прямого SQL-запроса. - Проблемы с правами доступа: Убедитесь, что файл
wp-config.phpи папки имеют корректные права, чтобы callback мог выполняться. - Кэширование URL callback: Настройте исключение этих URL из кэширования на уровне плагинов или сервера.
Практические советы по безопасности и производительности
- Используйте SSL (HTTPS) для callback URL, чтобы обеспечить шифрование данных.
- Добавьте логирование всех callback-запросов с результатами обработки для аудита и отладки.
- Ограничьте доступ к URL callback по IP, если платёжный шлюз предоставляет список серверов.
- При большом количестве заказов настройте очереди или асинхронную обработку callback, чтобы не перегружать сайт.
Сравнение методов автоматического обновления статуса заказа
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Стандартный webhook платёжного шлюза | Нативная поддержка, безопасность, надёжность | Зависит от правильной настройки шлюза | Самый оптимальный способ |
| Обработка callback через wc-api endpoint | Гибкость, возможность кастомизации | Требуется ручное программирование и проверка безопасности | Использовать при отсутствии готового решения |
| Периодический опрос статусов заказов (cron) | Простота реализации, независимость от callback | Задержка в обновлении, нагрузка на сервер | Резервный вариант при проблемах с webhook |