احراز هویت کاربر با شماره موبایل همراه و SMS راهی سریع و موثر است که بطور عمومی بیشتر در نرم افزار های موبایل و سیستم های بانکی برای فعال سازی پیامکی استفاده می شود.
بنابراین ما هم می توانیم در سیستم لاگین کاربر با تایید پیامک ارسالی به کاربر حتی بدون استفاده از رمزعبور دایمی , احراز هویت با پبامک در PHP انجام بدیم.
در این آموزش PHP , قصد داریم به شما نحوه پیاده سازی تایید شماره موبایل با SMS در PHP که یک رمز یکبار مصرف (OTP) را ارسال می کند, به شما نشان بدیم.
ما از سرویس پنل پیامک (payamak-panel.com) استفاده می کنیم. که در بخش وب سرویس (API) می توانیم نمونه کدها و داکیومنت را ببنیم.
همچنین یک پنل پیامکی دیگری از sms.ir داریم که من فقط کدهای نمونه و نحوه استفاده از آن را در قالب یک مثال به همراه سورس کد این پست قرار میدم تا بتونید استفاده کنید.
توجه : بعضی از پنل های پیامکی امکان ارسال پیامک صوتی را هم دارند که خب مطمینا نرخ آنها بالاتر از SMS است.
مراحل زیر برای پیاده سازی تایید شماره موبایل با SMS در PHP دنبال خواهد شد.
- ایجاد کد اعتبارسنجی تصادفی
- ارسال کد OTP پنج رقمی به کاربر با استفاده از سرویس API پنل SMS و اضافه کردن آن به دیتابیس
- تایید کد ارسال به شماره همراه کاربر و بروزرسانی وضعیت آن در دیتابیس
- نمایش وضعیت اعتبارسنجی پیامکی به کابر
ساخت جداول دیتابیس
برای ذخیره کد یکبار مصرف (OTP) و اعتبارسنجی وضعیت, نیاز به ساخت یک جدول در دیتابیس MySQL داریم.
با کد SQL زیر می توانید جدول mobile_numbers
به همراه چند ستون ابتدایی را ببینید.
1 2 3 4 5 6 7 |
CREATE TABLE `mobile_numbers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `mobile_number` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `verification_code` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `verified` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1=Verified, 0=Not verified', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
کلاس اتصال به دیتابیس (DB.class.php)
کلاس DB
تمام عملیات مربوط به (واکشی, قرار دادن و بروزرسانی) را مه مربوط به دیتابیس است انجام می دهد
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php /* * DB Class * This class is used for database related (connect, insert, and update) operations * @author NetParadis.com * @url http://www.netparadis.com */ class DB{ private $dbHost = "localhost"; private $dbUsername = "root"; private $dbPassword = "root"; private $dbName = "netparadis"; private $tblName = "mobile_numbers"; public function __construct(){ if(!isset($this->db)){ // Connect to the database $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName); if($conn->connect_error){ die("Failed to connect with MySQL: " . $conn->connect_error); }else{ $this->db = $conn; } } } /* * Returns rows from the database based on the conditions * @param string name of the table * @param array select, where, order_by, limit and return_type conditions */ public function checkRow($conditions = array()){} /* * Insert data into the database * @param string name of the table * @param array the data for inserting into the table */ public function insert($data){} /* * Update data into the database * @param string name of the table * @param array the data for updating into the table * @param array where condition on updating data */ public function update($data,$conditions){} } |
برای دیدن تمام کدهای این کلاس لطفا از باکس دانلود, سورس کد را دریافت کنید.
توابع زیر برای fetch, insert, update اطلاعات OTP در دیتابیس استفاده شده اند.
__construct()
– اتصال و انتخاب دیتابیسcheckRow()
– بررسی می کند که آیا رکوردی مبنی بر شرط برقرار شده در جدولmobile_numbers
وجود دارد یا خیر. اگر وجود داشته باشدtrue
و در غیر اینصورتfalse
را برگشت می دهد.Insert()
– داده ها در در جدولmobile_numbers
اضافه می کند.Update()
– داده ها را بر اساس شرط, در جدولmobile_numbers
بروزرسانی می کند.
فرم احزار هویت موبایل
در ابتدا یم فرم HTML نمایش داده می شود که به کاربر اجازه ارسال شماره موبایل را می دهد. بعد از وارد کردن شماره همراه, فیلد ورودی کدی که پیامک شده است برای کاربر نمایش داده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<!-- OTP Verification form --> <!DOCTYPE> <html> <head> <title>NetParadis Verification</title> <meta charset="UTF-8"> </head> <body> <form method="post" style="direction:rtl;"> <label>شماره موبايل</label> <input type="text" placeholder="09123456789" name="mobile_no" value="<?php echo !empty($recipient_no)?$recipient_no:''; ?>" <?php echo ($otpDisplay == 1)?'readonly':''; ?>/> <?php if($otpDisplay == 1){ ?> <label>کد اعتبارسنجي</label> <input type="text" name="otp_code"/> <a href="javascript:void(0);" class="resend">ارسال مجدد</a> <?php } ?> <input type="submit" name="<?php echo ($otpDisplay == 1)?'submit_otp':'submit_mobile'; ?>" value="اعتبارسنجي"/> </form> </body> </html> |
ثبت و اعتبارسنجی کد اعتبارسنجی (OTP)
بعد از ارسال (submit) , شماره موبایل و رمزعبور یکبار مصرف توسط درگاه SMS در PHP اعتبارسنجی می شود.
sendSMS()
یک تابع سفارشی است که با آن به وب سرویس پنل پیامکی متصل و SMS را ارسال می کنیم. (آموزش ارسال SMS با PHP)- یک نمونه از کلاس
DB
را برای مدیریت عملیات مربوط به دیتابیس ایجاد می کنیم.
زمانی که شماره موبایل کاربر ثبت شد, عملیات زیر انجام می شود.
- یک کد تصادفی برای اعتبارسنجی با تابع
rand()
در PHP ایجاد می شود. - از متد
checkRow()
از کلاس DB برای بررسی اینکه آیا شماره همراه قبلا در دیتابیس وجود دارد یا خیر استفاده می کنیم. - اگر موجود بود, فقط
verification_code
را در دیتابیس با متدupdate()
در کلاسDB
آپدیت می کنیم. - اگر شماره موبایل موجود نبود, داده های OTP را با متد
insert()
از کلاس DB , در دیتابیس اضافه می کنیم. - کد OTP را توسط تابع
sendSMS()
به شماره همراه کاربر ارسال می کنیم. - اگر ارسال پیامک به کاربر موفقیت آمیز بود, فیلد ورودی OTP فعال خواهید شد.
زمانی که کد توسط کاربر وارد و ارسال شد:
- کد OTP وارد شده توسط کاربر را بررسی می کنیم که صحیح است یا خیر.
- وضعیت اعتبار سنجی کاربر در دیتابیس (فیلد
verified
) را بروزرسانی می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
<?php header("Content-Type: text/html; charset=utf-8"); require_once 'functions.php'; // Load and initialize database class require_once 'DB.class.php'; $db = new DB(); $statusMsg = $receipient_no = ''; $otpDisplay = $verified = 0; // If mobile number submitted by the user if(isset($_POST['submit_mobile'])){ if(!empty($_POST['mobile_no'])){ // Recipient mobile number $recipient_no = $_POST['mobile_no']; // Generate random verification code $rand_no = rand(10000, 99999); // Check previous entry $conditions = array( 'mobile_number' => $recipient_no, ); $checkPrev = $db->checkRow($conditions); // Insert or update otp in the database if($checkPrev){ $otpData = array( 'verification_code' => $rand_no ); $insert = $db->update($otpData, $conditions); }else{ $otpData = array( 'mobile_number' => $recipient_no, 'verification_code' => $rand_no, 'verified' => 0 ); $insert = $db->insert($otpData); } if($insert){ // Send otp to user via SMS $message = 'OTP Code : '.$rand_no; $send = sendSMS( $recipient_no, $message); $otpDisplay = 1; }else{ $statusMsg = array( 'status' => 'error', 'msg' => 'مشکلي در روند اجرا پيش آمد . بعد مجدد تلاش کتيد.' ); } }else{ $statusMsg = array( 'status' => 'error', 'msg' => 'لطفا شماره موبايل خود را وارد کنيد.' ); } // If verification code submitted by the user }elseif(isset($_POST['submit_otp']) && !empty($_POST['otp_code'])){ $otpDisplay = 1; $recipient_no = $_POST['mobile_no']; if(!empty($_POST['otp_code'])){ $otp_code = $_POST['otp_code']; // Verify otp code $conditions = array( 'mobile_number' => $recipient_no, 'verification_code' => $otp_code ); $check = $db->checkRow($conditions); if($check){ $otpData = array( 'verified' => 1 ); $update = $db->update($otpData, $conditions); $statusMsg = array( 'status' => 'success', 'msg' => 'ممنونم. شماره همراه شما با موفقيت تاييد شد.' ); $verified = 1; }else{ $statusMsg = array( 'status' => 'error', 'msg' => 'کد اعتبارسنجي اشتباه است . مجددا تلاش کنيد.' ); } }else{ $statusMsg = array( 'status' => 'error', 'msg' => 'لطفا کد اعتبارسنجي پيامک شده را وارد کنيد' ); } } ?> |
وضعیت اعتبارسنجی
اگر شماره موبایل کاربر به موفقیت اعتبارسنجی شده باشد, پیام وضعیت زیر را نمایش می دهیم.
1 2 3 4 5 6 7 |
<!-- Display status message --> <?php echo !empty($statusMsg)?'<p class="'.$statusMsg['status'].'">'.$statusMsg['msg'].'</p>':''; ?> <?php if($verified == 1){ ?> <p>Mobile No: <?php echo $recipient_no; ?></p> <p>Verification Status: <b>Verified</b></p> <?php } ?> |
امیدوارم از آموزش تایید شماره موبایل با SMS در PHP نهایت استفاده را برده باشید.
برای دانلود سورس کد کامل از باکس دانلود زیر استفاده کنید.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
سلام من میتونم به صورت خصوصی با شما تماس بگیرم
سلام. متاسفانه خیر
هر موردی بود میتونید از بخش تیکت پنل کاربری یا ایمیل سایت ارسال کنید
با سلام
در فرم ثبت نام با کد یکبار مصرف موبایل ایا نیاز هست شماره موبایل کاربر یا کد یکبار مصرف که به سمت سرور پیامک ارسال میشه رمز گذاری بشه یا نه؟
سلام.
نه نیازی نیست
سلام فایل functions.php رو از کجا بیاریم؟؟؟؟
سلام.
سورس کد رو از آخر همین پست بخش دانلود باکس دریافت کنید
سلام و عرض ادب
اگه بخوایم مثل دیجی کالا باشه چطور باید اجرا بشه ؟
یعنی کاربر شماره موبایل رو وارد میکنه و کد براش ارسال میشه ، اگر عضو بود وارد میشه اگه عضو نبود ، عضو میشه . یه جورایی عضویت و ورود با یم فرم واحد انجام میشه و نیازی به رمز عبور نیست و همون کد یکبار مصرف کافیه
ممنونم از راهنماییتون
سلام. کار سادست بعد وارد کردن کد شما سشن ورود رو براش ست می کنید و به پنل کاربری هدایت می کنید.
برای اینکار حتی نیاز به تغییر دیتابیس هم نیست فقط بعد تایید کد به پنل کاربری هدایت کنید
ممنونم
یعنی اول باید چک بشه که این شماره موبایل تو دیتابیس هست یا نه ..بعد اگه بود ، کد ارسالی رو به جای رمز عبور آپدیت بشه و وقتی کاربر کد رو زد با همون وارد پنل کاربری بشه ..اگه عضو نبود با همون رمز براش حساب کاربری ساخته بشه ؟
دقیقا درسته روند به همین سادگی که گفتید هست