регистрация через смс

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
ya sergei
Сообщения: 21
Зарегистрирован: 2015.03.19, 23:01

регистрация через смс

Сообщение ya sergei »

Доброго времени суток. Помогите новичку сделать регистрацию через смс.
1 - пользователь вводит номер телефон
2 - генерируется пароль и высылается на введенный номер
3 - проверяется пароль, если проверку проходит то заносим в базу
Так вот вопрос, как лучше и правильно будет организовать эти действия?
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: регистрация через смс

Сообщение kawabanga »

Так и организовывайте. в чем вопрос то?

Генерируйте код генератором.
Отсылайте смс отсылатором.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: регистрация через смс

Сообщение yan »

> 3 - проверяется пароль, если проверку проходит то заносим в базу
какой-то странный пункт - просто генерируем пароль, сразу сохраняем в базу и отправляем в смс, дальше если вошел значит телефон верный.
или вопрос все таки не про регистрацию, а про добавление номера телефона к существующему аккаунту?
ya sergei
Сообщения: 21
Зарегистрирован: 2015.03.19, 23:01

Re: регистрация через смс

Сообщение ya sergei »

Сделал так.
контроллер

Код: Выделить всё

public function actionReg()
    {
        
        $model = new RegForm();
        
        if ($model->load(Yii::$app->request->post()) && $model->validate()):
            if ($user = $model->reg()):
                if ($user->status === User::STATUS_ACTIVE):
                    if (Yii::$app->getUser()->login($user)):
                        
                        return $this->goHome();
                                                
                    endif;
                endif;
            else:
                Yii::$app->session->setFlash('error', 'Возникла ошибка при регистрации.');
                Yii::error('Ошибка при регистрации');
                return $this->refresh();
            endif;
        endif;
        
        return $this->render(
            'reg',
            [
                'model' => $model
            ]
        );         
    } 
модель

Код: Выделить всё

 public function reg()
    {
        $user = new User();
        $user->username = $this->username;
        $user->pnumber = $this->pnumber;
        $user->status = $this->status;
        $user->setPass;
        $user->generateAuthKey();
        
        return $user->save() ? $user : null;
    }
вид

Код: Выделить всё

  <?php $form = ActiveForm::begin(); ?>

        <?= $form->field($model, 'username') ?>
        <?= $form->field($model, 'pnumber') ?>
    
        <div class="form-group">
            <?= Html::submitButton('Войти', ['class' => 'btn btn-primary']) ?>
        </div>
        
    <?php ActiveForm::end(); ?>
Все выполняется, и данные заносятся в бд. А вот где и как нужно осуществить проверку - не соображу.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: регистрация через смс

Сообщение yan »

> нужно осуществить проверку
проверку чего? :)
ya sergei
Сообщения: 21
Зарегистрирован: 2015.03.19, 23:01

Re: регистрация через смс

Сообщение ya sergei »

yan писал(а):> нужно осуществить проверку
проверку чего? :)
не правильно выразился, необходимо отправить сообщение с паролем, запросить этот пароль у пользователя и произвести его проверку
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: регистрация через смс

Сообщение Nerf »

Вы не можете свести регистрацию с "предпроверкой" к регистрации с последующим подтверждением(как с email)? Если нет, то вам нужно решить, как связывать данные(ключ) с незарегистрированным пользователем, чтобы потом проверить при отправке формы.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: регистрация через смс

Сообщение yan »

> запросить этот пароль у пользователя и произвести его проверку
разве это не просто пароль для входа? зачем еще какой-то дополнительный пароль придумывать? а если этот просто пароль для входа то после отправки просто показываем форму входа
ya sergei
Сообщения: 21
Зарегистрирован: 2015.03.19, 23:01

Re: регистрация через смс

Сообщение ya sergei »

Регистрация производится следующим путем.
Пользователь в форме вводит имя и номер телефона, по этим данным генерируется смс-пароль. Имя, номер телефона и смс-пароль вносятся в бд, а пользователю отправляется смс с смс-паролем. После ввода пароля сравнивается смс-пароль и введенный пароль, если все хорошо то идем на главную, если нет то обратно к вводу имени и номера телефона.
Я это пытаюсь реализовать так.
Есть две модели RegForm и ConfirmForm

Код: Выделить всё

<?php
namespace app\models;

use yii\base\Model;
use yii;

class RegForm extends Model{
    
    public $username;
    public $pnumber;
    public $status;
    
