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

Woocommerce и Tinkoff Payment Gateway — как перевести заказ цифрового товара в статус Выполнен?

Доброго времени суток.

Устнановил платежный модуль Тинькофф Банка для Woocommerce https://oplata.tinkoff.ru/documentation/?section=cms
Столкнулся с проблемой изменения статуса заказа:
- не меняется автоматически статус заказа цифрового товара после покупки на Complete

Перепробовал все варианты найденные в интернете (правка functions.php) и плагины типа WooCommerce Order Status Control и Autocomplete Orders, однако статус заказа после оплаты всегда Обработка (processing).

Вот содержимое файла success.php платёжного модуля:

<?php
set_error_handler('exceptions_error_handler', E_ALL);
function exceptions_error_handler($severity) {
    if (error_reporting() == 0) {
        return;
    }
    if (error_reporting() & $severity) {
        die('NOTOK');
    }
}
try{
    require( dirname( __FILE__ ) . '../../../../../wp-blog-header.php' );

    //woocommerce_tinkoff_settings
    $settings = $wpdb->get_results("select * from ".$wpdb->prefix."options where option_name='woocommerce_tinkoff_settings'");
    $settings = unserialize($settings[0]->option_value);
    $_POST['Password'] = $settings['secret_key'];
    ksort($_POST);
    $sorted = $_POST;
    $original_token = $sorted['Token'];
    unset($sorted['Token']);
    $values = implode('', array_values($sorted));
    $token = hash('sha256', $values);

//    //log
//    $log = $_POST;
//    $log['token'] = $token;
//    $log['original_token'] = $original_token;
//    file_put_contents('log.txt', date('Y.m.d H:i:s') . ' ' . json_encode($log)."\r\n",FILE_APPEND);

if($token == $original_token){
        $order = $wpdb->get_results("select * from ".$wpdb->prefix."woocommerce_order_items where order_id=". (int) $_POST['OrderId']);
        $order_status = $wpdb->get_results("select * from ".$wpdb->prefix."posts where ID=".  $order[0]->order_id);
        $status = $order_status[0]->post_status;

        switch ($_POST['Status']) {
            case 'AUTHORIZED': $new_order_status = 'on-hold'; break; /*Деньги на карте захолдированы. Корзина очищается.*/
            case 'CONFIRMED': $new_order_status = 'processing'; break; /*Платеж подтвержден.*/
            case 'CANCELED': $new_order_status = 'cancelled'; break; /*Платеж отменен*/
            case 'REJECTED': $new_order_status = 'failed'; break; /*Платеж отклонен.*/
            case 'REVERSED': $new_order_status = 'cancelled'; break; /*Платеж отменен*/
            case 'REFUNDED': $new_order_status = 'refunded'; break; /*Произведен возврат денег клиенту*/
        }
    $order_id =  (int)$_POST['OrderId'];
    $order = new WC_Order($order_id);
    if( isset( $new_order_status ) ){
      $order->update_status( $new_order_status );
      die('OK');  }  die('NOTOK');     

    }  
    
    
    else{
        die('NOTOK');
    }
}


catch(Exception $e){
    die('NOTOK');
}


Буду признателен за помощь!
  • Вопрос задан
  • 1868 просмотров
Подписаться 4 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
nikolaynosov
@nikolaynosov
художник, дизайнер, ведущий
Была такая же проблема, я включил логгирование ошибок в файл.
Посмотрел, что скрипт выдает NOTOK1 при любой ошибке
deprecated ошибки можно не рассматривать и исключить их из обработчика, что я и сделал
а вот ошибки типа [2] являются warning и их нужно было поправить
все ошибки были в файле wp-ekam-class.php
потому что он написан "не очень"
собственно, я их и поправил
после чего warning ошибки пропали, как и ожидалось, и скрипт начал себя корректно вести
получается дело было по больше части в плагине екама
, но и плагин тинькофф тоже нужно было поправить, так как если поправить только екам, все равно бы не работало

в итоге поправили success php от tinkoff woocommerce
и wp ekam class php
Ответ написан
@romandubrovsky3
Николай,
а как в итоге стали выглядеть файлы:
success php от tinkoff woocommerce
и wp ekam class php
??????
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы