Проблема: необходимость автоматического обновления заказа после callback платёжной системы
При интеграции платёжных систем с WooCommerce часто возникает задача — автоматически обновлять статус заказа после получения callback (уведомления о платеже). Без правильной настройки обновление статуса приходится делать вручную, что замедляет обработку заказов и увеличивает риск ошибок.
Диагностика проблемы
Проверьте, что callback от платёжной системы успешно доходит до вашего сайта и возвращает корректный HTTP статус (200 OK). Убедитесь, что WooCommerce не обновляет статус заказа автоматически после callback, либо обновляет неправильно.
Для диагностики используйте:
- Логи сервера (error_log, access_log)
- Плагины для логирования REST API запросов и ответов
- Инструменты отладки платёжной системы (например, sandbox режим)
Пошаговое решение: автоматизация обновления статуса заказа через REST API
1. Настройка endpoint для callback платёжной системы
Создайте кастомный endpoint в WordPress, который будет принимать callback:
add_action('rest_api_init', function () {
register_rest_route('custom/v1', '/payment-callback', [
'methods' => 'POST',
'callback' => 'handle_payment_callback',
'permission_callback' => '__return_true',
]);
});
function handle_payment_callback(WP_REST_Request $request) {
$data = $request->get_json_params();
// Здесь должна быть ваша валидация данных callback
$order_id = intval($data['order_id'] ?? 0);
$payment_status = sanitize_text_field($data['status'] ?? '');
if (!$order_id || !$payment_status) {
return new WP_REST_Response(['error' => 'Invalid data'], 400);
}
$order = wc_get_order($order_id);
if (!$order) {
return new WP_REST_Response(['error' => 'Order not found'], 404);
}
// Обновляем статус заказа на основании статуса платежа
if ($payment_status === 'success') {
$order->update_status('processing', 'Оплата подтверждена через callback');
} elseif ($payment_status === 'failed') {
$order->update_status('failed', 'Оплата не прошла');
}
return new WP_REST_Response(['success' => true], 200);
}2. Установка авторизации для безопасности callback
Чтобы callback не мог вызвать любой посторонний, добавьте проверку секретного ключа в заголовке:
function handle_payment_callback(WP_REST_Request $request) {
$secret = $request->get_header('X-Secret-Key');
if ($secret !== 'ваш_секретный_ключ') {
return new WP_REST_Response(['error' => 'Unauthorized'], 401);
}
// остальной код обработки
}3. Обработка ошибок и логирование
Добавьте логирование для отладки и мониторинга:
function handle_payment_callback(WP_REST_Request $request) {
// ... проверка секретного ключа
try {
// обработка
return new WP_REST_Response(['success' => true], 200);
} catch (Exception $e) {
error_log('Payment callback error: ' . $e->getMessage());
return new WP_REST_Response(['error' => 'Internal error'], 500);
}
}Проверка результата после внедрения
- Отправьте тестовый POST-запрос на ваш endpoint с правильным payload и секретным ключом.
- Проверьте, что статус заказа в админке WooCommerce обновился в соответствии с данными callback.
- Убедитесь, что ответ сервера содержит статус 200 и success: true.
- Проверьте логи на отсутствие ошибок.
Частые ошибки и как их исправить
- Ошибка 401 Unauthorized: Неправильный или отсутствующий секретный ключ в заголовках. Проверьте заголовок X-Secret-Key и совпадение с ключом на сервере.
- Заказы не обновляются: Проверьте, что
order_idкорректно передаётся и что заказ существует. Используйтеwc_get_order()для проверки наличия заказа. - Callback не доходит или возвращает ошибку 404: Проверьте правильность URL REST API endpoint и что он зарегистрирован.
- Ошибка 500 Internal Server Error: Проверьте логи ошибки PHP, возможно, где-то ошибка в коде обработки.
Практические советы по безопасности и производительности
- Используйте HTTPS для всех callback URL, чтобы исключить перехват данных.
- Ограничьте доступ к endpoint по IP-адресам платёжной системы, если это возможно.
- Добавьте rate limiting (ограничение количества запросов) для защиты от DDoS-атак.
- Кэшировать данные заказов не нужно, обновление должно происходить в реальном времени.
Сравнение вариантов реализации обновления статуса заказа
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Webhook платёжной системы + кастомный REST API endpoint | Гибкость, контроль, безопасность через проверку ключей | Нужно писать и поддерживать код, требует тестирования |
| Плагины для интеграции платёжных систем (например, WooCommerce Payment Gateways) | Быстрое подключение, поддержка обновлений | Могут не поддерживать все платёжные системы, ограниченная кастомизация |
| Обработка callback напрямую через PHP-скрипт (без REST API) | Простота реализации | Меньше стандартизации, сложнее масштабировать и интегрировать |