Подтверждение телефона по SMS

Подтверждение телефона по SMS

От автора: статья из серии уроков создай свой стартап с помощью PHP. В предыдущем эпизоде я рассказал о подготовке приложения к рассылке SMS с помощью популярного текстового сервиса Twilio. В сегодняшнем уроке я покажу вам, как подтвердить телефон перед отсылкой текста большого объема, чтобы снизить затраты.

Что вы создадите

Подтверждение телефона по SMS

Обговариваем процесс

После того, как пользователь оставит свой номер телефона, нам необходимо выполнить ряд простых шагов:

сгенерировать уникальный код из четырех цифр;

записать номер телефона и этот код в базу данных (или зашифровать код локально в виде скрытой переменной формы на странице);

отослать текст с кодом на неподтвержденный номер;

показать форму с запросом на ввод полученного кода;

проверить совпадение кодов;

обозначить номер телефона в базе данных как подтвержденный.

Контактная страница пользователя

На сайте Meeting Planner каждый пользователь может добавить несколько способов связи, т.е. Skype, телефон и т.д. Каждый телефонный номер необходимо подтвердить для использования SMS уведомлений.

В третьей строке снизу отображается галочка, на которую можно нажать, чтобы запросить подтверждение:

Подтверждение телефона по SMS

Клик по галочке перенаправляет пользователя в контроллер actionVerify() ниже. Обратите внимание, что первый раз пользователь попадет в блок else, так как он еще не отправил код подтверждения:

public function actionVerify($id)
{
    $model = $this->findModel($id);
    if ($model->load(Yii::$app->request->post())) {
    ...
    } else {
      $canRequest = $model->canRequest();
      if ($canRequest) {
        // посылаем текст на этот номер
        $model->requestCode();
        return $this->render('verify', [
            'model' => $model,
        ]);
      } else {
        Yii::$app->getSession()->setFlash('error', $canRequest);
        return $this->redirect(['/user-contact']);
      }
    }
}

Метод canRequest() проверяет запрос кода на повторность и частоту:

public function canRequest() {
    if ($this->request_count<UserContact::MAX_REQUEST_COUNT) {
      if (time() - $this->requested_at>=60) {
        return true;
      } else {
          return Yii::t('frontend','Sorry, you must wait a minute between requests.');
      }
    } else {
      return Yii::t('frontend','You have exceeded the maximum number of attempts.');
    }
  }

Чтобы не злоупотреблять, я поставил задержку в одну минуту.

Передача кода подтверждения

Если есть разрешение, вызывается requestCode():

public function requestCode() {
    $this->verify_code = rand(0,9999);
    $this->requested_at = time();
    $this->request_count+=1;
    $this->update();
    $sms = new Sms;
    $sms->transmit($this->info,Yii::t('frontend',
        'Please return to the site and type in {code}',['code'=>sprintf("%04d",$this->verify_code)]));
  }

Код делает следующее:

генерирует случайное четырехзначное число;

записывает текущее время (в юникс секундах) запроса;

инкрементирует попытки подтверждения для этого номера телефона;

записывает все в базу данных;

передает текст с кодом, как показано на изображении ниже.

Подтверждение телефона по SMS

После запроса кода, сохранения в базе данных и передачи кода пользователю загружается следующая форма, где необходимо ввести отправленный код:

Подтверждение телефона по SMS

Подтверждение кода

Когда пользователь пытается отправить код, запускается верхняя часть actionVerify():

public function actionVerify($id)
{
    $model = $this->findModel($id);
    if ($model->load(Yii::$app->request->post())) {
        // display verification form
        $model->verify = Yii::$app->request->post()['UserContact']['verify'];
        if (strval($model->verify_code) == strval($model->verify)) {
          $model->status = UserContact::STATUS_VERIFIED;
          $model->update();
          Yii::$app->getSession()->setFlash('success',Yii::t('frontend','Thank you, your number is confirmed.'));
          return $this->redirect(['/user-contact']);
        } else {
            Yii::$app->getSession()->setFlash('error', Yii::t('frontend','Sorry, that is incorrect. Please request a new code.'));
            return $this->redirect(['/user-contact']);
        }
    } else {
      ...
    }
}

Коды проверяются на совпадение. Если коды совпадают, база данных обновляется, и телефон становится подтвержденным. А пользователь получает сообщение:

Подтверждение телефона по SMS

Если коды не совпадают, появляется сообщение об ошибке:

Подтверждение телефона по SMS

Попробуйте

Хотите посмотреть все в действии, зарегистрируйтесь на Simple Planner или Meeting Planner (что легко сделать с помощь аккаунта в социальных сетях типа Facebook или Google) и добавьте номер телефона. Затем кликните на галочку в списке, и все.

Заключение

Всем понятно, что если ваше приложение отправляет много текстовых сообщений, это сильно бьет по кошельку. Вы бы хотели ограничить эту возможность. Для начала можно установить фаервол на неправильные номера, а также на валидные, но которые не принадлежат мошенникам.

Автор: Jeff Reifman

Источник: https://code.tutsplus.com/

Редакция: Команда webformyself.

Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Хотите изучить ООП PHP?

Прямо сейчас посмотрите курс по объектно-ориентированному программированию на PHP (ООП PHP)!

Смотреть курс

Метки:

Комментарии Вконтакте:

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree