WooCommerce REST API: реализация OTP-подтверждения для обновления статуса заказа

Что такое OTP-подтверждение и зачем оно нужно при обновлении заказа через REST API

OTP (One-Time Password) — это одноразовый пароль, который позволяет повысить безопасность операций. В контексте WooCommerce REST API добавление OTP при обновлении статуса заказа защищает от несанкционированного изменения, например, при интеграции с внешними сервисами или автоматизации.

Диагностика: почему стандартная авторизация WooCommerce REST API может быть недостаточной

WooCommerce REST API использует OAuth 1.0a или базовую авторизацию с ключами Consumer Key/Secret. Однако при критичных операциях (изменение статуса заказа) одного авторизационного токена может быть мало. Если вы замечаете неожиданные изменения, подозрительную активность или хотите внедрить дополнительный уровень защиты — OTP поможет.

Пошаговое решение: как реализовать OTP-подтверждение для обновления статуса заказа через REST API

1. Создаем механизм генерации и хранения OTP для заказов

Добавим метаполе заказа для хранения OTP и функцию генерации кода.

function generate_order_otp( $order_id ) {
    $otp = wp_rand(100000, 999999); // 6-значный код
    update_post_meta( $order_id, '_order_otp', $otp );
    return $otp;
}

2. Отправка OTP клиенту

Реализуйте отправку OTP на email или SMS клиента. Для примера — отправка по email:

function send_order_otp_email( $order_id, $otp ) {
    $order = wc_get_order( $order_id );
    $to = $order->get_billing_email();
    $subject = 'Ваш код подтверждения для заказа #' . $order_id;
    $message = 'Используйте следующий код, чтобы подтвердить изменение статуса заказа: ' . $otp;
    wp_mail( $to, $subject, $message );
}

3. Добавление проверки OTP в REST API при обновлении статуса

Регистрируем кастомный endpoint или фильтруем существующий, чтобы при обновлении статуса требовался OTP из запроса.

add_action('rest_pre_dispatch', function( $response, $server, $request ) {
    if ( $request->get_method() === 'PUT' && preg_match('#/wp-json/wc/v3/orders/(\d+)#', $request->get_url_params()['route'] ?? '') ) {
        $order_id = intval($request->get_param('id'));
        $provided_otp = $request->get_param('otp');
        $saved_otp = get_post_meta($order_id, '_order_otp', true);

        if ( ! $provided_otp || $provided_otp !== $saved_otp ) {
            return new WP_Error( 'rest_forbidden', 'OTP неверен или отсутствует', array( 'status' => 403 ) );
        }
        // После успешной проверки удаляем OTP
        delete_post_meta( $order_id, '_order_otp' );
    }
    return $response;
}, 10, 3);

4. Клиентская логика: получение и передача OTP

Последовательность действий для клиента:

  • Запросить генерацию OTP (например, через кастомный endpoint или вручную).
  • Получить код из email/SMS.
  • Отправить PUT-запрос на обновление заказа с параметром otp.

Проверка результата после внедрения

Чтобы убедиться, что OTP работает:

  • Попробуйте обновить статус заказа через REST API без параметра otp — должен вернуться ответ 403 с ошибкой.
  • Сгенерируйте OTP и передайте его с запросом — обновление пройдет успешно.
  • Повторный запрос с тем же OTP должен быть запрещен (OTP удален после использования).

Частые ошибки и их исправление

  • OTP не генерируется или не сохраняется: Проверьте права записи метаполей и корректность ID заказа.
  • Отправка email не работает: Убедитесь, что настроена почтовая функция WordPress (wp_mail), иначе используйте SMTP-плагины.
  • OTP не передается в запросе: Проверьте, что клиент добавляет параметр otp в тело PUT-запроса.
  • Ошибка 403 без понятной причины: Проверьте логи REST API, возможно, условие проверки OTP срабатывает некорректно.

Практические советы по безопасности и производительности

  • Храните OTP в зашифрованном виде или с ограничением по времени жизни (например, удалять через 5 минут).
  • Ограничьте частоту запросов на генерацию OTP, чтобы предотвратить спам и атаки.
  • Используйте HTTPS для всех REST API запросов.
  • Добавьте логирование успешных и неуспешных попыток обновления с OTP для аудита.

Сравнение вариантов реализации OTP-подтверждения в WooCommerce REST API

ВариантПлюсыМинусыСложность реализации
Кастомный мета-поле и проверка в фильтре rest_pre_dispatchПолный контроль, гибкостьНеобходима ручная реализация отправки OTP и логикиСредняя
Использование плагинов сторонних OTP/SMSБыстрая интеграция, готовые сервисыМеньше контроля, возможные затратыНизкая
Интеграция с внешними сервисами авторизацииВысокая безопасностьСложность, зависит от сервисаВысокая

Шаблоны для WP Плагины для WP