Автор Тема: Обработка Callback уведомлений в модуле Payment method SberbankModule  (Прочитано 1525 раз)

22 Ноябрь 2018, 20:06:19
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Добрый день!

Прошу помощи в реализации обработки уведомлений от Сбербанка со статусами операций по оплате.

Используется модуль Payment method Sberbank Module 1.1.3.

По документации из СБРФ нужно создать у себя на сайте маршрут, который будет принимать GET запрос от сервиса оплаты.

Предварительно зарегистрировав хук в функции установки модуля, маршрут задаю так
    public function hookModuleRoutes()
    {
        return array(
            'module-'.$this->name.'-callback' => array(
                'controller' => 'callback',
                'rule' =>  'callback/{-:mdOrder}{-:orderNumber}{-:operation}{-:checksum}{-:status}',
                'keywords' => array(
                    'mdOrder' => array('regexp' => '[\w]+', 'param' => 'mdOrder'),
                    'orderNumber' => array('regexp' => '[\w]+', 'param' => 'orderNumber'),
                    'operation' => array('regexp' => '(approved|deposited|reversed|refunded|declinedByTimeout)+', 'param' => 'operation'),
                    'checksum' => array('regexp' => '[\w]+', 'param' => 'checksum'),
                    'status' => array('regexp' => '(0|1)+', 'param' => 'status')
                ),
                'params' => array(
                    'fc' => 'module',
                    'module' => $this->name,
                )
            )
        );
    }

создал контроллер callback в модуле, для проверки работы такой

class SberbankpaymentCallbackModuleFrontController extends ModuleFrontController
{
    public function init()
    {
      header('Content-Type: application/json');
      echo json_encode($_GET);
    }
}

в итоге по ссылке callback/?mdOrder=6bc93e62313ba3ede9cbcf24f6a6c691&orderNumber=6&operation=deposited&status=0

получаю ответ
{
  "mdOrder": "6bc93e62313ba3ede9cbcf24f6a6c691",
  "orderNumber": "6",
  "operation": "deposited",
  "status": "0",
  "isolang": "ru",
  "id_lang": 2,
  "fc": "module",
  "module": "sberbankpayment",
  "controller": "callback"
}
Подскажите пожалуйста, как дальше на основе этих параметров изменить статус заказа, сохраняя историю?
Я новичек в PrestaShop, буду благодарен за любые подсказки.

Спасибо!
23 Ноябрь 2018, 15:30:01
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 16676
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
"status": "0",Не знаю как в сбербанке со статучами, а в prestashop свори статусы, у каждого id, не 0/1.
23 Ноябрь 2018, 19:48:57
Ответ #2
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
"status": "0", в prestashop свои статусы, у каждого id, не 0/1.
именно их и я хочу менять, но не могу понять, какой хук или метод класса отвечает за 1 - смену статуса заказа, 2 - запись истории.
На основе того, какой ответ прилетел, буду выводить логику к этим двум целям, так сказать....
23 Ноябрь 2018, 20:21:07
Ответ #3
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
$order_status = new OrderState($id_order_state, $this->context->language->id);
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
23 Ноябрь 2018, 23:26:23
Ответ #4
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$order_status = new OrderState($id_order_state, $this->context->language->id);
Тут мы получим объект OrderState и что с ним сделать дальше?
я попытался сделать так:

        // Получить значение из запроса.
        $gate_order_id = Tools::getValue('orderNumber');
        // Выбрать оплату СБРФ по иду заказа.
        $payment = new SBRFPayment($gate_order_id);
        // Получить заказ.
        $order = new Order((int)$payment->id_order);
        $old_os = $order->getCurrentOrderState();
        if (!Validate::isLoadedObject($order)) {
            die($this->module->l('The order does not exist.', 'validation'));
        }
        // Инициализировать объект истории статусов заказа.
        $order_history = new OrderHistory();
        // Сменить статус заказа на заданный.
        $order_history->changeIdOrderState(2, $order->id);

мои статусы в базе во вложении.
позволяет поменять на любой статус, кроме 2. При 2 пишет "Фатальная ошибка", в логах ничего. Может быть можно применять 11 статус?
24 Ноябрь 2018, 10:53:57
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Меняйте на 11, они же у вас одинаковые.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
24 Ноябрь 2018, 11:42:20
Ответ #6
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
в итоге работает так


            $order_history->id_order = $order->id;
            $order_history->changeIdOrderState(11, $order->id);
            $order_history->add();

            $order_history->id_order = $order->id;
            $order_history->add(); - еще добавляет запись истории

вроде все работает теперь как нужно, спасибо всем участникам! Отличный форум, буду его посещать!
P.S. Не увидел, где "спасибо" отметить.