Отправка пароля пользователю при оформлении заказа

Здравствуйте!
Необходимо осуществить отправку пароля пользователю при оформлении заказа в 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? Я не смог разобраться точно…

Никто не реализовывал отправку пароля при офрмлении заказа незареганным пользователем? Может у кого-то есть идеи?
Игорь Козлов
28 февраля 2014, 14:04
modx.pro
5
2 823
+1

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

Rоман Роман
28 февраля 2014, 23:20
0
а может в это место повесить runProcessor(/security/user/update) со сменой пароля и высылкой его юзеру? Не пробовал, только сейчас в голову пришло. И у тебя md5 идет от rand() — что вернет тебе хэш от 8ми символов, а проверка пароля должна вроде как еще использует salt
    Игорь Козлов
    04 марта 2014, 16:40
    0
    А как можно нужно использовать salt? Простите, не разбираюсь в этом…
    Игорь Козлов
    04 марта 2014, 17:12
    0
    Сделал следующим образом, может кому-то пригодится.
    Правил файл /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;
    	}
    Наверняка есть лишние моменты, но пример рабочий.
      Илья Уткин
      04 марта 2014, 17:18
      0
      Для вашего алгоритма код будет выглядеть так:

      $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();

      Только еще нужно где-то отмечать, что пароль пользователю выслан, чтобы ему после каждого изменения статуса новый пароль не устанавливать.
        Андрей
        Андрей
        24 декабря 2014, 01:30
        0
        Илья, первые 8 строк кода можно заменить таким:
        $pass = $user->generatePassword();
        по умолчанию генерит пароль в 10 символов.
        Естественно, код будет работать только после этого:
        $user = $modx->getObject('modUser', $order->get('user_id'));
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        5