исправить платежный модуль goopay

Автор ed44rf, 23 сентября 2016, 14:51:33

« назад - далее »

ed44rf

есть модуль goopay, попросили исправить ошибку
при оплате если платеж не проходит все равно генерируется order
где это можно исправить? пхп знаю но престашоп вижу впервые
нашел класс с вызовом методом $this->validateOrder интересно это оно?

если кому интересно вот модуль https://yadi.sk/d/enAbfdM5vbBnr

Adik

$this->module->validateOrder
Этот метод создает заказ.

ed44rf

т.е. гдето сперва идет валидация и затем если все ок то идет вызов метода validateOrder и создается ордер?

Adik

Кто как делает подтверждение.  Заказ может регистрироваться со статусом Не оплачен, после подтверждения оплаты статус изменяется. Может не регистироваться без подтверждения. Может подтверждаться на сайте или в платежном шлюзе.
Этот метод регистирует заказ в бд.

ed44rf

а какой вобще механизм?
заказ это то что юзер положил в корзину?

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

stripe это второй модуль оплаты на сайте и он  работает как им нужно

coder

Нормальное требование. Сначала временная регистрация заказа, после подверждения приема оплаты заказ переходит в табл. ps_order. У многих модулей такой алгоритм. Делаешь перенаправление на сайт, где принимают платежи и при возврате success используешь метод validateOrder.

ed44rf

 ордер это запись в таблице ps_order?
а до этого "заказ" как называется и где хранится?

Adik


ed44rf

вот кусок кода из проблемного модуля 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 больше нигде не используется

Adik

$order = new Order($id_order);
это не создание нового заказа, наоброт, получение данных о заказе, который сохранен в бд.

ed44rf

$id_order = Order::getOrderByCartId($cart->id);
разве не это получение?

Adik

Это получение ид. Потом по ид можно инициализировать объект Заказ со всеми свойствами.

ed44rf

#12
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')

Adik

Больше похоже, что
$resp['Succeed']
дает статус платежа.
Лучше описание API банка посмотреть, а не угадывать.

ed44rf

нет статус платежа точно это 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') то как тогда редиректить?