Hoàng Web

Thiết Kế Website WordPress

  • Kho giao diện
  • Dịch Vụ
    • Thiết kế web giá rẻ
    • Thiết kế website WordPress
    • Hosting Miễn Phí 100GB
    • Tích hợp thanh toán MoMo, ViettelPay, Vietcombank, MB..
    • Tối ưu Google PageSpeed
    • Sửa lỗi nâng cấp website
    • Viết plugin WordPress
    • Code Tool theo yêu cầu
  • Bảng giá
  • Quy trình làm việc
  • Giới thiệu
  • Liên Lạc
Trang chủ » Programming » PHP » Gửi mã kích hoạt tài khoản qua email – PHP

Gửi mã kích hoạt tài khoản qua email – PHP

Thứ Sáu, 15/08/2014 by Hoàng Quách

  • shares
  • Facebook
  • Facebook Messenger
  • Gmail
  • Viber
  • Skype

Kích hoạt tài khoản qua email (Email activation) thường gặp khi chúng ta đăng ký nick trên diễn đàn, hay một website uy tín nào đó. Hoặc bạn đang xây dựng ứng dụng với tính năng membership. Cách này phù hợp nhất nếu bạn muốn kiểm tra tính chung thực của người dùng, để đảm bảo tất cả người dùng đều cung cấp một tài khoản email đúng. Vì Link kích hoạt chỉ được gửi vào email có địa chỉ chính xác.

kích hoạt tài khoản qua email

Ngoài cách này ra, còn có một số cách khác để xác nhận địa chỉ email của người dùng, nhưng có một vài hệ thống cũng sử dụng giống cách mà mình đang trình bày trong bài viết này.

Oauth
Mình muốn nói giải pháp thay thế là oauth bằng việc đăng nhập bằng tài khoản của bên thứ 3 với Social network login. Facebook, Twitter, Google+, và thậm trí Microsoft đều có hỗ trợ Oauth login (Open Authorization). Chắc bạn cũng đã nhìn thấy nút “Login with Facebook” rồi đúng không? chính là em nó.

StackOverflow là một trang cũng vậy, hãy xem cách mà trang này có thể đăng nhập được với nhiều tài khoản khác nhau.
oauth login email validation
Trong wordpress mình đã có bài cách tạo đăng nhập tài khoản sử dụng facebook, yahoo, google, bạn có thể xem tại đó. Bài này với cách đơn giản hơn.

Các bước tạo Email Activation

Các bước để thực hiện một đăng ký và mã kích hoạt tài khoản là:

  1. User điền form đăng ký và ấn nút register để tiến hành lưu thông tin trên database.
  2. Hệ thống sẽ sinh ra một chuỗi key duy nhất, mã này nhớ trong CSDL và đồng thời gửi cho user qua email mà họ cung cấp.
  3. User mở hòm thư, tìm thấy email đó và nhấn vào link chứa mã kích hoạt được gửi bởi hệ thống.
  4. Người dùng sẽ nhận được dòng thông báo thành công trên link. Ví dụ: tài khoản đã kích hoạt “Your account was actived”

Bắt đầu từ đâu?

Rất đơn giản thôi bạn, mình sẽ làm theo quy trình ở trên.
Bước 1 -3: tạo form đăng ký trong sign_up.php
Bước 4: lúc này người dùng đã nhận được email, nội dung trong email có thể sẽ như thế này.
Kích hoạt tài khoản qua email activation

Bước này là quan trọng đây, tạo file active.php. Công nghệ sử dụng trong bài này là php và mysql. Để gửi được email chúng ta có hàm PHP email hoặc nếu bạn xài share-host thì sử dụng thư viện SMTP PHPMailer và có thể gửi email bằng các tài khoản gmail, yahoo…Vì những share-host không cài riêng ứng dụng gửi nhận email, chỉ hỗ trợ trên VPS.

Chuẩn bị Mysql table, tạo với đoạn sql sau:

