Автор Тема: исправить платежный модуль goopay  (Прочитано 1077 раз)

23 Сентябрь 2016, 14:51:33
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
есть модуль goopay, попросили исправить ошибку
при оплате если платеж не проходит все равно генерируется order
где это можно исправить? пхп знаю но престашоп вижу впервые
нашел класс с вызовом методом $this->validateOrder интересно это оно?

если кому интересно вот модуль https://yadi.sk/d/enAbfdM5vbBnr
23 Сентябрь 2016, 14:58:31
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
$this->module->validateOrderЭтот метод создает заказ.
23 Сентябрь 2016, 15:02:31
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
т.е. гдето сперва идет валидация и затем если все ок то идет вызов метода validateOrder и создается ордер?
23 Сентябрь 2016, 15:07:27
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Кто как делает подтверждение.  Заказ может регистрироваться со статусом Не оплачен, после подтверждения оплаты статус изменяется. Может не регистироваться без подтверждения. Может подтверждаться на сайте или в платежном шлюзе.
Этот метод регистирует заказ в бд.
23 Сентябрь 2016, 15:14:36
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
а какой вобще механизм?
заказ это то что юзер положил в корзину?

а то клиент забавно пишет, якобы он хочет сперва успешный платеж а потом уже чтобы появился заказ
Цитировать
stripe generate orders only payment go through.
Цитировать
we want only payment go through (success orders) generate orders

stripe это второй модуль оплаты на сайте и он  работает как им нужно
23 Сентябрь 2016, 15:26:04
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Нормальное требование. Сначала временная регистрация заказа, после подверждения приема оплаты заказ переходит в табл. ps_order. У многих модулей такой алгоритм. Делаешь перенаправление на сайт, где принимают платежи и при возврате success используешь метод validateOrder.
23 Сентябрь 2016, 15:39:51
Ответ #6
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
 ордер это запись в таблице ps_order?
а до этого "заказ" как называется и где хранится?
23 Сентябрь 2016, 20:26:43
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
26 Сентябрь 2016, 18:45:47
Ответ #8
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
вот кусок кода из проблемного модуля goopay

$id_order = Order::getOrderByCartId($cart->id);
if ($id_order)
{
$order = new Order($id_order);
}
else
{
$this->validateOrder($cart->id,  _PS_OS_PREPARATION_, $v_amount, $this->displayName, $this->l("Waiting for payment"));
$order = new Order($this->currentOrder);
$id_order = $this->currentOrder;
}

а это строка модуля который работает как нужно (вызов без всяких условий)
$this->validateOrder((int)$this->context->cart->id, (int)$order_status, ($result_json->amount * 0.01), $this->displayName, $message, array(), null, false, $this->context->customer->secure_key);
подозреваю что проблема тут

не понятен контекст
$id_order = Order::getOrderByCartId($cart->id); получаем ид заказа, и если заказ есть то создаем опять заказ new Order а зачем?
может выкинуть первую часть условия?
и в догонку-переменная $order больше нигде не используется
26 Сентябрь 2016, 19:16:35
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
$order = new Order($id_order);это не создание нового заказа, наоброт, получение данных о заказе, который сохранен в бд.
26 Сентябрь 2016, 19:25:30
Ответ #10
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$id_order = Order::getOrderByCartId($cart->id);разве не это получение?
26 Сентябрь 2016, 19:56:15
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Это получение ид. Потом по ид можно инициализировать объект Заказ со всеми свойствами.
26 Сентябрь 2016, 21:06:48
Ответ #12
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
function parseResponse($goopay, $resp){
    $verify_result = $resp['Succeed'];
    $out_trade_no = $resp['BillNo']; //获取订单号
    $Result = $resp['Result'];
    if (isset($out_trade_no))
    {
        $out_trade_no = substr($out_trade_no, 2);
    }
    //获取订单号
    //echo $out_trade_no;
    $order = new Order((int)$out_trade_no);
    if($verify_result == '88') {
        //验证成功
        $goopay->saveStatus($out_trade_no, Goopay::WAIT_SELLER_SEND_GOODS, $out_trade_no, $Result, 'update');
        $history = new OrderHistory();
        $history->id_order = (int)($out_trade_no);
        $history->changeIdOrderState(_PS_OS_PAYMENT_, intval($out_trade_no));
        $history->add();
    }
    else {
        // echo $goopay->l("交易失败");
        $goopay->saveStatus($out_trade_no, goopay::NOTIFY_VERIFY_ERROR, $out_trade_no, $Result, 'update');
        $history = new OrderHistory();
        $history->id_order = $out_trade_no;
        $history->changeIdOrderState(_PS_OS_ERROR_, intval($out_trade_no));
        $history->add();
    }
   
    $customer = new Customer(intval($order->id_customer));
   
    //redirect to payment confirm page
    $key = (isset($order)?$order->secure_key:pSQL($customer->secure_key));
    Tools::redirect('index.php?controller=order-confirmation&id_cart='.$order->id_cart.'&id_module='.$goopay->id.'&id_order='.$out_trade_no.'&key='.$key);
}

а что насчет этого куска кода,вроде похоже на ответ от платежного шлюза
в доке написано что статус 88 это успешный платеж
может тут убрать второй  блок условия или например перенести строку $order = new Order((int)$out_trade_no); в условие   if($verify_result == '88')
27 Сентябрь 2016, 12:22:54
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Больше похоже, что
$resp['Succeed']дает статус платежа.
Лучше описание API банка посмотреть, а не угадывать.
27 Сентябрь 2016, 12:59:20
Ответ #14
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
нет статус платежа точно это if($verify_result == '88')
меня просто другое смущает если создавать Order внутри  if($verify_result == '88') то как быть затем со строками
$customer = new Customer(intval($order->id_customer));
   
    //redirect to payment confirm page
    $key = (isset($order)?$order->secure_key:pSQL($customer->secure_key));
    Tools::redirect('index.php?controller=order-confirmation&id_cart='.$order->id_cart.'&id_module='.$goopay->id.'&id_order='.$out_trade_no.'&key='.$key);
если например все перемести внутрь if($verify_result == '88') то как тогда редиректить?