Задать вопрос
@zutov

Не изменяется статус платежа в Woocommerce, в чём может быть проблема?

Сделал плагин кастомной оплаты заказа, способ - редирект.
Вот код:
<?php
/*
Plugin Name: ***** Pay Gateway
Description: Custom Payment Gateway for ***** Pay
Author: Zutov
Version: 1.0
*/

add_filter('woocommerce_payment_gateways', '*****_pay_add_gateway_class');
function ****_pay_add_gateway_class($gateways) {
    $gateways[] = 'WC_****_Pay_Gateway';
    return $gateways;
}

add_action('plugins_loaded', '*****_pay_init_gateway_class');
function *****_pay_init_gateway_class() {
    class WC_*****_Pay_Gateway extends WC_Payment_Gateway {
        public function __construct() {
            $this->id = '*****_pay';
            $this->method_title = '***** Pay';
            $this->method_description = 'Custom Payment Gateway for ***** Pay';

            $this->init_form_fields();
            $this->init_settings();

            $this->title = $this->get_option('title');
            $this->description = $this->get_option('description');
            $this->enabled = $this->get_option('enabled');
            $this->testmode = $this->get_option('testmode') === 'yes' ? true : false;

            add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
        }

        public function init_form_fields(){
            $this->form_fields = array(
                'enabled' => array(
                    'title' => 'Включить/Выключить',
                    'type' => 'checkbox',
                    'label' => 'Включить ***** Pay Gateway',
                    'default' => 'no'
                ),
                'title' => array(
                    'title' => 'Название',
                    'type' => 'text',
                    'description' => 'Название метода оплаты, которое видит пользователь при оформлении заказа.',
                    'default' => '***** Pay',
                    'desc_tip' => true,
                ),
                'description' => array(
                    'title' => 'Описание',
                    'type' => 'textarea',
                    'description' => 'Описание метода оплаты, которое видит пользователь при оформлении заказа.',
                    'default' => 'Оплата с помощью ***** Pay.',
                ),
                'testmode' => array(
                    'title' => 'Тестовый режим',
                    'type' => 'checkbox',
                    'label' => 'Включить тестовый режим',
                    'default' => 'yes',
                    'description' => 'В этом режиме платежи будут симулироваться, как если бы они проходили через платёжный шлюз ***** Pay.',
                ),
                'api_key' => array(
                    'title' => 'API ключ',
                    'type' => 'text',
                    'description' => 'Ваш API ключ от ***** Pay.',
                ),
            );
        }

        public function process_payment($order_id) {
            $order = wc_get_order($order_id);
            $total = $order->get_total();
            $currency = get_woocommerce_currency();
            $return_url = $this->get_return_url($order);
            $callback_url = 'https://*******tech.com/*****_pay_callback';

            $curl = curl_init();
            curl_setopt_array($curl, array(
              CURLOPT_URL => 'https://***********/payment-invoices',
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_ENCODING => '',
              CURLOPT_MAXREDIRS => 10,
              CURLOPT_TIMEOUT => 0,
              CURLOPT_FOLLOWLOCATION => true,
              CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
              CURLOPT_CUSTOMREQUEST => 'POST',
              CURLOPT_POSTFIELDS =>'{
                "data": {
                "type": "payment-invoices",
                "attributes": {
                    "reference_id": "'. $order_id .'",
                    "description": "Payment by order#'. $order_id .'",
                    "currency": "'. $currency .'",
                    "amount": '. $total .',
                    "service": "payment_card_eur_hpp",
                    "return_url": "'. $return_url .'",
                    "callback_url": "'. $callback_url .'",
                    "test_mode": true
                    }
                }
            }',
              CURLOPT_HTTPHEADER => array(
                'Authorization: Basic Y29tYV9OZ0dsU0I2VWdidUFCc1pYOjVqQWw0MkdzbGZTcjhVcTllRFF3bTBjNU1YVDM3MDFXYTZmaWh6Q00tVEU=',
                'Content-Type: application/json'
              ),
            ));
            $response = curl_exec($curl);
            error_log('***** Pay API Response: ' . print_r($response, true));
            curl_close($curl);

            $response_body = json_decode($response, true);
            if (isset($response_body['data']['attributes']['hpp_url'])) {
                $redirect_url = $response_body['data']['attributes']['hpp_url'];
                return array(
                    'result' => 'success',
                    'redirect' => $redirect_url,
                );
            } else {
                wc_add_notice('Ошибка при обработке платежа.', 'error');
                return;
            }
        }
    }
}

// Добавление endpoint для обработки callback от ***** Pay
function add_*****_pay_callback_endpoint() {
    add_rewrite_endpoint('*****_pay_callback', EP_ROOT);
}
add_action('init', 'add_*****_pay_callback_endpoint');

// Обработка запросов к endpoint
function handle_*****_pay_callback() {
    global $wp_query;

    if (!isset($wp_query->query_vars['*****_pay_callback'])) {
        return;
    }

    $request_body = file_get_contents('php://input');
    $data = json_decode($request_body, true);

    error_log('***** Pay Callback Data: ' . print_r($data, true));

    if (isset($data['status'])) {
        $order_id = $data['reference_id']; 
        $order = wc_get_order($order_id);
        if (!$order) {
            error_log('Order not found: ' . $order_id);
            return;
        }

        switch ($data['status']) {
            case 'processed':
                $order->update_status('completed', 'Платеж успешно обработан через ***** Pay');
                break;
            case 'process_failed':
                $order->update_status('failed', 'Ошибка при обработке платежа через ***** Pay');
                break;
            case 'process_pending':
                $order->update_status('processing', 'Платёж в обработке через ***** Pay');
                break;
        }
    }

    status_header(200);
    echo 'Callback received and processed';
    exit;
}
add_action('template_redirect', 'handle_*****_pay_callback');


Коллбеки доходят до endpoint, но статус платежа не меняется. в логах ошибок нет, всё работает.
Может у кого был опыт?

65df2f23400a5972002217.png
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Сложный Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    Курс по WordPress с нуля до результата. Создание сайтов без кода
    2 недели
    Далее
  • Яндекс Практикум
    Фулстек-разработчик расширенный
    20 месяцев
    Далее
  • beONmax
    Профессия WordPress разработчик
    3 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
@zutov Автор вопроса
Михаил Р., может при таком описании получится понять?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Сбер Москва
от 200 000 до 300 000 ₽
Nevatech Санкт-Петербург
от 200 000 до 250 000 ₽
Сбер Москва
от 200 000 до 400 000 ₽