Диагностика проблемы: заказ не меняет статус после успешного платежа
В WooCommerce стандартная логика изменения статуса заказа зависит от используемого платежного шлюза. Иногда бывает, что после успешной оплаты заказ остается в статусе "Ожидает оплату" или "Обработка", что мешает дальнейшей обработке и уведомлению клиента. Это особенно критично, если платежный шлюз не отправляет корректный webhook или callback, либо интеграция реализована нестандартно.
Для диагностики проблемы проверьте:
- Настройки платежного шлюза в WooCommerce — установлен ли корректный статус по умолчанию после успешного платежа;
- Наличие webhook или callback URL, который платежный шлюз должен вызвать;
- Логи WooCommerce и сервера на предмет ошибок при обновлении статуса;
- Статус заказа в админке WooCommerce сразу после оплаты;
- Конфликты с плагинами, которые могут блокировать смену статуса.
Пошаговое решение: программное автоматическое изменение статуса
Если платежный шлюз не меняет статус автоматически, можно добавить кастомный хук, который проверяет успешную оплату и обновляет статус заказа. Ниже пример кода, который можно добавить в functions.php темы или в кастомный плагин:
add_action('woocommerce_payment_complete', 'custom_update_order_status_after_payment');
function custom_update_order_status_after_payment($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
// Проверяем, что заказ существует и статус еще не 'completed'
if ($order && $order->get_status() !== 'completed') {
// Устанавливаем статус 'completed'
$order->update_status('completed', 'Статус изменен автоматически после успешного платежа');
}
}Это сработает для большинства шлюзов, которые срабатывают на хук woocommerce_payment_complete. Если платежный шлюз не вызывает этот хук, понадобится обрабатывать webhook вручную.
Обработка webhook платежного шлюза
Для шлюзов, которые отправляют webhook, нужно создать endpoint в WordPress и на него подписаться в настройках шлюза.
add_action('rest_api_init', function () {
register_rest_route('custom/v1', '/payment-webhook', array(
'methods' => 'POST',
'callback' => 'handle_payment_webhook',
'permission_callback' => '__return_true',
));
});
function handle_payment_webhook(WP_REST_Request $request) {
$data = $request->get_json_params();
// Проверяем данные и статус платежа
if (isset($data['order_id']) && isset($data['payment_status']) && $data['payment_status'] === 'success') {
$order = wc_get_order($data['order_id']);
if ($order && $order->get_status() !== 'completed') {
$order->update_status('completed', 'Статус изменен через webhook платежного шлюза');
return new WP_REST_Response('Статус обновлен', 200);
}
}
return new WP_REST_Response('Ошибка данных', 400);
}Проверка результата после внедрения
Чтобы проверить, что автоматическое изменение статуса работает:
- Создайте тестовый заказ в WooCommerce с выбранным платежным методом;
- Проведите оплату (в тестовом режиме или реальном, в зависимости от настроек);
- Зайдите в админку WooCommerce и проверьте, что статус заказа изменился на
completedили нужный вам статус; - Если настроен webhook — проверьте логи сервера и ответ вашего endpoint;
- Проверьте, что уведомления клиенту и администратору отправляются корректно (если настроены).
Частые ошибки и как исправить
- Хук
woocommerce_payment_completeне срабатывает: используемый платежный шлюз не вызывает стандартные хуки WooCommerce. В этом случае реализуйте обработку webhook вручную, как показано выше. - Статус заказа не меняется: проверьте права пользователя, под которыми выполняется скрипт, и ошибки в логах PHP. Иногда другие плагины могут перекрывать обновление статуса.
- Webhook не доходит или возвращает ошибку 403: проверьте настройки .htaccess, файрволлы и разрешения REST API в WordPress.
- Статус меняется, но уведомления не отправляются: убедитесь, что в настройках WooCommerce включены email-уведомления на нужные статусы.
Практические советы по безопасности и производительности
- В webhook-обработчике проверяйте подпись или токен, который присылает платежный шлюз, чтобы исключить подделку запроса.
- Не используйте тяжелую логику в хуках, чтобы не блокировать выполнение основных процессов.
- Кэшируйте часто используемые данные, если планируете сложные проверки в webhook.
- Регулярно проверяйте логи, чтобы отслеживать сбои и исключения.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_payment_complete | Простота внедрения, стандартный механизм WooCommerce | Работает не со всеми шлюзами | Если платежный шлюз поддерживает стандартные хуки WooCommerce |
| Обработка webhook вручную через REST API | Гибкость, поддержка любых шлюзов | Требует дополнительной настройки и проверки безопасности | Если шлюз не вызывает стандартные хуки, есть webhook |
| Использование сторонних плагинов для интеграции | Минимум кода, готовые решения | Может быть избыточно, нагрузка, зависимость от обновлений | Для популярных платежных систем с готовыми плагинами |