Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

Теряется $this->session->data['order_id'] в success после оплаты через модуль Way for Pay


Recommended Posts

Столкнулся с проблемой, что только в Google Chrome (проверял в Opera dor Dev и Yandex) при оформлении заказа теряется $this->session->data['order_id'] в success после оплаты через модуль Way for Pay.

 

Проблема очень схожа с дублями при копировании товаров и т.д., о которой я писал раньше. Судя по логам, то оформление отрабатывает несколько раз и в первый раз создается заказ. Проверял на двух магазинах. Пока нашел решение отдать order_id через 5ти секундную куку.

 

Может уже кто-то сталкивался с таким?

Link to post
Share on other sites

долбился недавно с подобным только не с этим но смысл тот же

 

скорее всего коллбек приходит раньше и затирает ордер ид тк там редирект

 

как решение можете сохранить в сессию перед редиректом

 

image.thumb.png.576fca8cdc23dbc7a44dcabd6a7ea8b8.png

 

примерно тут написать

$this->session->data['order_id'] = $order_id;

Link to post
Share on other sites
18 минут назад, spectre сказал:

примерно тут написать

$this->session->data['order_id'] = $order_id;

пробовал, там я в куку уже решил пихать. success тоже два раза отрабатывает, а там unset

Link to post
Share on other sites

перед редиректом на success поставить ещё раз в сессию 

Link to post
Share on other sites
15 минут назад, spectre сказал:

