Поддержка WooCommerce Убрать страницу подтверждения оплаты

  • Здравствуйте.
    После перехода на страницу «оформления заказа» я выбираю способ оплаты и нажимаю «Подтвердить заказ». Далее происходит перенаправление на страницу заказа, где стоит кнопка «купить». Можно ли пропустить эту страницу и после нажатия «Подтвердить заказ» сразу перейти на платежную систему?
    Именно так как нужно реализовано во встроенном в Woocommerce шлюзе PayPal. Как бы это «прикрутить» и к остальным способам оплаты?

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Модератор Yuri

    (@yube)

    Как бы это «прикрутить» и к остальным способам оплаты?

    Обратиться к авторам остальных, только одному Вам известных шлюзов.

    только одному Вам известных шлюзов

    например Unitpay, Робокасса..

    вот к авторам этих плагинов и обратитесь

    я так понимаю, это должна быть какая-то функция, которая меняет стандартный функционал…
    В интернете искал и видел много подобных вопросов — но, как и вы, всех их авторов куда-то посылают… спасибо за помощь ((

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

    должна быть какая-то функция, которая меняет стандартный функционал…

    Стандартный функционал чего? WooCommerce не имеет к этому отношения.
    Вам нужно изменить функционал плагинов платежных шлюзов.

    но, как и вы, всех их авторов куда-то посылают…

    Вам правильно посоветовали обращаться к авторам этих плагинов.
    Ну или разработайте свой вариант, тогда и будет сделано как вам надо)

    Там кода-то 300 строчек во всем плагине…

    <?php
    /*
      Plugin Name: Unitpay
      Plugin URI:  http://unitpay.ru/
      Description: Unitpay Plugin for WooCommerce
      Version: 1.0.1
      Author: unitpay.ru
     */
    if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
    
    /* Add a custom payment class to WC
    ------------------------------------------------------------ */
    add_action('plugins_loaded', 'woocommerce_unitpay', 0);
    function woocommerce_unitpay(){
        load_plugin_textdomain( 'unitpay', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );
    
        if (!class_exists('WC_Payment_Gateway'))
            return; // if the WC payment gateway class is not available, do nothing
        if(class_exists('WC_UNITPAY'))
            return;
        class WC_UNITPAY extends WC_Payment_Gateway{
            public function __construct(){
    
                $plugin_dir = plugin_dir_url(__FILE__);
    
                global $woocommerce;
    
                $this->id = 'unitpay';
                $this->icon = apply_filters('woocommerce_unitpay_icon', ''.$plugin_dir.'unitpay.png');
                $this->has_fields = false;
    
                // Load the settings
                $this->init_form_fields();
                $this->init_settings();
    
                // Define user set variables
                $this->public_key = $this->get_option('public_key');
                $this->secret_key = $this->get_option('secret_key');
                $this->title = 'Unitpay';
                $this->description = __('Payment system Unitpay', 'unitpay');
    
                // Actions
                add_action('woocommerce_receipt_' . $this->id, array($this, 'receipt_page'));
    
                // Save options
                add_action('woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
    
                // Payment listener/API hook
                add_action('woocommerce_api_wc_' . $this->id, array($this, 'callback'));
    
            }
    
            public function admin_options() {
                ?>
                <h3><?php _e('UNITPAY', 'unitpay'); ?></h3>
                <p><?php _e('Setup payments parameters.', 'unitpay'); ?></p>
    
                <table class="form-table">
    
                    <?php
                    // Generate the HTML For the settings form.
                    $this->generate_settings_html();
                    ?>
                </table><!--/.form-table-->
    
                <?php
            } // End admin_options()
    
            function init_form_fields(){
                $this->form_fields = array(
                    'enabled' => array(
                        'title' => __('Enable/Disable', 'unitpay'),
                        'type' => 'checkbox',
                        'label' => __('Enabled', 'unitpay'),
                        'default' => 'yes'
                    ),
                    'public_key' => array(
                        'title' => __('PUBLIC KEY', 'unitpay'),
                        'type' => 'text',
                        'description' => __('Copy PUBLIC KEY from your account page in unitpay system', 'unitpay'),
                        'default' => ''
                    ),
                    'secret_key' => array(
                        'title' => __('SECRET KEY', 'woocommerce'),
                        'type' => 'text',
                        'description' => __('Copy SECRET KEY from your account page in unitpay system', 'unitpay'),
                        'default' => ''
                    )
    
                );
            }
    
            /**
             * Generate form
             **/
            public function generate_form($order_id){
                $order = new WC_Order( $order_id );
    
                $sum = number_format($order->order_total, 2, '.', '');
                $account = $order_id;
                $desc = __('Payment for Order №', 'unitpay') . $order_id;
                $currency = $order->get_order_currency();
                $cur_locale = get_locale();
                $locale = $cur_locale == 'ru_RU'?'ru':'en';
                $signature = hash('sha256', join('{up}', array(
                    $account,
                    $currency,
                    $desc,
                    $sum,
                    $this->secret_key
                )));
    
                return
                    '<form action="https://unitpay.ru/pay/' . $this->public_key . '" method="POST" id="unitpay_form">'.
                    '<input type="hidden" name="sum" value="' . $sum . '" />'.
                    '<input type="hidden" name="account" value="' . $account . '" />'.
                    '<input type="hidden" name="desc" value="' . $desc . '" />'.
                    '<input type="hidden" name="currency" value="' . $currency . '" />'.
                    '<input type="hidden" name="locale" value="' . $locale . '" />'.
                    '<input type="hidden" name="signature" value="' . $signature . '" />'.
                    '<input type="submit" class="button alt" id="submit_unitpay_form" value="'.__('Pay', 'unitpay').'" />
    			 <a class="button cancel" href="'.$order->get_cancel_order_url().'">'.__('Cancel payment and return back to card', 'unitpay').'</a>'."\n".
                    '</form>';
            }
    
            /**
             * Process the payment and return the result
             **/
            function process_payment($order_id){
                $order = new WC_Order($order_id);
    
                return array(
                    'result' => 'success',
                    'redirect'	=> add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(woocommerce_get_page_id('pay'))))
                );
            }
    
            function receipt_page($order){
                echo '<p>'.__('Thank you for your order, press button to pay.', 'unitpay').'</p>';
                echo $this->generate_form($order);
            }
    
            function callback(){
                header('Content-type:application/json;  charset=utf-8');
    
                $method = '';
                $params = array();
    
                if ((isset($_GET['params'])) && (isset($_GET['method'])) && (isset($_GET['params']['signature']))){
                    $params = $_GET['params'];
                    $method = $_GET['method'];
                    $signature = $params['signature'];
    
                    if (empty($signature)){
                        $status_sign = false;
                    }else{
                        $secret_key = $this->secret_key;
                        $status_sign = $this->verifySignature($params, $method, $secret_key);
                    }
                }else{
                    $status_sign = false;
                }
    
    //    $status_sign = true;
    
                if ($status_sign){
                    switch ($method) {
                        case 'check':
                            $result = $this->check( $params );
                            break;
                        case 'pay':
                            $result = $this->payment( $params );
                            break;
                        case 'error':
                            $result = $this->error( $params );
                            break;
                        default:
                            $result = array('error' =>
                                array('message' => __('Wrong method', 'unitpay'))
                            );
                            break;
                    }
                }else{
                    $result = array('error' =>
                        array('message' => __('Wrong signature', 'unitpay'))
                    );
                }
    
                echo json_encode($result);
                die();
            }
    
            function verifySignature($params, $method, $secret)
            {
                return $params['signature'] == $this->getSignature($method, $params, $secret);
            }
            function getSignature($method, array $params, $secretKey)
            {
                ksort($params);
                unset($params['sign']);
                unset($params['signature']);
                array_push($params, $secretKey);
                array_unshift($params, $method);
                return hash('sha256', join('{up}', $params));
            }
    
            function check( $params )
            {
                $order = new WC_Order( $params['account'] );
    
                if (!$order->id){
                    $result = array('error' =>
                        array('message' => __('Order not created', 'unitpay'))
                    );
                }else{
    
                    $sum = number_format($order->order_total, 2, '.','');
                    $currency = $order->get_order_currency();
    
                    if ((float)$sum != (float)$params['orderSum']) {
                        $result = array('error' =>
                            array('message' => __('Wrong order sum', 'unitpay'))
                        );
                    }elseif ($currency != $params['orderCurrency']) {
                        $result = array('error' =>
                            array('message' => __('Wrong order currency', 'unitpay'))
                        );
                    }
                    else{
                        $result = array('result' =>
                            array('message' => __('Request successfully', 'unitpay'))
                        );
                    }
                }
    
                return $result;
            }
    
            function payment( $params )
            {
    
                $order = new WC_Order( $params['account'] );
    
                if (!$order->id){
                    $result = array('error' =>
                        array('message' => __('Order not created', 'unitpay'))
                    );
                }else{
    
                    $sum = number_format($order->order_total, 2, '.','');
                    $currency = $order->get_order_currency();
    
                    if ((float)$sum != (float)$params['orderSum']) {
                        $result = array('error' =>
                            array('message' => __('Wrong order sum', 'unitpay'))
                        );
                    }elseif ($currency != $params['orderCurrency']) {
                        $result = array('error' =>
                            array('message' => __('Wrong order currency', 'unitpay'))
                        );
                    }
                    else{
    
                        $order->payment_complete();
    
                        $result = array('result' =>
                            array('message' => __('Request successfully', 'unitpay'))
                        );
                    }
                }
    
                return $result;
            }
    
            function error( $params )
            {
                $order = new WC_Order( $params['account'] );
    
                if (!$order){
                    $result = array('error' =>
                        array('message' => __('Order not created', 'unitpay'))
                    );
                }
                else{
                    $order->update_status('failed', __('Payment error', 'unitpay'));
                    $result = array('result' =>
                        array('message' => __('Request successfully', 'unitpay'))
                    );
                }
                return $result;
            }
    
        }
    
        /**
         * Add the gateway to WooCommerce
         **/
        function add_unitpay_gateway($methods){
            $methods[] = 'WC_UNITPAY';
            return $methods;
        }
    
        add_filter('woocommerce_payment_gateways', 'add_unitpay_gateway');
    }
    ?>

    Там кода-то 300 строчек во всем плагине…

    Значит вам, как заинтересованному в этом лицу, будет легко в этом разобраться. Дерзайте.
    https://codex.wordpress.org/%D0%A7%D0%90%D0%92%D0%9E/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83_%D0%BC%D0%BD%D0%B5_%D0%BD%D0%B8%D0%BA%D1%82%D0%BE_%D0%BD%D0%B5_%D0%BE%D1%82%D0%B2%D0%B5%D1%87%D0%B0%D0%B5%D1%82

    WooCommerce не имеет к этому отношения.

    Вы зря так утверждаете — вот например, если я выбираю стандартный «Банковский перевод», то тоже, после подтверждения заказа, перебрасывает на страницу заказа…
    Я понимаю, что разработчик плагина должен был что-то дописать, что бы этого перенаправления не было — но это должно быть связано с функционалом woocommerce (

    Вот тут тоже наш человек на англоязычном форуме так же «бился головой от стену» безрезультатно https://wordpress.org/support/topic/how-to-remove-the-extra-step/

    Разработчики плагина ответили, надо уточнить у ребят из Woocommerce. Поскольку у нас в документации нет методов, отвечающих за это….
    Все — замкнутый круг (

    Дайте им ссылку на документацию по ВУУ и напомните, что это они делают плагин для ВУУ, а не ВУУ подгоняется под их плагин.

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Убрать страницу подтверждения оплаты» закрыта для новых ответов.