CREATE TABLE `users` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR(32) NOT NULL,
  `email` VARCHAR(264) NOT NULL,
  `verified` INT(11) NOT NULL COMMENT '0=no, 1=yes',
  `verification_code` VARCHAR(264) NOT NULL,
  `created` datetime NOT NULL,
  `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=134 ;

sign_up.php: chúng ta sẽ tạo form và code sử lý đăng ký tại đây.

<?php
// if the sign up form was submitted
if($_POST){
 
    $email = isset($_POST['email']) ? $_POST['email'] : "";
 
    // posted email must not be empty
    if(empty($email)){
        echo "<div>Email cannot be empty.</div>";
    }
 
    // must be a valid email address
    else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        echo "<div>Your email address is not valid.</div>";
    }
 
    else{
       //include database connection
        ...
 
        // check first if record exists
        $query = "SELECT id FROM users WHERE email = ? and verified = '1'";
        $stmt = $con->prepare( $query );
        $stmt->bindParam(1, $email);
        $stmt->execute();
        $num = $stmt->rowCount();
 
        if($num>0){
            echo "<div>Your email is already activated.</div>";
        }
 
        else{
 
            // check first if there's unverified email related
            $query = "SELECT id FROM users WHERE email = ? and verified = '0'";
            $stmt = $con->prepare( $query );
            $stmt->bindParam(1, $email);
            $stmt->execute();
            $num = $stmt->rowCount();
 
            if($num>0){
 
                // you have to create a resend verification script
                echo "<div>Your email is already in the system but not yet verified. <a href='resend.php'>Resend verification?</a>.</div>";
            }
 
            else{
 
                // now, compose the content of the verification email, it will be sent to the email provided during sign up
                // generate verification code, acts as the "key"
                $verificationCode = md5(uniqid("yourrandomstringyouwanttoaddhere", true));
 
                // send the email verification
                $verificationLink = "http://example.com/activate.php?code=" . $verificationCode;
 
                $htmlStr = "";
                $htmlStr .= "Hi " . $email . ",<br /><br />";
 
                $htmlStr .= "Please click the button below to verify your subscription and have access to the download center.<br /><br /><br />";
                $htmlStr .= "<a href='{$verificationLink}' target='_blank' style='padding:1em; font-weight:bold; background-color:blue; color:#fff;'>VERIFY EMAIL</a><br /><br /><br />";
 
                $htmlStr .= "Kind regards,<br />";
                $htmlStr .= "<a href='/' target='_blank'>Dịch vụ thiết kế web giá rẻ</a><br />";
 
 
                $name = "Hoangweb.com";
                $email_sender = "[email protected]";
                $subject = "Verification Link | Thiết kế web giá rẻ | Subscription";
                $recipient_email = $email;
 
                $headers  = "MIME-Version: 1.0rn";
                $headers .= "Content-type: text/html; charset=iso-8859-1rn";
                $headers .= "From: {$name} <{$email_sender}> n";
 
                $body = $htmlStr;
 
                // send email using the mail function, you can also use php mailer library if you want
                if( mail($recipient_email, $subject, $body, $headers) ){
 
                    // tell the user a verification email were sent
                    echo "<div id='successMessage'>A verification email were sent to <b>" . $email . "</b>, please open your email inbox and click the given link so you can login.</div>";
 
 
                    // save the email in the database
                    $created = date('Y-m-d H:i:s');
 
                    //write query, verified = '0' means it is unverified, on activation, it becomes '1'
                    $query = "INSERT INTO 
                                users 
                            SET 
                                email = ?, 
                                verification_code = ?, 
                                created = ?,
                                verified = '0'";
 
                    $stmt = $con->prepare($query);
 
                    $stmt->bindParam(1, $email);
                    $stmt->bindParam(2, $verificationCode);
                    $stmt->bindParam(3, $created);
 
                    // Execute the query
                    if($stmt->execute()){
                        // echo "<div>Unverified email was saved to the database.</div>";
                    }else{
                        echo "<div>Unable to save your email to the database. <a href='/lien-he'>Contact Us.</a></div>";
                        //print_r($stmt->errorInfo());
                    }
 
                }else{
                    die("Sending failed.");
                }
            }
 
 
        }
 
    }
 
}
 
// show your sign up or registration form
echo "<form action='" . $_SERVER[PHP_SELF] . "' method='post'>";
    echo "<input type='email' name='email' placeholder='Enter your email address to subscribe' required />";
    echo "<input type='submit' value='Subscribe' />";
echo "</form>";
?>

Ở đoạn code trên, bạn dễ nhìn ra hàm md5 & uniqid, nó được ứng dụng khá nhiều, trong các hệ thống bảo mật và ở đây mình dùng để tạo một chuỗi ngẫu nhiên và duy nhất cho những lần gọi tiếp theo.

Tiếp đến file activate.php – quyết định user có được kích hoạt hay không là ở file này. Vì mỗi một mã verification code, là khác nhau cho mỗi user. Do vậy thông tin này cũng là căn cứ xác định tài khoản user nào được kích hoạt.

<?php
//database connection
...
// check first if record exists
$query = "SELECT id FROM users WHERE verification_code = ? and verified = '0'";
$stmt = $con->prepare( $query );
$stmt->bindParam(1, $_GET['code']);
$stmt->execute();
$num = $stmt->rowCount();
 
if($num>0){
 
    // update the 'verified' field, from 0 to 1 (unverified to verified)
    $query = "UPDATE users 
                set verified = '1'
                where verification_code = :verification_code";
 
    $stmt = $con->prepare($query);
    $stmt->bindParam(':verification_code', $_GET['code']);
 
    if($stmt->execute()){           
        // tell the user
        echo "<div>Your email is valid, thanks!. You may now login.</div>";
    }else{
        echo "<div>Unable to update verification code.</div>";
        //print_r($stmt->errorInfo());
    }       
 
}else{
    // tell the user he should not be in this page
    echo "<div>I think you're in the wrong place.</div>";
}
?>

Đảm bảo người dùng đã mở email, và không cung cấp mã key sai. Lưu ý: mã key này không đoán được đâu nhé vì nó khó đoán hơn cả password.

Gửi mã kích hoạt vào điện thoại thông qua sms

Ngoài email ra bạn có thể sử dụng SMS làm phương tiện kích hoạt, bằng cách gửi mã bí mật ở trên vào sms của người dùng thay vì gửi email kèm theo link hướng dẫn kích hoạt. Để gửi sms từ website chúng ta phải dùng đến SMS API. Đến đây trong đầu bạn sẽ nẩy ra nhiều ý tưởng, có thể bạn nghĩ sẽ dùng dịch vụ nào đó cho phép gửi sms miễn phí như sms.vn hoặc sử dụng dịch vụ trả phí.

Tuy nhiên, trang web gửi sms đó phải hỗ trợ API. Mình thấy rất khó đối với những trang gửi free sms, vì nó bảo mật bằng captcha chống spam. Đòi hỏi bạn xành về sử lý dữ liệu web với CURL hơn để bắt hình captcha của nó giống như cách sử lý của phần mềm auto-poster vậy.

Nhưng có một cách khác không tốn kém mà các tin SMS gửi đi được kiểm xoát, ở đây mình không nói sử dụng trang web cung cấp dịch vụ SMS có phí nha. Bạn sử dụng chính chiếc smartphone của mình đang xài hàng ngày, và biến nó thành SMS gateway. Bạn hoàn toàn có thể gửi sms đi từ điện thoại của mình bằng nút lệnh trên website. Thay đoạn code gửi email kích hoạt ở trên bằng code gửi sms là xong.

Chúc bạn thành công!

Để nhận được bài viết mới vui lòng đăng ký kênh kiến thức WordPress từ A-Z ở Form bên dưới. Bạn cũng có thể nhận được sự trợ giúp trên Twitter và Facebook

  • shares
  • Facebook
  • Facebook Messenger
  • Gmail
  • Viber
  • Skype

Chuyên mục: PHP Tìm kiếm: email, email activation

Comments

  1. Tiểu ngọc says

    Thứ Năm, 20/02/2020 at 6:03 sáng

    Ad ơi, cho mình hỏi 1 xí.
    Khi user đăng ký qua signup ở trang đăng ký thành viên mặc định của wordpress nó báo là kiểm tra tài khoản email. Thế nhưng nó ko gửi email về.
    Vậy là bị làm sao hả bạn. Có phải mình chưa thiết lập gì đó ko

    • Hoàng Quách says

      Thứ Sáu, 21/02/2020 at 9:35 sáng

      Bạn xem hướng dẫn cấu hình SMTP gửi email nhé

  2. Solybe says

    Chủ Nhật, 24/05/2020 at 3:26 chiều

    Anh hướng dẫn sử dụng sign_up.php như thế nào ạ. Em cám ơn

  3. Nam Hoang says

    Chủ Nhật, 24/05/2020 at 9:17 chiều

    Chào ad cho em hỏi. các code trên làm thế nào để show ra được form đăng nhập ạ. Em chưa hiểu lắm

    // show your sign up or registration form
    echo “”;
    echo “”;
    echo “”;
    echo “”;

    Và cách thiết lập ra sao.mong ad giúp!

Tôi giúp gì cho bạn?

HOÀNG WEB

Địa chỉ: Tây Sơn, Phường Quang Trung, Quận Đống Đa, Hà Nội

Hotline: 0987 342 124 – 0868 292 303 (8h:00 – 21h:00)

Email: [email protected]

Website: www.hoangweb.com

KẾT NỐI VỚI TÔI

  • Facebook
  • GitHub
  • YouTube

SẢN PHẨM

  • Plugin Thanh Toán Quét Mã QR Code Tự Động
  • WP2Speed – Tối ưu Google Speed
  • 23WebHost – Hosting Miễn Phí 100GB

LIÊN KẾT

  • Có nên thuê thiết kế website giá rẻ?
  • Hướng dẫn thanh toán
  • Chính sách hoàn tiền
  • Trung tâm hỗ trợ

Copyright © 2023 | All rights reserved | HOANG WEB
Mọi hình thức sao chép nội dung trên website này mà chưa được sự đồng ý đều là trái phép.