Обновить заказ после успешного или неудачного платежа в woocommerce

Я интегрировал пользовательский платежный шлюз для woocommerce, я успешно это сделал и могу выводить успешные/неуспешные и правильно перенаправлять вместе с опорожнением корзины. Правильно перенаправляет Очищает корзину Не обновляет order_status или add_order_note

function check_pg_response($order_id)
{
global $woocommerce;
    $msg['class']   = 'error';
    $msg['message'] = $this->settings['error_msg']." - Error: No Response From Payment Gateway.";

if (isset($_REQUEST['msg'])){
$response = $_REQUEST['msg'];
$response_data = array();
$resp = explode("|", $response);
$dataSize=sizeof($resp);
    for($i = 0; $i < $dataSize; $i++) 
                {
                    $information=explode('=',$resp[$i]);
                    if($i==0)   $txn_status=$information[1]; //001   
                    if($i==1)   $txn_msg=$information[1]; // success or failure
                    if($i==2)   $txn_err_msg=$information[1]; // canceled by user   
                    if($i==3)   $txn_ref=$information[1];
                    if($i==4)   $bank_cd=$information[1];
                    if($i==5)   $txn_id=$information[1];    
                    if($i==6)   $txn_amt=$information[1];
                    if($i==7)   $txn_time=$information[1];    
                }
        }
if($order -> status !=='completed'){
$order_id = (int) $order_id;
$order = new WC_Order( $order_id );

    if ($txn_msg=='success'){
        $transauthorised = true;
        $msg['message']  = $this->settings['success_msg'];
        $msg['class']    = 'success';
if ($order->status != 'processing') {
        $order->payment_complete();
        $order->update_status('completed', __('Payment Successful.', 'wptut'));
        $order->add_order_note('PG ID: '.$clnt_txn_ref.'<br/> Transaction ID: '.$tpsl_txn_id.'<br/>Bank CD: '.$tpsl_bank_cd);
        $woocommerce -> cart -> empty_cart();}

        } 
        else if($txn_msg=='failure'){
        $msg['class']   = 'error';
        $msg['message'] = $this->settings['declined_msg']." - Error: Payment Gateway Declined order.";
        $order->update_status('failed', __('Payment has been cancelled.', 'wptut'));
        $order->add_order_note('PG payment failed<br/>Techprocess ID: '.$txn_ref.'<br/>Payment Gateway Message: '.$txn_err_msg);
        $woocommerce -> cart -> empty_cart();
    }else{
        $msg['class']   = 'error';
        $msg['message'] = $this->settings['error_msg']." - Error: Unknown Error";
    }

    if ($transauthorised == false) {
        $order->update_status('failed');
        $order->add_order_note($msg['message']);
    }
    }


if (function_exists('wc_add_notice')) {
    wc_add_notice($msg['message'], $msg['class']);

} else {
    if ($msg['class'] == 'success') {
        $woocommerce->add_message($msg['message']);
    } else {
        $woocommerce->add_error($msg['message']);

    }
    $woocommerce->set_messages();
}
$redirect_url = get_permalink(woocommerce_get_page_id('myaccount'));
wp_redirect($redirect_url);
exit;

} }


person P Sebastian    schedule 25.11.2016    source источник
comment
Вы расширили woocommerce WC_Payment_Gateway до своего класса платежного шлюза?   -  person GKS    schedule 25.11.2016
comment
Ага... add_action('plugins_loaded', 'woocommerce_pg_init', 0); function woocommerce_pg_init(){ if(!class_exists('WC_Payment_Gateway')) return; класс WC_pg расширяет WC_Payment_Gateway{   -  person P Sebastian    schedule 25.11.2016


Ответы (1)


В Woocommerce, чтобы создать собственный платежный шлюз, вам придется переопределить WC_Payment_Gateway's функции класса.

do_order_complete_tasks обрабатывает действие до завершения заказа.

 protected function do_order_complete_tasks()
     {

          global $woocommerce;

          // return if order status id already completed.
          if ($this->order->status == 'completed')
               return;

          $this->order->payment_complete();
          $woocommerce->cart->empty_cart();

          // add order note 
          $this->order->add_order_note(sprintf("Order completed with Transaction Id of '%s'", $this->transactionId));

     }

process_payment Для обработки процесса оплаты заказа

    function process_payment($order_id)
    {
        global $woocommerce;
        $this->order        = new WC_Order($order_id);

            // calling do_order_complete_tasks() function. 
            $this->do_order_complete_tasks();

            return array(
                'result' => 'success',
                'redirect' => $this->get_return_url($this->order)
            );

    }

добавьте эти две функции в свой собственный класс платежного шлюза WC и измените в соответствии с вашими потребностями.

Надеюсь, это поможет!

person GKS    schedule 25.11.2016
comment
Получение ошибки: SyntaxError: Неожиданный токен F в JSON в позиции 1 - person P Sebastian; 25.11.2016
comment
@PSebastian скопируйте функцию process_payment из моего ответа и замените в своем коде, который я только что отредактировал. теперь он обновляется и добавляет примечание к заказу, оба работают нормально. - person GKS; 25.11.2016
comment
Извините, но я все еще не могу add_order_note ? а также снова проверить .. он не обрабатывает его как новый заказ, а записывает его как выполненный платеж .. без перехода к PG .. - person P Sebastian; 25.11.2016
comment
@PSebastian К сожалению, я добавил get_return_url() вместо URL-адреса платежа. Итак, в функции процесса замените значение перенаправления на 'redirect' => $this->order->get_checkout_payment_url(true), чтобы оно могло перенаправить на страницу квитанции для совершения платежа. - person GKS; 26.11.2016
comment
Пробовал и с измененным значением. Этот заказ в статусе «В обработке» — его нельзя оплатить. Пожалуйста, свяжитесь с нами, если вам нужна помощь. - person P Sebastian; 26.11.2016
comment
не могли бы вы прокомментировать эту строку $this->do_order_complete_tasks(); @PSebastian - person GKS; 26.11.2016
comment
То же, что и - перенаправляет правильно Очищает корзину Не обновляет order_status или add_order_note - person P Sebastian; 26.11.2016
comment
это потому, что вы не вызвали $this->do_order_complete_tasks() в своей функции обратного вызова API «check_techprocess_response» вызовите $this->do_order_complete_tasks() функцию ниже вашего $woocommerce->cart->empty_cart(); в блоке успеха и отказа. @PSebastian - person GKS; 26.11.2016
comment
Неустранимая ошибка: вызов функции-члена payment_complete() для необъектной [ссылки] wp-witness.rhcloud. com учетные данные user/actnow bank test/test - person P Sebastian; 26.11.2016
comment
удалите $this->order->payment_complete(); из строки 264, так как вы уже вызвали внутри себя функцию обратного вызова API. @PSebastian - person GKS; 26.11.2016
comment
строка 261 Примечание: свойство Undefined: WC_tp::$order , строка 264 Вызов функции-члена add_order_note() для необъекта - person P Sebastian; 26.11.2016
comment
Спасибо, но до сих пор не могу выполнить заказ. Неустранимая ошибка: вызов функции-члена add_order_note() 267 - person P Sebastian; 26.11.2016