Підтвердження телефону по SMS

42

Від автора: стаття з серії уроків створи свій стартап за допомогою 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_countrequested_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) і додайте номер телефону. Потім клікніть на галочку в списку, і все.

Висновок

Всім зрозуміло, що якщо ваш додаток відправляє багато текстових повідомлень, це сильно б’є по гаманцю. Ви б хотіли обмежити цю можливість. Для початку можна встановити фаєрвол на неправильні номери, а також на валідні, але які не належать шахраям.