Обработка оформления заказа через WC REST API

26 нояб. 2017 г., 18:18:41
Просмотры: 14.5K
Голосов: 3

При использовании основного сайта на WordPress/WooCommerce и удаленного сайта для фронтенда: возможно ли обработать форму оформления заказа через WooCommerce REST API и получить URL для редиректа на выбранный платежный шлюз?

Я пробовал создать пользовательскую AJAX-функцию, но кажется, что требуется поле nonce в отправляемой форме, что проблематично, так как фронтенд находится на другом сервере.

0
Все ответы на вопрос 1
4

Для обработки платежа за заказ WooCommerce, рабочий процесс выглядит следующим образом:

  1. Создать заказ WooCommerce
  2. Обработать платеж для этого заказа, используя один из WC_Payment_Gateways
  3. Изменить статус заказа (по умолчанию pending->processing или complete, если заказ пуст)

По моему мнению, второй шаг можно реализовать так:

  1. Использовать фронтенд-библиотеку для токенизации платежных данных, например Stripe или PayPal.
  2. Передать платежный токен в бэкенд WordPress через WP REST API
  3. Позволить WordPress и WooCommerce обработать платеж как обычно.

Вы можете создать собственную конечную точку REST API для обработки платежей на вашем сайте WooCommerce, добавив следующий код:

add_action( 'rest_api_init', 'wc_rest_payment_endpoints' );
function wc_rest_payment_endpoints() {
    /**
     * Обработка запроса метода оплаты.
     */
    register_rest_route( 'wc/v2', 'payment', array(
        'methods'  => 'POST',
        'callback' => 'wc_rest_payment_endpoint_handler',
    ) );
}
function wc_rest_payment_endpoint_handler( $request = null ) {
    $response       = array();
    $parameters     = $request->get_json_params();
    $payment_method = sanitize_text_field( $parameters['payment_method'] );
    $order_id       = sanitize_text_field( $parameters['order_id'] );
    $payment_token  = sanitize_text_field( $parameters['payment_token'] );
    $error          = new WP_Error();

    if ( $payment_method === "stripe" ) {
        $wc_gateway_stripe                = new WC_Gateway_Stripe();
        $_POST['stripe_token']            = $payment_token;
        $payment_result               = $wc_gateway_stripe->process_payment( $order_id );
        if ( $payment_result['result'] === "success" ) {
            $response['code']    = 200;
            $response['message'] = __( "Ваш платеж успешно обработан", "wc-rest-payment" );
        } else {
            return new WP_REST_Response( array("c"), 123 );
            $response['code']    = 401;
            $response['message'] = __( "Пожалуйста, введите корректные данные карты", "wc-rest-payment" );
        }
    }  else {
        $response['code'] = 405;
        $response['message'] = __( "Пожалуйста, выберите доступный метод оплаты. Поддерживаемые методы можно найти по ссылке: https://wordpress.org/plugins/wc-rest-payment/#description", "wc-rest-payment" );
    }

    return new WP_REST_Response( $response, 123 );
}

Если вы ищете простой способ сделать это, вы можете воспользоваться нашим плагином WC REST Payment.

Он поддерживает платежные шлюзы WooCommerce, включая Stripe, PayPal Express, PayPal Standard, Direct Bank Transfer, Cheque, Cash on Delivery.

24 янв. 2018 г. 23:09:54
Комментарии

спасибо за подробное руководство, но некоторое время назад я выбрал вызов process_checkout с помощью ajax. На этом сайте используется менее известный платежный шлюз, поэтому при вызове на фронтенде это всё или ничего (без токенизации). Но так как я не упомянул об этом в вопросе, помечаю этот ответ как верный.

steakoverflow steakoverflow
26 янв. 2018 г. 09:17:44

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

Spencer Bigum Spencer Bigum
8 мар. 2019 г. 01:33:29

Вы не можете, если используете WooCommerce Stripe Gateway. Я изучил их исходный код — они не возвращают ошибку. Однако, если включить журнал отладки, можно увидеть ошибку в WooCommerce → Статус → Логи

Jack Song Jack Song
8 мар. 2019 г. 02:00:55

@JackSong это отлично работает для Stripe, большое спасибо. Какую архитектуру вы бы предложили для реализации PayPal? Я нашел react-библиотеки для кнопок PayPal, которые, кажется, работают нормально. Стоит ли после успешной оплаты делать отдельный запрос к WordPress для оформления заказа с status: confirmed? Мне это кажется немного небезопасным, поэтому я спрашиваю

Timothy Dalton Timothy Dalton
6 мая 2020 г. 15:56:04