Как сохранить один ответ API в метаданных заказа WooCommerce

Вопрос или проблема

Имеется одно пользовательское поле оформления заказа типа email, которое проверяет, существует ли email на удаленном сервере или нет. Я отправил JSON данные на удаленный сервер с этим полем.

Если email существует, JSON ответ обычно такой:

{
    "success": "ok",
    "responseCode": "200",
    "token": "I0b6uSNelqwGv+sCHpTV6LYI08hxcwoBIMVHh5mKVx+fkRFscUKbvUBF8+rl0vACgMImcffCzLsf571KLQVkSYcvdUfdwsu8mrBQ8mBw5J1LZtFs/7PwXerjNS2HjBAB0tc+RqZhYJ9Ne1efn7fq7Df4kAQ+QO7CjBKUwp8k7pFYslLMcWuxfb+KKsotZP82gkk5oKZEeh30a6K2I7dAxRj+B3RqyqND/uRO1uqQ1IA="
}

Где значение “token” меняется при каждом запросе.

Я хочу сохранить токен как метаданные внутри заказа, после того как проверю, что код ответа = 200.

Использование $order->update_meta_data( 'received_token_key', $token ); не работает само по себе, я знаю, что у меня есть одна большая ошибка, но я не могу её найти.

Может быть, стоит использовать другой хук WooCommerce?
Может быть, использовать wc_session?
Может быть, сохранить в другое место и позже вызвать?

Мне нужно, чтобы перед оформлением заказа email из пользовательского поля был проверен, если нет, wc_add_notice($response_message, 'error'); будет вызвано.

         // начинаем здесь
   add_action( 'woocommerce_checkout_process', 'custom_checkout_field_process_valid' );

   function custom_checkout_field_process_valid($order_id) {

        $url="https://remoteserver.com/api/checking-email-registered-user.json";
        $body = array("email"=>($_POST['email_pasajero']),); //из пользовательского поля
        $response2 = wp_remote_post( $url, 
            array(
                'headers'   => array('Content-Type' => 'application/json; charset=utf-8'),
                'method'    => 'POST',
                'timeout' => 75,                    
                'body'      => json_encode($body),));

         // проверяем и используем ответ
$response_code       = wp_remote_retrieve_response_code( $response2 );
$response_message = wp_remote_retrieve_response_message( $response2 );
$bodyarray = json_decode( wp_remote_retrieve_body( $response2 ));
$token = $bodyarray["token"]; 

    if ($response_code == 200)  {
        // Я хочу сохранить $token или его значение, на этом шаге, как метаданные для дальнейшего использования
       // может быть, прямо из ответа?
        // $order->update_meta_data( 'token_received_key', $token ); не работает
    }

            else {
         wc_add_notice($response_message, 'error');
                return $response_code ;
        }
}

Вы очень близки.

$order->update_meta_data() будет обновлять мета-значение внутри объекта $order, но не будет сохранять изменения в базе данных. Чтобы сохранить изменения в объекте WooCommerce CRUD, вам нужно вызвать метод save():

if ( $response_code == 200 )  {
    $order->update_meta_data( 'token_received_key', $token );
    $order->save();
}

Ответ или решение

Как сохранить один ответ API в метаданных заказа WooCommerce

В рамках разработки электронной коммерции и интеграции сторонних сервисов для WooCommerce, возникает необходимость сохранить определённые данные, полученные от удалённых серверов, в метаданных заказов. В вашем случае, требуется сохранить токен, получаемый в ответе на запрос валидации email, в метаданные заказа, если код ответа равен 200.

Процесс реализации

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

  1. Проверка кода ответа: Во время обработки валидации email, вам необходимо отправить запрос на удалённый сервер и проверить код ответа.

  2. Получение токена: Если код ответа равен 200, проверьте, что токен был успешно получен.

  3. Сохранение токена в метаданные заказа: Чтобы сохранить полученный токен в метаданные заказа, воспользуйтесь методом update_meta_data объекта заказа, а затем вызовите метод save, чтобы обновить данные в базе.

Пример кода

Давайте рассмотрим ваш код с необходимыми доработками для успешного выполнения поставленной задачи:

add_action('woocommerce_checkout_process', 'custom_checkout_field_process_valid');

function custom_checkout_field_process_valid($order_id) {
    // Убедитесь в том, что заказы могут быть обработаны, если у вас включена функция обработки заказа.
    if (isset($_POST['email_pasajero'])) {
        $url = "https://remoteserver.com/api/checking-email-registered-user.json";
        $body = array("email" => sanitize_email($_POST['email_pasajero']));

        // Отправка запроса
        $response2 = wp_remote_post($url, array(
            'headers' => array('Content-Type' => 'application/json; charset=utf-8'),
            'method' => 'POST',
            'timeout' => 75,
            'body' => json_encode($body),
        ));

        // Обработка ответа
        $response_code = wp_remote_retrieve_response_code($response2);
        $response_message = wp_remote_retrieve_response_message($response2);
        $bodyarray = json_decode(wp_remote_retrieve_body($response2), true);

        if ($response_code == 200 && !empty($bodyarray["token"])) {
            $token = $bodyarray["token"];

            // Получаем объект заказа для обновления метаданных
            $order = wc_get_order($order_id);
            $order->update_meta_data('token_received_key', $token);
            $order->save(); // Сохраняем изменения в базе данных
        } else {
            // Если код ответа не 200, выводим сообщение об ошибке
            wc_add_notice($response_message, 'error');
            return;
        }
    }
}

Объяснение кода

  • Проверка наличия email: Перед тем как выполнить запрос, убедитесь, что поле email действительно заполнено.
  • Отправка запроса: Используется wp_remote_post для отправки POST-запроса на указанный URL с email в теле запроса.
  • Обработка ответа: Код проверяет, равен ли код ответа 200 и не пуст ли токен в ответе. Если токен получен и код ответа положительный, он сохраняется в метаданных заказа.
  • Сохранение изменений: save() метод применен к объекту заказа для обеспечения сохранения изменений в базе данных WooCommerce.

Заключение

Таким образом, при корректной реализации вышеописанного кода, вы сможете успешно сохранить токен из API-ответа в метаданные заказа WooCommerce. Это решение не только обеспечит сохранность необходимой информации, но и повысит уровень взаимодействия вашего сайта с внешними сервисами. Оптимизированный процесс проверки email и сохранения токена гарантирует, что только корректные данные попадут в систему, способствуя улучшению пользовательского опыта.

Используйте этот подход для интеграции сторонних API в ваши WooCommerce-проекты, и вы значительно улучшите функционал вашего интернет-магазина.

Оцените материал
Добавить комментарий

Капча загружается...