    public function rules(){
        return[
            [['username', 'pnumber'], 'filter', 'filter' => 'trim'],
            [['username', 'pnumber'], 'required'],
            [['username'], 'string', 'min' => 2, 'max' => 25],
            ['username', 'unique', 'targetClass' => User::className(),
                'message' => 'Это имя уже занято.'],
            ['pnumber', 'unique', 'targetClass' => User::className(),
                'message' => 'Этот номер уже занят.'],
            ['status', 'default', 'value' => User::STATUS_ACTIVE, 'on' => 'default'],
            ['status', 'in', 'range' =>[
                User::STATUS_NOT_ACTIVE,
                User::STATUS_ACTIVE
            ]]
            
        ];
    }
    
    public function attributeLabels()
    {
        
        return[
            'username' => 'Имя пользователя',
            'pnumber' => 'Номер телефона'
        ];
    }
    
    public function reg()
    {
        $user = new User();
        $user->username = $this->username;
        $user->pnumber = $this->pnumber;
        $user->status = $this->status;
        $user->setPass($this->pnumber);
        $user->generateAuthKey();
        
        return $user->save() ? $user : null;
    }
    
}


?>

Код: Выделить всё

<?php
namespace app\models;

use yii\base\Model;
use yii;

class ConfirmForm extends Model{
    
    public $pass;
    
    public function rules(){
        return[
            [['pass'], 'required'],
            ['pass', 'validatePass']
        ];
    }
    
    public function validatePass($attribute)
    {
        if (!$this->hasErrors()):
            if ($this->pass != '111'):
                $this->addError($attribute, 'Неправильный пароль.');
            endif;
        endif;  
    }
    
    public function attributeLabels()
    {        
        return[
            'pass' => 'Пароль',       
        ];
    }
    
    public function confirm()
    {        
       if ($this->validate()):
            return true;
        else:
            return false;
       endif;
    }
    
}





?>
Контроллер

Код: Выделить всё

<?php
namespace app\controllers;

use Yii;
use app\models\RegForm;
use app\models\ConfirmForm;
use app\models\User;

use yii\bootstrap\Alert;

class MainController extends \yii\web\Controller
{
    public $layout = 'basic';
    
    public function actionIndex()
    {

    }
    
    public function actionReg()
    {
        

        
        
        $model = new RegForm();
        
        if ($model->load(Yii::$app->request->post()) && $model->validate()):
            if ($user = $model->reg()):
                if ($user->status === User::STATUS_ACTIVE):
                    if (Yii::$app->getUser()->login($user)):
                        
                        
                    
                    endif;
                endif;
            else:
                Yii::$app->session->setFlash('error', 'Возникла ошибка при регистрации.');
                Yii::error('Ошибка при регистрации');
                return $this->refresh();
            endif;
        endif;
        
        return $this->render(
            'reg',
            [
                'model' => $model
            ]
        );         
    }
    
 
    
    public function actionConfirm()
    {  
        $model = new ConfirmForm();
        
        if ($model->load(Yii::$app->request->post()) && $model->confirm()):
            return $this->goHome();
        endif;

        return $this->render(
            'confirm',
           [
                'model' => $model
           ]
        );         
    }
    
    public function actionSearch($search = null){
        return $this->render(
            'search',
            ['search' => $search]
        );
    }
    
  

}
Вопрос в том как соединить два действия reg и confirm???
Аватара пользователя
Vorx
Сообщения: 14
Зарегистрирован: 2010.05.08, 10:30
Откуда: Санкт-Петербург
Контактная информация:

Re: регистрация через смс

Сообщение Vorx »

В контроллере в actionReg после регистрации пользователя, в случае если у пользователя STATUS_NOT_ACTIVE - делать redirect на confirm.
А в actionConfirm, если код неверный - redirect на 'reg'.
Либо на одной странице вывести обе формы.
RegForm отправлять ajax-ом и выводить сообщение об отправленной смс.
ConfirmForm тоже отправлять ajax-ом. Если код верный - redirect куда надо, если нет - выводим сообщение об ошибке.
ya sergei
Сообщения: 21
Зарегистрирован: 2015.03.19, 23:01

Re: регистрация через смс

Сообщение ya sergei »

Vorx писал(а):В контроллере в actionReg после регистрации пользователя, в случае если у пользователя STATUS_NOT_ACTIVE - делать redirect на confirm.
А в actionConfirm, если код неверный - redirect на 'reg'.
Либо на одной странице вывести обе формы.
RegForm отправлять ajax-ом и выводить сообщение об отправленной смс.
ConfirmForm тоже отправлять ajax-ом. Если код верный - redirect куда надо, если нет - выводим сообщение об ошибке.
Огромное спасибо, все работает!!!
PS извиняюсь за нелогичность своих мыслей, просто только начал изучать Yii
Ответить