В чем проблема: отсутствие заказа в WooCommerce после оплаты во внешней системе
Если вы используете сторонние платежные системы, не интегрированные напрямую с WooCommerce, то часто возникает ситуация, когда пользователь оплачивает заказ, но в админке WooCommerce заказ не создается автоматически. Это приводит к ручной обработке, ошибкам в учете и неудобствам для магазина.
Диагностика проблемы
- Проверьте, поступают ли уведомления о платеже (webhook, IPN) от платежной системы на ваш сайт.
- Проверьте, есть ли в логах ошибок WordPress или WooCommerce записи, связанные с обработкой платежей.
- Убедитесь, что не используется штатный шлюз WooCommerce для этой платежной системы, либо он корректно настроен.
- Проверьте, существует ли пользователь и корзина, связанная с платежом — без них создать заказ невозможно.
Пошаговое решение: создание заказа через код по webhook платежной системы
Для автоматического создания заказа при получении уведомления от внешней платежной системы необходимо написать обработчик webhook, который:
- Получит данные оплаты, включая идентификатор пользователя, список товаров, суммы.
- Создаст новый заказ в WooCommerce через API.
- Отметит заказ как оплаченный и изменит статус.
Пример кода обработчика webhook
add_action('rest_api_init', function () {
register_rest_route('custom/v1', '/payment-webhook', array(
'methods' => 'POST',
'callback' => 'handle_external_payment',
'permission_callback' => '__return_true',
));
});
function handle_external_payment(WP_REST_Request $request) {
$data = $request->get_json_params();
// Пример данных: user_id, products [{id, qty}], total
if (empty($data['user_id']) || empty($data['products']) || empty($data['total'])) {
return new WP_REST_Response(array('error' => 'Incomplete data'), 400);
}
$user_id = intval($data['user_id']);
$products = $data['products'];
$total = floatval($data['total']);
// Создаем заказ
$order = wc_create_order(array('customer_id' => $user_id));
foreach ($products as $item) {
$product = wc_get_product($item['id']);
if ($product) {
$order->add_product($product, intval($item['qty']));
}
}
$order->set_total($total);
// Устанавливаем статус заказа "оплачен"
$order->update_status('processing', 'Оплата получена через внешний шлюз');
$order->save();
return new WP_REST_Response(array('success' => true, 'order_id' => $order->get_id()), 200);
}Этот код регистрирует REST API маршрут /wp-json/custom/v1/payment-webhook, который принимает POST запрос с данными платежа и создает заказ.
Как проверить, что решение работает
- Отправьте тестовый POST запрос на endpoint с корректными данными (например, через Postman или curl).
- Проверьте, что новый заказ появился в WooCommerce с правильными товарами и статусом.
- Проверьте логи ошибок WordPress - их не должно быть.
- Проверьте, что пользователь, указанный в данных, существует и заказ закреплен за ним.
Частые ошибки и их исправление
- Неправильный формат данных в webhook — убедитесь, что данные приходят в JSON и содержат все необходимые поля (
user_id,products,total). - Пользователь с указанным ID не существует — либо создайте пользователя заранее, либо расширьте код для создания гостевого заказа.
- Ошибки при добавлении товаров в заказ — проверьте, что ID товаров корректны и продукты опубликованы.
- Отсутствие прав на REST API — в примере установлен
permission_callbackв__return_trueдля тестов, в продакшене лучше добавить проверку ключа безопасности.
Практические советы для безопасности и производительности
- Добавьте проверку подписи или токена в webhook для предотвращения несанкционированных запросов.
- Кэшируйте результаты запросов к продуктам в случае большого объема.
- Логируйте все запросы webhook с ошибками для последующего анализа.
- При большом количестве заказов используйте асинхронную обработку через очереди или отложенные задачи.
Сравнение подходов для интеграции внешних платежей с WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин шлюза WooCommerce | Полная интеграция, автоматическая обработка | Требует поддержки и обновления, не всегда доступен для всех систем |
| Webhook + пользовательский код (как в статье) | Гибкость, подходит для любых систем | Требует разработки и тестирования, возможны ошибки при некорректных данных |
| Ручной импорт заказов | Простота реализации | Ручная работа, риск ошибок, задержки в учете |