Как сделать подтверждение платежа в WordPress через вебхуки

В современных интернет-магазинах и сервисах на WordPress особенно важно получать надежное подтверждение платежей от платежных систем. Одним из лучших способов автоматизировать этот процесс являются вебхуки — специальные HTTP-запросы, которые платежная система отправляет на ваш сайт, уведомляя о статусе транзакции. В этой статье мы подробно разберем, как реализовать подтверждение платежа через вебхуки в WordPress, чтобы исключить ошибки и повысить надежность работы с платежами.

Что такое вебхуки и зачем они нужны для подтверждения платежей в WordPress

Вебхуки (webhooks) — это механизмы обратного вызова, которые платежные системы используют для передачи данных о событии (например, успешная оплата, отмена, возврат) на URL вашего сайта. В отличие от обычного клиента, который периодически опрашивает сервер (polling), вебхуки работают по принципу push-уведомлений — как только событие происходит, вам сразу приходит уведомление.

Для WordPress это значит, что вы можете автоматически обновлять статус заказа, отправлять письма или отключать доступ к платным материалам, не дожидаясь действий пользователя на сайте.

Пример популярных платежных систем с поддержкой вебхуков: Яндекс.Касса, Robokassa, Stripe, PayPal. Многие из них предоставляют возможность настраивать URL для вебхуков.

Как настроить обработку вебхуков в WordPress: шаг за шагом

1. Создаем endpoint для приема вебхуков

Для начала нужно создать специальный URL, куда платежная система будет отправлять запросы. В WordPress это можно сделать несколькими способами, самый надежный — при помощи REST API.

Добавим обработчик в файл functions.php вашей темы или в отдельный плагин:

add_action('rest_api_init', function () {
    register_rest_route('wppay/v1', '/payment-webhook', [
        'methods' => 'POST',
        'callback' => 'wppay_handle_payment_webhook',
        'permission_callback' => '__return_true',
    ]);
});

function wppay_handle_payment_webhook(WP_REST_Request $request) {
    $data = $request->get_json_params();
    // Здесь будет логика обработки
    return new WP_REST_Response(['status' => 'success'], 200);
}

Этот код регистрирует REST API маршрут /wp-json/wppay/v1/payment-webhook, который принимает POST-запросы с данными платежа.

2. Проверка подлинности запроса

Очень важно удостовериться, что запрос действительно пришел от платежной системы, а не от злоумышленника. Обычно для этого используются секретные ключи или подписи.

Например, если платежная система передает в заголовках подпись, можно проверить ее так:

function wppay_verify_signature($request) {
    $secret = 'ваш_секретный_ключ';
    $signature = $request->get_header('X-Signature');
    $body = $request->get_body();
    $hash = hash_hmac('sha256', $body, $secret);
    return hash_equals($hash, $signature);
}

function wppay_handle_payment_webhook(WP_REST_Request $request) {
    if (!wppay_verify_signature($request)) {
        return new WP_REST_Response(['error' => 'Invalid signature'], 403);
    }
    $data = $request->get_json_params();
    // Обработка данных
    return new WP_REST_Response(['status' => 'success'], 200);
}

Если платежная система не предоставляет подписи, можно использовать IP-фильтрацию или другие методы защиты.

3. Обработка данных платежа и обновление статуса заказа

После проверки безопасности нужно распарсить данные и обновить заказ в базе данных WordPress. Предположим, что у вас есть кастомный тип записи shop_order и в метаполях хранится статус оплаты.

function wppay_handle_payment_webhook(WP_REST_Request $request) {
    if (!wppay_verify_signature($request)) {
        return new WP_REST_Response(['error' => 'Invalid signature'], 403);
    }
    $data = $request->get_json_params();
    $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 = get_post($order_id);
    if (!$order || $order->post_type !== 'shop_order') {
        return new WP_REST_Response(['error' => 'Order not found'], 404);
    }

    update_post_meta($order_id, '_payment_status', $payment_status);

    if ($payment_status === 'paid') {
        wp_update_post(['ID' => $order_id, 'post_status' => 'wc-completed']);
        // Дополнительные действия, например отправка письма
    }

    return new WP_REST_Response(['status' => 'success'], 200);
}

Такой подход позволит точно фиксировать статус оплаты и автоматически менять статус заказа.

Реальные примеры плагинов для работы с вебхуками платежей в WordPress

Для тех, кто не хочет писать обработчик самостоятельно, есть готовые решения. Некоторые из них поддерживают вебхуки и позволяют гибко настраивать логику:

  • WP Simple Pay — плагин для Stripe, поддерживает вебхуки и простую интеграцию.
  • WooCommerce — с его помощью можно подключать множество платежных шлюзов, у большинства из которых есть поддержка вебхуков.
  • Clearfy Pro — облегчает управление безопасностью и оптимизацией, включая работу с внешними запросами.

Если у вас есть особые требования, например, кастомные платежные шлюзы, можно написать собственный плагин с REST API и вебхуками по примеру, приведенному выше.

Полезные советы и рекомендации по работе с вебхуками для платежей

Обработка повторных запросов и идемпотентность

Платежные системы могут отправлять повторные уведомления, если не получили подтверждения. Чтобы не обновлять заказ несколько раз и не создавать конфликтов, используйте уникальный идентификатор транзакции и проверяйте, обработан ли он уже.

Например, можно хранить ID транзакции в метаполях заказа и пропускать повторные обработки.

Логирование запросов вебхуков

Обязательно ведите лог всех полученных запросов и ответов. Это поможет быстро выявить и устранить проблемы. В WordPress удобно использовать функцию error_log() или создавать отдельный лог-файл.

Обработка ошибок и возврат HTTP статусов

Если данные невалидны или подпись не совпадает, возвращайте корректный HTTP статус (например, 403 или 400). Это позволит платежной системе понять, что запрос не принят, и повторить попытку позже.

Заключение

Подтверждение платежа через вебхуки — ключевой элемент надежной работы с платежами в WordPress. Используя REST API, проверку подписи и аккуратную обработку данных, вы обеспечите стабильность и безопасность своего сайта. Если вы предпочитаете готовые решения, рассмотрите плагины с поддержкой вебхуков, например, WooCommerce или WP Simple Pay.

Для удобства интеграции рекомендуем изучить и использовать лучшие практики из кода выше, а также следить за документацией выбранной платежной системы.

Больше полезных материалов и плагинов для WordPress с платежными возможностями вы найдете на WPSHOP.

Как создать собственный платежный шорткод в WordPress
09.11.2025
Как добавить платежные системы в WordPress
02.11.2025
WooCommerce: использование хука woocommerce_order_status_completed для автоматизации действий после оплаты
18.05.2026
Как установить ограничения на платежи в WordPress по суммам и пользователям
11.03.2026
Как изменить платежную форму в WordPress с помощью хуков
29.12.2025