Объект msOrderAddress содержит некорректные данные покупателя

Здравствуйте!

Дано:
MODX Revo 2.7.1
Minishop2 обновленный с версии 2.4.18 до 4.3.0 без промежуточных обновлений. Старые handler'ы удалены.
Модуль оплаты PayKeeper из репозитория modx.com

Как таковой регистрации на сайте нет. При оформлении заказа в корзине есть поля ФИО, email, телефон.

Проблема: при формировании линка на оплату в качестве ФИО передаются какие-то рандомные данные, которые вытягиваются из БД пользователей. Не то, что введено в соответствующее поле.
Пробовал заполнять и авторизованным и в качестве гостя. Указывал каждый раз разные разные данные — новый пользователь нормально создаются, но в линк передается какой-то другое имя.

Фрагмент кода из модуля:

private function setOrder(msOrder $order) {

        $order_id = $order->get('id');
        $order_total = floatval($order->get('cost'));

        $user = $this->modx->getObject('msOrderAddress', $order_id);

        $user_id = $order->user_id;
        $objProfile = $this->modx->getObject('modUserProfile', $user_id);
        $client_email = '';

        if ($objProfile) {
            $client_email = $objProfile->get('email');
        }
        
        $this->order = array(
            'order' => $order,
            'clientid' => $user->receiver,
            'orderid' => $order_id,
            'service_name' => '',
            'order_total' => $order_total,
            'client_id' => $user->user_id,
            'client_email' => $client_email,
            'client_phone' => $user->phone,
        );
    }
Если я отправляю в логи содержимое объекта $user, то там:
array (
    'id' => 510, // ID заказа
    'order_id' => 502, // не знаю что за ID
    'user_id' => 200, // существующий юзер, но связи с введенными данными нет, далее данные этого юзера, а не покупателя
    'createdon' => '2024-07-21 01:00:44',
    'updatedon' => NULL,
    'receiver' => 'Asdaasd',
    'phone' => '+7123123-12-31',
    'email' => 'email@email.email',
    'country' => NULL,
    'index' => '',
    'region' => '',
    'city' => '',
    'metro' => NULL,
    'street' => '',
    'building' => '',
    'entrance' => NULL,
    'floor' => NULL,
    'room' => '',
    'comment' => '',
    'text_address' => NULL,
    'properties' => NULL,
  ),
Скаут
21 июля 2024, 09:50
modx.pro
301
0

Комментарии: 21

