Làm thế nào để xác minh một số điện thoại qua tin nhắn SMS
Vietnamese (Tiếng Việt) translation by Giang Nam (you can also view the original English article)






Giới thiệu
Trong bài trước, tôi đã viết về việc chuẩn bị các ứng dụng của bạn cho tin nhắn SMS bằng cách sử dụng Twilio, một dịch vụ nhắn tin thông dụng. Trong bài hướng dẫn ngày hôm nay, tôi sẽ chỉ cho bạn làm thế nào để xác minh số điện thoại người dùng trước khi gửi đi một số lượng lớn tin nhắn văn bản và tối ưu hóa chi phí của bạn.
Trước khi chúng ta bắt đầu, tôi muốn khuyến khích bạn gửi câu hỏi và phản hồi trong phần bình luận. Nếu bạn muốn theo dõi các bài hướng dẫn và các dịch vụ khác trong tương lại của tôi trên Envato Tuts +, xin vui lòng truy cập vào trang hướng dẫn của tôi hoặc theo dõi @lookahead_io.
Phác thảo quá trình
Sau khi người sử dụng cung cấp số điện thoại của họ, chúng ta muốn thực hiện một số bước đơn giản:
- Tạo ra một mã bốn chữ số duy nhất.
- Lưu trữ số di động của khách hàng và mã bốn chữ số trong cơ sở dữ liệu của chúng ta (hoặc mã hóa các mã như là một biểu mẫu ẩn biến trên trang).
- Gửi một văn bản chưa được xác minh với mã bốn chữ số.
- Hiển thị một hình thức yêu cầu người dùng cung cấp mã họ nhận được.
- Kiểm tra sự phù hợp của các mã.
- Chỉ định số điện thoại như xác minh trong cơ sở dữ liệu.
Trang liên hệ người sử dụng
Trong Meeting Planner, mỗi người dùng có thể thêm nhiều phương pháp liên lạc, ví dụ như Skype, điện thoại, vv. Mỗi số di động phải được kiểm chứng để có thể sử dụng dịch vụ tin nhắn SMS thông báo.
Dòng thứ ba dưới đây cho thấy một hộp đánh dấu mà họ có thể nhấp chuột để yêu cầu xác minh:



Nhấn vào đó sẽ chuyển người dùng tới các bộ điều khiển actionVerify() dưới đây; lưu ý rằng nó đưa họ vào khối else trước tiên bởi vì họ đã không được gửi một mã số:
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 |
}
|
Phương pháp canRequest() kiểm tra nếu người dùng yêu cầu mã liên tục hoặc quá thường xuyên:
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 |
}
|
Tôi khiến họ chờ đợi một phút giữa các nỗ lực để giảm lạm dụng.
Truyền mã xác minh
Nếu được phép, nó gọi hàm 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 |
}
|
Hàm này thực hiện như sau:
- Tạo ra một mã bốn chữ số ngẫu nhiên.
- Nó ghi lại thời điểm cuối cùng theo thời gian (giây unix) yêu cầu thực hiện xác minh.
- Nó làm gia tăng các nỗ lực xác minh cho số này.
- Và nó lưu trữ tất cả điều này trong cơ sở dữ liệu.
- Sau đó, nó truyền một văn bản với các mã trông giống như hình dưới đây.



Sau khi yêu cầu mã, lưu nó trong cơ sở dữ liệu ẩn và truyền mã cho người dùng, nó tải các biểu mẫu sau đây để yêu cầu mã:



Xác minh mã
Khi người dùng cố gắng gửi một mã số, nó chạy phần phía trên của 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 |
}
|
Nó sẽ kiểm tra các mã phù hợp. Nếu tìm thấy mã phù hợp, nó cập nhật cơ sở dữ liệu để phản ánh số đã được xác minh. Và nó thông báo với người sử dụng:



Nếu không, nó sẽ hiển thị một thông báo lỗi:



Hãy tự thử làm
Nếu bạn muốn nhìn thấy điều này theo từng bước làm, bạn có thể đăng ký tại Simple Planner hoặc Meeting Planner (bạn có thể dễ dàng đăng nhập với một tài khoản mạng xã hội như Facebook hoặc Google) và thêm một số điện thoại. Sau đó nhấn dấu chọn trong danh sách mà bạn sẽ thấy. Thế là xong.
Kết thúc
Rõ ràng, nếu ứng dụng của bạn gửi nhiều tin nhắn văn bản thì khoản chi phí sẽ là khá đáng kể, và bạn muốn hạn chế sự lạm dụng. Hãy bắt đầu với việc thiết lập tường lửa đối với các số điện thoại không hợp lệ- hoặc số điện thoại hợp lệ nhưng không thực sự thuộc sở hữu của người mạo danh.
Tôi hy vọng bạn thấy điều này hữu ích. Nếu bạn có bất kỳ thắc mắc hoặc gợi ý, xin vui lòng đăng tải trong phần bình luận. Nếu bạn muốn theo dõi các bài hướng dẫn khác tiếp theo của tôi trên Envato Tuts +, xin vui lòng truy cập vào trang hướng dẫn của tôi hoặc theo dõi @lookahead_io. Hãy xem loạt bài khởi động và Meeting Planner của tôi.



