От автора: статья из серии уроков создай свой стартап с помощью PHP. В предыдущем эпизоде я рассказал о подготовке приложения к рассылке SMS с помощью популярного текстового сервиса Twilio. В сегодняшнем уроке я покажу вам, как подтвердить телефон перед отсылкой текста большого объема, чтобы снизить затраты.
Что вы создадите
Обговариваем процесс
После того, как пользователь оставит свой номер телефона, нам необходимо выполнить ряд простых шагов:
сгенерировать уникальный код из четырех цифр;
записать номер телефона и этот код в базу данных (или зашифровать код локально в виде скрытой переменной формы на странице);
отослать текст с кодом на неподтвержденный номер;
показать форму с запросом на ввод полученного кода;
проверить совпадение кодов;
обозначить номер телефона в базе данных как подтвержденный.
Контактная страница пользователя
На сайте Meeting Planner каждый пользователь может добавить несколько способов связи, т.е. Skype, телефон и т.д. Каждый телефонный номер необходимо подтвердить для использования SMS уведомлений.
В третьей строке снизу отображается галочка, на которую можно нажать, чтобы запросить подтверждение:
Клик по галочке перенаправляет пользователя в контроллер actionVerify() ниже. Обратите внимание, что первый раз пользователь попадет в блок else, так как он еще не отправил код подтверждения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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() проверяет запрос кода на повторность и частоту:
1 2 3 4 5 6 7 8 9 10 11 |
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():
1 2 3 4 5 6 7 8 9 |
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)])); } |
Код делает следующее:
генерирует случайное четырехзначное число;
записывает текущее время (в юникс секундах) запроса;
инкрементирует попытки подтверждения для этого номера телефона;
записывает все в базу данных;
передает текст с кодом, как показано на изображении ниже.
После запроса кода, сохранения в базе данных и передачи кода пользователю загружается следующая форма, где необходимо ввести отправленный код:
Подтверждение кода
Когда пользователь пытается отправить код, запускается верхняя часть actionVerify():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 { ... } } |
Коды проверяются на совпадение. Если коды совпадают, база данных обновляется, и телефон становится подтвержденным. А пользователь получает сообщение:
Если коды не совпадают, появляется сообщение об ошибке:
Попробуйте
Хотите посмотреть все в действии, зарегистрируйтесь на Simple Planner или Meeting Planner (что легко сделать с помощь аккаунта в социальных сетях типа Facebook* или Google) и добавьте номер телефона. Затем кликните на галочку в списке, и все.
Заключение
Всем понятно, что если ваше приложение отправляет много текстовых сообщений, это сильно бьет по кошельку. Вы бы хотели ограничить эту возможность. Для начала можно установить фаервол на неправильные номера, а также на валидные, но которые не принадлежат мошенникам.
Автор: Jeff Reifman
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.
* Признана экстремистской организацией и запрещена в Российской Федерации.