() translation by (you can also view the original English article)



Introduction
Dans l'épisode précédent, j'ai écrit sur la préparation de votre demande de SMS en utilisant Twilio, un service de messagerie couramment utilisé. Dans le tutoriel d'aujourd'hui, je vais vous montrer comment vérifier les numéros de téléphone des utilisateurs avant de transmettre un volume élevé de messages et d'augmenter vos coûts.
Avant de commencer, je tiens à vous encourager à poster des questions et commentaires dans les commentaires. Si vous désirez suivre mes futures tutoriaux Envato Tuts + et d'autres séries, veuillez visiter ma page d'instructeur ou suivez @lookahead_io.
Décrire le processus
Après que l'utilisateur a fourni son numéro de téléphone, nous voulons effectuer une poignée d'étapes simples:
- Générez un code unique à quatre chiffres.
- Stockez leur numéro de cellule et le code à quatre chiffres dans notre base de données (ou chiffrer le code localement comme une variable de formulaire cachée sur la page).
- Envoyez un message au numéro non vérifié avec le code à quatre chiffres.
- Affichez un formulaire demandant à l'utilisateur de fournir le code qu'il a reçu.
- Vérifiez que les codes correspondent.
- Désignez le numéro tel que vérifié dans la base de données.
La page de contact de l'utilisateur
Dans Meeting Planner, chaque utilisateur peut ajouter plusieurs méthodes de contact, ex. Skype, téléphone, etc. Chaque numéro de cellule doit être vérifié pour être utilisé pour les notifications par SMS.
La troisième ligne ci-dessous montre une coche dont ils peuvent cliquer pour demander la vérification:



Cliquez sur ce bouton pour transférer l'utilisateur vers le contrôleur actionVerify()
ci-dessous; notez qu'il les emmène dans le bloc else
d'abord parce qu'ils n'ont pas encore soumis de code:
1 |
public function actionVerify($id) |
2 |
{
|
3 |
$model = $this->findModel($id); |
4 |
if ($model->load(Yii::$app->request->post())) { |
5 |
...
|
6 |
} else { |
7 |
$canRequest = $model->canRequest(); |
8 |
if ($canRequest) { |
9 |
// send a text to this number
|
10 |
$model->requestCode(); |
11 |
return $this->render('verify', [ |
12 |
'model' => $model, |
13 |
]);
|
14 |
} else { |
15 |
Yii::$app->getSession()->setFlash('error', $canRequest); |
16 |
return $this->redirect(['/user-contact']); |
17 |
}
|
18 |
}
|
19 |
}
|
La méthode canRequest()
vérifie si les codes demandés sont répétés ou trop fréquents:
1 |
public function canRequest() { |
2 |
if ($this->request_count<UserContact::MAX_REQUEST_COUNT) { |
3 |
if (time() - $this->requested_at>=60) { |
4 |
return true; |
5 |
} else { |
6 |
return Yii::t('frontend','Sorry, you must wait a minute between requests.'); |
7 |
}
|
8 |
} else { |
9 |
return Yii::t('frontend','You have exceeded the maximum number of attempts.'); |
10 |
}
|
11 |
}
|
Je les fais attendre une minute entre les tentatives de réduire les abus.
Transmettre le code de vérification
Si elle est autorisée, elle appelle requestCode()
:
1 |
public function requestCode() { |
2 |
$this->verify_code = rand(0,9999); |
3 |
$this->requested_at = time(); |
4 |
$this->request_count+=1; |
5 |
$this->update(); |
6 |
$sms = new Sms; |
7 |
$sms->transmit($this->info,Yii::t('frontend', |
8 |
'Please return to the site and type in {code}',['code'=>sprintf("%04d",$this->verify_code)])); |
9 |
}
|
Voici ce qui suit:
- Génère un code aléatoire à quatre chiffres.
- Il enregistre le dernier moment dans le temps (unix secondes) qu'une demande de vérification a été faite.
- Il augmente les tentatives de vérification pour ce nombre.
- Et il stocke tout cela dans la base de données.
- Ensuite, il transmet un message avec le code qui ressemble à l'image ci-dessous.



Après avoir demandé le code, enregistrez le dans la base de données en arrière-plan et transmettez le code à l'utilisateur, il charge le formulaire suivant en demandant le code:



Vérification du code
Lorsque l'utilisateur tente de soumettre un code, il exécute la partie supérieure de l'actionVerify()
:
1 |
public function actionVerify($id) |
2 |
{
|
3 |
$model = $this->findModel($id); |
4 |
if ($model->load(Yii::$app->request->post())) { |
5 |
// display verification form |
6 |
$model->verify = Yii::$app->request->post()['UserContact']['verify']; |
7 |
if (strval($model->verify_code) == strval($model->verify)) { |
8 |
$model->status = UserContact::STATUS_VERIFIED; |
9 |
$model->update(); |
10 |
Yii::$app->getSession()->setFlash('success',Yii::t('frontend','Thank you, your number is confirmed.')); |
11 |
return $this->redirect(['/user-contact']); |
12 |
} else { |
13 |
Yii::$app->getSession()->setFlash('error', Yii::t('frontend','Sorry, that is incorrect. Please request a new code.')); |
14 |
return $this->redirect(['/user-contact']); |
15 |
}
|
16 |
} else { |
17 |
...
|
18 |
}
|
19 |
}
|
Il vérifie que les codes correspondent. Si elles le font, il met à jour la base de données pour refléter le nombre a été vérifié. Et il dit à l'utilisateur:



Sinon, il affiche un message d'erreur:



Essayez-le vous-même
Si vous voulez voir cela en action, vous pouvez vous inscrire à Simple Planner ou Meeting Planner (ce qui est facile avec un compte social comme Facebook ou Google) et ajoutez un numéro de téléphone. Cliquez ensuite sur la coche dans la liste que vous verrez. C'est tout.
Finissons-en
Évidemment, si votre application envoie beaucoup de messages, c'est un coût notable de l'entreprise, et vous voulez limiter les abus. Cela commence par la mise en place d'un pare-feu contre des numéros invalides—ou des nombres valides qui ne sont pas réellement la propriété de l'imposteur.
J'espère que vous avez trouvé cela utile. Si vous avez des questions ou des suggestions, veuillez les poster dans les commentaires. Si vous désirez suivre mes futures tutoriaux Envato Tuts + et d'autres séries, veuillez visiter ma page d'instructeur ou suivez @lookahead_io. Certainement vérifiez ma série de démarrage et Meeting Planner.