перед редиректом на success поставить ещё раз в сессию 

 

 public function response() {
       ....
        if ($paymentInfo === true) {
            list($order_id,) = explode(WayForPay::ORDER_SEPARATOR, $_POST['orderReference']);

            // # wayforpay_chrome_session_fix.ocmod.xml
            if (empty($this->session->data['order_id']) && !empty($order_id)) {
                $this->session->data['order_id'] = (int)$order_id;
            }
            // # wayforpay_chrome_session_fix.ocmod.xml
            
            $message = '';

            $this->load->model('checkout/order');

            ...

            // # wayforpay_chrome_session_fix.ocmod.xml
            if (empty($this->session->data['order_id']) && !empty($order_id)) {
                $this->session->data['order_id'] = (int)$order_id;
            }
            $this->log->write(print_r('START catalog/controller/extension/payment/wayforpay.php',1));
            $this->log->write(print_r($this->session->data,1));
            $this->log->write(print_r('END catalog/controller/extension/payment/wayforpay.php',1));
            // # wayforpay_chrome_session_fix.ocmod.xml
            
            $this->response->redirect($this->url->link('checkout/success'));
        } else {
...

Лог:

Спойлер

2020-11-03 16:47:31 - START catalog/controller/extension/payment/wayforpay.php
2020-11-03 16:47:31 - Array
(
    [language] => ua-uk
    [langmark_multi] => Array
        (
            [name] => УКР
            [store_id] => 0
        )

    [currency_old] => Array
        (
        )

    [currency] => UAH
    [order_id] => 3582
)

2020-11-03 16:47:31 - END catalog/controller/extension/payment/wayforpay.php


2020-11-03 16:47:31 - START catalog/controller/checkout/success.php
2020-11-03 16:47:31 - Array
(
    [language] => ua-uk
    [langmark_multi] => Array
        (
            [name] => УКР
            [store_id] => 0
        )

    [currency_old] => Array
        (
        )

    [currency] => UAH
    [order_id] => 3582
)

2020-11-03 16:47:31 - END catalog/controller/checkout/success.php

 

2020-11-03 16:47:31 - START catalog/controller/checkout/success.php
2020-11-03 16:47:31 - Array
(
    [language] => ua-uk
    [langmark_multi] => Array
        (
            [name] => УКР
            [store_id] => 0
        )

    [currency_old] => Array
        (
        )

    [currency] => UAH
    [geokInfo] => Array
        (
            [country] => Украина
            [region] => Киев
            [city] => Киев
            [countryId] => 222
            [lang] => Array
                (
                    [language_id] => 3
                    [name] => UKR
                   

 => ua-uk
                    [locale] => ua_UA.UTF-8,ua_UA,ua_UA,ua
                    [image] => 
                    [directory] => 
                    [sort_order] => 0
                    [status] => 1
                )

            [currency] => Array
                (
                    [currency_id] => 4
                    [title] => UAH
                    [code] => UAH
                    [sort_order] => 0
                    [symbol_left] => 
                    [symbol_right] =>  грн.
                    [decimal_place] => 0
                    [value] => 1.00000000
                    [status] => 1
                    [date_modified] => 2020-11-03 16:37:24
                )

        )

    [countryCode] => UA
    [countryId] => 222
)

2020-11-03 16:47:31 - END catalog/controller/checkout/success.php

 

Link to post
Share on other sites

там есть response и callback функция

 

обычно такое отлаживается так - когда что-то прилетает сразу тормозим через die и смотрим что в сессии, что пришло и тп

Link to post
Share on other sites
4 минуты назад, spectre сказал:

обычно такое отлаживается так - когда что-то прилетает сразу тормозим через die и смотрим что в сессии, что пришло и тп

Я знаю как отслеживается. Все прилетает до первого success, где срабатывает unset (unset($this->session->data['order_id']);). В логе это видно. Я и в response и в callback дублирую проверку на сессию.

Link to post
Share on other sites

З.Ы. Заказ создается нормально.

Link to post
Share on other sites

я имею ввиду перед редиректом на common success повторно установить order_id

Link to post
Share on other sites
2 минуты назад, spectre сказал:

я имею ввиду перед редиректом на common success повторно установить order_id

Это?

20 минут назад, ibond сказал:

// # wayforpay_chrome_session_fix.ocmod.xml if (empty($this->session->data['order_id']) && !empty($order_id)) { $this->session->data['order_id'] = (int)$order_id; } $this->log->write(print_r('START catalog/controller/extension/payment/wayforpay.php',1)); $this->log->write(print_r($this->session->data,1)); $this->log->write(print_r('END catalog/controller/extension/payment/wayforpay.php',1)); // # wayforpay_chrome_session_fix.ocmod.xml $this->response->redirect($this->url->link('checkout/success'));

 

Link to post
Share on other sites

ага, я ж в первом сообщении это написал

 

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

  • +1 1
Link to post
Share on other sites
2 часа назад, spectre сказал:

долбился недавно с подобным только не с этим но смысл тот же

 

скорее всего коллбек приходит раньше и затирает ордер ид тк там редирект

 

как решение можете сохранить в сессию перед редиректом

 

 

 

примерно тут написать

$this->session->data['order_id'] = $order_id;

Поддержка этого модуля хотела лезть править файл success.php. Хорошо что доступ им не выдал а то б сайт сломали.

Link to post
Share on other sites

13 минут назад, spectre сказал:

ага, я ж в первом сообщении это написал

ну дык выше в коде и добавил, результат такой же

 

13 минут назад, spectre сказал:

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

не сколько модули оплаты, сколько аналитика, которая пукает в tpl

Link to post
Share on other sites

так в том и смысл

но я все равно не понимаю как у вас получается что ставите перед редиректом в сессию № заказа и его уже нет на success

 

Link to post
Share on other sites
4 минуты назад, spectre сказал:

но я все равно не понимаю как у вас получается что ставите перед редиректом в сессию № заказа и его уже нет на success

я тоже не понимаю, но

2 часа назад, ibond сказал:

только в Google Chrome

 

Link to post
Share on other sites

сегодня просто похожую проблему решал с ликпеем и запись ид заказа в сессию ещё раз помогла 

 

а если какой-то другой параметр явно поставить? типа test_order_id есть он в success? 

Link to post
Share on other sites

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

Link to post
Share on other sites
  • 7 months later...

Скорее всего это происходит из-за политики браузера, а именно Samesite. 

Для нормального сохранения сессия после ухода на платежку и возврата, нужно что у куков были параметры samesite = none, secure = true

Вот фикс для php 7.3 и выше

https://medium.com/@ayhankesicioglu/opencart-samesite-issue-31162a390c11

также описание вопроса на англоязычном форуме, там же и для php ниже 7.3

https://forum.opencart.com/viewtopic.php?t=220120

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.