Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


ibond

Recommended Posts

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

 

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

 

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

Надіслати
Поділитися на інших сайтах

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

 

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

 

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

 

image.thumb.png.576fca8cdc23dbc7a44dcabd6a7ea8b8.png

 

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

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

Надіслати
Поділитися на інших сайтах

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

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

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

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

Надіслати
Поділитися на інших сайтах

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

 

Надіслати
Поділитися на інших сайтах

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

 

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

Надіслати
Поділитися на інших сайтах

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

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

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

Надіслати
Поділитися на інших сайтах

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'));

 

Надіслати
Поділитися на інших сайтах

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

 

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

  • +1 1
Надіслати
Поділитися на інших сайтах

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

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

 

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

 

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

 

 

 

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

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

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

Надіслати
Поділитися на інших сайтах


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

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

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

 

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

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

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

Надіслати
Поділитися на інших сайтах

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

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

 

Надіслати
Поділитися на інших сайтах

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

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

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

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

только в Google Chrome

 

Надіслати
Поділитися на інших сайтах

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

 

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

Надіслати
Поділитися на інших сайтах

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

Надіслати
Поділитися на інших сайтах

  • 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

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.