Объект msOrderAddress содержит некорректные данные покупателя
Здравствуйте!
Дано:
MODX Revo 2.7.1
Minishop2 обновленный с версии 2.4.18 до 4.3.0 без промежуточных обновлений. Старые handler'ы удалены.
Модуль оплаты PayKeeper из репозитория modx.com
Как таковой регистрации на сайте нет. При оформлении заказа в корзине есть поля ФИО, email, телефон.
Проблема: при формировании линка на оплату в качестве ФИО передаются какие-то рандомные данные, которые вытягиваются из БД пользователей. Не то, что введено в соответствующее поле.
Пробовал заполнять и авторизованным и в качестве гостя. Указывал каждый раз разные разные данные — новый пользователь нормально создаются, но в линк передается какой-то другое имя.
Фрагмент кода из модуля:
Дано:
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
Нужно проверить создаётся ли пользователь с корректными данными. Потом разобраться почему в заказ передаётся id другого пользователя.
Да, если вводится уникальная почту, то новый пользователь создаётся.
Идеи есть, куда копать, как разобраться?
Кстати, в объекте $user если смотреть данные вложенных объектов (modRequest, msProductRemains), то там данные покупателя корректные.
Идеи есть, куда копать, как разобраться?
Кстати, в объекте $user если смотреть данные вложенных объектов (modRequest, msProductRemains), то там данные покупателя корректные.
Да, если вводится уникальная почту, то новый пользователь создаётся.При этом данные в платёжный сервис всё равно передаются не те?
да, передавались не те. Еще одну особенность обнаружил: всё вышеописанное происходит, когда я тестирую из-под админа. Если же пробую всё то же самое из-под гостя, то объект $user возвращает NULL.
При этом в админке если проверять заказ, то там данные верны (имя записывает то, что указано, если почта уникальный — создается новый пользователь, если почта уже есть в базе, то цепляется к существующему пользователю).
Как так происходит не понимаю…
При этом в админке если проверять заказ, то там данные верны (имя записывает то, что указано, если почта уникальный — создается новый пользователь, если почта уже есть в базе, то цепляется к существующему пользователю).
Как так происходит не понимаю…
Ошибки в журнале есть?
ни в modx логах, ни в логах php ошибок в процессе формирования не возникает (только что проверил и под гостем и под админом).
В логах проскакивают ошибки и notice, но они связаны с другими страницами, модулями и возникают совершенно в другие временные эпизоды.
В логах проскакивают ошибки и notice, но они связаны с другими страницами, модулями и возникают совершенно в другие временные эпизоды.
Тогда выход один логгировать процесс.
подскажите, как это сделать
$this->modx->log(1, print_r($data,1))
Так можно вывести в журнал ошибок необходимые данные. проверять нужно работу методов submit() и getCustomerId()
а, об этом речь, думал какое-то еще логирование)
проверил эти два метода — там всё ок.
Отложил процесс покупки, проблема именно в получении объекта
Что за id и order_id?
проверил эти два метода — там всё ок.
Отложил процесс покупки, проблема именно в получении объекта
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?
Что за id и order_id?order_id — идентификатор заказа
id — идентификатор адреса
ниже мой коммент с решением проблемы.
идентификатор адреса — что-то странное, не очень понял где и как он используется… Но получается, что проблема в модуле, неправильно там написан запрос, оттуда и вся возня на два дня… (
идентификатор адреса — что-то странное, не очень понял где и как он используется… Но получается, что проблема в модуле, неправильно там написан запрос, оттуда и вся возня на два дня… (
проблема решилась изменением запроса, а именно
было
было
$user = $this->modx->getObject('msOrderAddress', $order_id);
сделал$user = $this->modx->getObject('msOrderAddress', ['order_id' => $order_id]);
Привет! В минишопе раньше была бага(или фича), связанная с привязкой юзера по НОМЕРУ ТЕЛЕФОНА, если его вводить в форму заказа. То есть, если вводишь новый email, а телефон использован у ранее зареганого юзера, то заказ прикрепится к этому юзеру, а не зарегает нового.
Сам нарывался на это, нужно было в файле минишопа закомментить пару строк, но в каком — сейчас не вспомню. Может, опытные товарищи подскажут?
Возможно, этот момент уже пофиксил в новых версиях минишопа, не знаю… но раньше точно была такая проблема
Сам нарывался на это, нужно было в файле минишопа закомментить пару строк, но в каком — сейчас не вспомню. Может, опытные товарищи подскажут?
Возможно, этот момент уже пофиксил в новых версиях минишопа, не знаю… но раньше точно была такая проблема
Возможно, этот момент уже пофиксил в новых версиях минишопа, не знаюНет, не пофиксили, так как это не баг. Поиск пользователя происходит по username, email и modilephone.
Понятное дело, что это сделано из благих побуждений. Но в случае, если заказ на сайте совершают несколько менеджеров из одной компании, у которых разные email, но один телефон на всех, это может быть проблемой. Так как уникальным полем для регистрации в основном служит email.
А почему менеджеры не могут указывать разные номера?
Мы немного уходим в сторону от темы топика)) Но все же рискну завершить оффтоп: мне кажется немного странной логика, в которой определяется привязка пользователя к заказу по неуникальному полю. Юзернейм и емайл — по умолчанию уникальные поля для пользователя в MODX, телефон — нет. То есть, в принципе есть вероятность прикрепления не к тому юзеру, разве нет?
Бывает, что уникальным полем для регистрации пользователя служит телефон, для этого случая — как вариант — можно добавить в настройки минишопа опцию, которая включает поиск зарегистрированного юзера по номеру телефона из формы заказа.
Бывает, что уникальным полем для регистрации пользователя служит телефон, для этого случая — как вариант — можно добавить в настройки минишопа опцию, которая включает поиск зарегистрированного юзера по номеру телефона из формы заказа.
Юзернейм и емайл — по умолчанию уникальные поля для пользователя в MODX, телефон — нет.С точки зрения Modx всё так, но с точки зрения человека телефон уникален, так как служит для с связи с кем-то конкретным больница, другой человек, организация.
можно добавить в настройки минишопа опцию, которая включает поиск зарегистрированного юзера по номеру телефонаДобавь. miniShop2 это проект с открытым исходным кодом. Пришли PR и всё появится.
github.com/modx-pro/miniShop2/issues/440 — иссушка давно уже есть
спасибо за инфу, но нет, не в этом проблема)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.