Отправка пароля пользователю при оформлении заказа
Здравствуйте!
Необходимо осуществить отправку пароля пользователю при оформлении заказа в minishop2. По умолчанию такого функционала нет, в связи с чем менял класс minishop2.class.php, указав
Никто не реализовывал отправку пароля при офрмлении заказа незареганным пользователем? Может у кого-то есть идеи?
Необходимо осуществить отправку пароля пользователю при оформлении заказа в minishop2. По умолчанию такого функционала нет, в связи с чем менял класс minishop2.class.php, указав
$pass=rand();
$user = $this->modx->newObject('modUser', array('username' => $email, 'password' => md5($pass)));
$profile = $this->modx->newObject('modUserProfile', array('email' => $email, 'fullname' => $order['receiver'],'mobilephone'=>$pass));
Тоесть, по сути, сохранял пароль в профиле пользователя в открытом виде. Это, конечно, плохо, но собирался повесить плагин на msOnCreateOrder, который бы сразу при отправке письма этот пароль стер из профиля. Но при попытке войти с данным паролем, выскакиеват сообщение что неправильны пароль. Может это из-за того, что хеш-класс пользователя modPBKDF2, а пароль шифруется в md5? Я не смог разобраться точно…Никто не реализовывал отправку пароля при офрмлении заказа незареганным пользователем? Может у кого-то есть идеи?
Комментарии: 5
а может в это место повесить runProcessor(/security/user/update) со сменой пароля и высылкой его юзеру? Не пробовал, только сейчас в голову пришло. И у тебя md5 идет от rand() — что вернет тебе хэш от 8ми символов, а проверка пароля должна вроде как еще использует salt
А как можно нужно использовать salt? Простите, не разбираюсь в этом…
Сделал следующим образом, может кому-то пригодится.
Правил файл /core/components/minishop2/model/minishop2/minishop2.class.php, функция getCustomerId теперь выглядит следующим образом:
Правил файл /core/components/minishop2/model/minishop2/minishop2.class.php, функция getCustomerId теперь выглядит следующим образом:
public function getCustomerId() {
$order = $this->order->get();
if (empty($order['email'])) {return false;}
if ($this->modx->user->isAuthenticated()) {
$profile = $this->modx->user->Profile;
if (!$email = $profile->get('email')) {
$profile->set('email', $order['email']);
$profile->save();
}
$uid = $this->modx->user->id;
}
else {
/* @var modUser $user */
$email = $order['email'];
if ($user = $this->modx->getObject('modUser', array('username' => $email))) {
$uid = $user->get('id');
}
else {
$pass=rand();
$user = $this->modx->newObject('modUser', array('username' => $email, 'password' => md5($pass)));
$profile = $this->modx->newObject('modUserProfile', array('email' => $email, 'fullname' => $order['receiver']));
$user->addOne($profile);
$user->set('password', $pass);
$user->save();
$url=$this->modx->getOption('site_url');
$name=$this->modx->getOption('site_name');
$subjectTheme='Вы зарегистрировались на сайте '.$name;
$bodyTheme='<html><body><p>Здравствуйте, '.$order['receiver'].'!</p><p>Сделав заказ, вы зарегистрировались на сайте <a href="'.$url.'">'.$name.'</a>. Ваши данные для входа:</p><p>Логин: '.$email.'</p><p>Пароль: '.$pass.'</p></body></html>';
$this->sendEmail($email, $subjectTheme, $bodyTheme);
if ($groups = $this->modx->getOption('ms2_order_user_groups', null, false)) {
$groups = array_map('trim', explode(',', $groups));
foreach ($groups as $group) {
$user->joinGroup($group);
}
}
$uid = $user->get('id');
}
}
return $uid;
}
Наверняка есть лишние моменты, но пример рабочий.
Для вашего алгоритма код будет выглядеть так:
Но лучше, конечно, создать плагин на событие, например, msOnChangeOrderStatus:
Только еще нужно где-то отмечать, что пароль пользователю выслан, чтобы ему после каждого изменения статуса новый пароль не устанавливать.
$pass=md5(rand());
$user = $this->modx->newObject('modUser', array('username' => $email, 'password' => $pass));
$profile = $this->modx->newObject('modUserProfile', array('email' => $email, 'fullname' => $order['receiver'],'mobilephone'=>$pass));
Но лучше, конечно, создать плагин на событие, например, msOnChangeOrderStatus:
// Генерируем пароль
$count_ch = 10;
$pass = '';
$accepted = '0987654321zyxwvutsrqponmlkjihgfedcba';
srand(((int)((double)microtime()*1000000)));
for ($i=0; $i<=$count_ch; $i++) {
$random = rand(0, (strlen($accepted) -1));
$pass .= $accepted[$random];
}
// Устанавливаем пароль пользователю
$user = $modx->getObject('modUser', $order->get('user_id'));
$user->set('password',$pass);
$user->save();
// Меняем текст письма пользователю
$status = $modx->getObject('msOrderStatus', array('id' => $status, 'active' => 1));
$body = $status->get('body_user');
$body .= '<p>Ваш пароль для входа на сайт: '.$pass.'</p>';
$status->set('body_user', $body);
$status->save();
Только еще нужно где-то отмечать, что пароль пользователю выслан, чтобы ему после каждого изменения статуса новый пароль не устанавливать.
Илья, первые 8 строк кода можно заменить таким:
Естественно, код будет работать только после этого:
$pass = $user->generatePassword();
по умолчанию генерит пароль в 10 символов.Естественно, код будет работать только после этого:
$user = $modx->getObject('modUser', $order->get('user_id'));
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.