Артур Шевченко
21 июля 2024, 10:09
0
Нужно проверить создаётся ли пользователь с корректными данными. Потом разобраться почему в заказ передаётся id другого пользователя.
    Скаут
    21 июля 2024, 10:49
    0
    Да, если вводится уникальная почту, то новый пользователь создаётся.

    Идеи есть, куда копать, как разобраться?

    Кстати, в объекте $user если смотреть данные вложенных объектов (modRequest, msProductRemains), то там данные покупателя корректные.
    Артур Шевченко
    21 июля 2024, 10:57
    0
    Да, если вводится уникальная почту, то новый пользователь создаётся.
    При этом данные в платёжный сервис всё равно передаются не те?
      Скаут
      21 июля 2024, 17:40
      0
      да, передавались не те. Еще одну особенность обнаружил: всё вышеописанное происходит, когда я тестирую из-под админа. Если же пробую всё то же самое из-под гостя, то объект $user возвращает NULL.
      При этом в админке если проверять заказ, то там данные верны (имя записывает то, что указано, если почта уникальный — создается новый пользователь, если почта уже есть в базе, то цепляется к существующему пользователю).
      Как так происходит не понимаю…
        Артур Шевченко
        21 июля 2024, 17:43
        0
        Ошибки в журнале есть?
          Скаут
          21 июля 2024, 19:21
          0
          ни в modx логах, ни в логах php ошибок в процессе формирования не возникает (только что проверил и под гостем и под админом).
          В логах проскакивают ошибки и notice, но они связаны с другими страницами, модулями и возникают совершенно в другие временные эпизоды.
            Артур Шевченко
            21 июля 2024, 19:28
            0
            Тогда выход один логгировать процесс.
              Скаут
              21 июля 2024, 19:50
              0
              подскажите, как это сделать
                Артур Шевченко
                21 июля 2024, 20:50
                0
                $this->modx->log(1, print_r($data,1))
                Так можно вывести в журнал ошибок необходимые данные. проверять нужно работу методов submit() и getCustomerId()
                  Скаут
                  21 июля 2024, 22:26
                  0
                  а, об этом речь, думал какое-то еще логирование)
                  проверил эти два метода — там всё ок.

                  Отложил процесс покупки, проблема именно в получении объекта
                  modx->getObject('msOrderAddress', 523);
                  Проверил на заранее уже существующем заказе в консоли и получил вообще другие заказ.
                  [_fields] => Array
                          (
                              [id] => 523
                              [order_id] => 515
                              [user_id] => 208
                              [createdon] => 2024-07-21 11:38:48
                              [updatedon] => 
                              [receiver] => Пример ФИО
                              [phone] => +79999999
                              [email] => test@test.test
                              [country] => 
                              [index] => 
                              [region] => 
                              [city] => 
                              [metro] => 
                              [street] => 
                              [building] => 
                              [entrance] => 
                              [floor] => 
                              [room] => 
                              [comment] => 
                              [text_address] => 
                              [properties] => 
                          )
                  То есть я запросил данные заказа 523, а мне вернулся заказ 515.
                  Что за id и order_id?
                    Артур Шевченко
                    21 июля 2024, 22:43
                    0
                    Что за id и order_id?
                    order_id — идентификатор заказа
                    id — идентификатор адреса
                      Скаут
                      21 июля 2024, 22:47
                      0
                      ниже мой коммент с решением проблемы.

                      идентификатор адреса — что-то странное, не очень понял где и как он используется… Но получается, что проблема в модуле, неправильно там написан запрос, оттуда и вся возня на два дня… (
                    Скаут
                    21 июля 2024, 22:44
                    0
                    проблема решилась изменением запроса, а именно
                    было
                    $user = $this->modx->getObject('msOrderAddress', $order_id);
                    сделал
                    $user = $this->modx->getObject('msOrderAddress', ['order_id' => $order_id]);
        Alexey
        21 июля 2024, 21:11
        0
        Привет! В минишопе раньше была бага(или фича), связанная с привязкой юзера по НОМЕРУ ТЕЛЕФОНА, если его вводить в форму заказа. То есть, если вводишь новый email, а телефон использован у ранее зареганого юзера, то заказ прикрепится к этому юзеру, а не зарегает нового.

        Сам нарывался на это, нужно было в файле минишопа закомментить пару строк, но в каком — сейчас не вспомню. Может, опытные товарищи подскажут?

        Возможно, этот момент уже пофиксил в новых версиях минишопа, не знаю… но раньше точно была такая проблема
          Артур Шевченко
          21 июля 2024, 21:38
          0
          Возможно, этот момент уже пофиксил в новых версиях минишопа, не знаю
          Нет, не пофиксили, так как это не баг. Поиск пользователя происходит по username, email и modilephone.
            Alexey
            21 июля 2024, 22:04
            0
            Понятное дело, что это сделано из благих побуждений. Но в случае, если заказ на сайте совершают несколько менеджеров из одной компании, у которых разные email, но один телефон на всех, это может быть проблемой. Так как уникальным полем для регистрации в основном служит email.
              Артур Шевченко
              21 июля 2024, 22:12
              0
              А почему менеджеры не могут указывать разные номера?
                Alexey
                22 июля 2024, 01:32
                0
                Мы немного уходим в сторону от темы топика)) Но все же рискну завершить оффтоп: мне кажется немного странной логика, в которой определяется привязка пользователя к заказу по неуникальному полю. Юзернейм и емайл — по умолчанию уникальные поля для пользователя в MODX, телефон — нет. То есть, в принципе есть вероятность прикрепления не к тому юзеру, разве нет?

                Бывает, что уникальным полем для регистрации пользователя служит телефон, для этого случая — как вариант — можно добавить в настройки минишопа опцию, которая включает поиск зарегистрированного юзера по номеру телефона из формы заказа.
                  Артур Шевченко
                  22 июля 2024, 10:45
                  0
                  Юзернейм и емайл — по умолчанию уникальные поля для пользователя в MODX, телефон — нет.
                  С точки зрения Modx всё так, но с точки зрения человека телефон уникален, так как служит для с связи с кем-то конкретным больница, другой человек, организация.

                  можно добавить в настройки минишопа опцию, которая включает поиск зарегистрированного юзера по номеру телефона
                  Добавь. miniShop2 это проект с открытым исходным кодом. Пришли PR и всё появится.
          Скаут
          21 июля 2024, 22:27
          0
          спасибо за инфу, но нет, не в этом проблема)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          21