Step 1: tạo file xử lý Thanh toán
- Tạo file
/frontend/thanhtoan/thanhtoan.php
<?php
// Hiển thị tất cả lỗi trong PHP
// Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development)
// Không nên hiển thị lỗi trên môi trường Triển khai (Production)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Load các thư viện (packages) do Composer quản lý vào chương trình
require_once __DIR__ . '/../../vendor/autoload.php';
// Sử dụng thư viện PHP Mailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// hàm `session_id()` sẽ trả về giá trị SESSION_ID (tên file session do Web Server tự động tạo)
// - Nếu trả về Rỗng hoặc NULL => chưa có file Session tồn tại
if (session_id() === '') {
// Yêu cầu Web Server tạo file Session để lưu trữ giá trị tương ứng với CLIENT (Web Browser đang gởi Request)
session_start();
}
// Đã người dùng chưa đăng nhập -> hiển thị thông báo yêu cầu người dùng đăng nhập
if (!isset($_SESSION['kh_tendangnhap_logged']) || empty($_SESSION['kh_tendangnhap_logged'])) {
echo 'Vui lòng Đăng nhập trước khi Thanh toán! <a href="/php/myhand/backend/auth/login.php">Click vào đây để đến trang Đăng nhập</a>';
die;
} else {
// Nếu giỏ hàng trong session rỗng, return
if (!isset($_SESSION['giohangdata']) || empty($_SESSION['giohangdata'])) {
echo 'Giỏ hàng rỗng. Vui lòng chọn Sản phẩm trước khi Thanh toán!';
die;
}
// Nếu đã đăng nhập, tạo Đơn hàng
// Truy vấn database
// 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
include_once(__DIR__ . '/../../dbconnect.php');
/* ---
--- 2.Truy vấn dữ liệu Khách hàng
--- Lấy giá trị khóa chính được truyền theo dạng QueryString Parameter key1=value1&key2=value2...
---
*/
$kh_tendangnhap = $_SESSION['kh_tendangnhap_logged'];
// var_dump($kh_tendangnhap);die;
$sqlSelectKhachHang = <<<EOT
SELECT *
FROM `khachhang` kh
WHERE kh.kh_tendangnhap = '$kh_tendangnhap'
EOT;
// var_dump($sqlSelectKhachHang);die;
// Thực thi câu truy vấn SQL để lấy về dữ liệu ban đầu của record
$resultSelectKhachHang = mysqli_query($conn, $sqlSelectKhachHang);
// Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tích để sử dụng
// Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT
// Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về
$khachhangRow;
while ($row = mysqli_fetch_array($resultSelectKhachHang, MYSQLI_ASSOC)) {
$khachhangRow = array(
'kh_tendangnhap' => $row['kh_tendangnhap'],
'kh_ten' => $row['kh_ten'],
'kh_email' => $row['kh_email'],
'kh_diachi' => $row['kh_diachi'],
);
}
/* --- End Truy vấn dữ liệu Khách hàng --- */
// Thông tin đơn hàng
$dh_ngaylap = date('Y-m-d'); // Lấy ngày hiện tại theo định dạng yyyy-mm-dd
$dh_ngaygiao = date('Y-m-d');
$dh_noigiao = '';
$dh_trangthaithanhtoan = 0; // Mặc định là 0 chưa thanh toán
$httt_ma = 1; // Mặc định là 1
// 2. Thực hiện câu lệnh Tạo mới (INSERT) Đơn hàng
// Câu lệnh INSERT
$sqlInsertDonHang = <<<EOT
INSERT INTO `dondathang` (`dh_ngaylap`, `dh_ngaygiao`, `dh_noigiao`, `dh_trangthaithanhtoan`, `httt_ma`, `kh_tendangnhap`)
VALUES ('$dh_ngaylap', '$dh_ngaygiao', N'$dh_noigiao', '$dh_trangthaithanhtoan', '$httt_ma', '$kh_tendangnhap');
EOT;
// print_r($sqlInsertDonHang); die;
// Thực thi INSERT Đơn hàng
mysqli_query($conn, $sqlInsertDonHang);
// 3. Lấy ID Đơn hàng mới nhất vừa được thêm vào database
// Do ID là tự động tăng (PRIMARY KEY và AUTO INCREMENT), nên chúng ta không biết được ID đă tăng đến số bao nhiêu?
// Cần phải sử dụng biến `$conn->insert_id` để lấy về ID mới nhất
// Nếu thực thi câu lệnh INSERT thành công thì cần lấy ID mới nhất của Đơn hàng để làm khóa ngoại trong Chi tiết đơn hàng
$dh_ma = $conn->insert_id;
// var_dump($dh_ma);die;
// Thông tin các dòng chi tiết đơn hàng
$giohangdata = $_SESSION['giohangdata'];
// 4. Duyệt vòng lặp qua mảng các dòng Sản phẩm của chi tiết đơn hàng được gởi đến qua request POST
foreach ($giohangdata as $item) {
// 4.1. Chuẩn bị dữ liệu cho câu lệnh INSERT vào table `sanpham_dondathang`
$sp_ma = $item['sp_ma'];
$sp_dh_soluong = $item['soluong'];
$sp_dh_dongia = $item['gia'];
// 4.2. Câu lệnh INSERT
$sqlInsertSanPhamDonDatHang = <<<EOT
INSERT INTO `sanpham_dondathang` (`sp_ma`, `dh_ma`, `sp_dh_soluong`, `sp_dh_dongia`)
VALUES ($sp_ma, $dh_ma, $sp_dh_soluong, $sp_dh_dongia);
EOT;
// 4.3. Thực thi INSERT
mysqli_query($conn, $sqlInsertSanPhamDonDatHang);
}
// 5. Gởi mail thông báo cho khách hàng về Đơn hàng đã đặt
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'hotro.nentangtoituonglai@gmail.com'; // SMTP username
$mail->Password = 'yjkkdiyfjwksktot'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->CharSet = "UTF-8";
// Bật chế bộ tự mình mã hóa SSL
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
//Recipients
$mail->setFrom('hotro.nentangtoituonglai@gmail.com', 'Mail Liên hệ');
$mail->addAddress($khachhangRow['kh_email']); // Add a recipient
// $mail->addCC('cc@example.com');
// $mail->addBCC('bcc@example.com');
//Attachments
// $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
// $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
//Content
$mail->isHTML(true); // Set email format to HTML
// Tiêu đề Mail
$mail->Subject = "[Có đơn hàng vừa thanh toán] - Mã đơn hàng $dh_ma";
// Nội dung Mail
// Lưu ý khi thiết kế Mẫu gởi mail
// - Chỉ nên sử dụng TABLE, TR, TD, và các định dạng cơ bản của CSS để thiết kế
// - Các đường link/hình ảnh có sử dụng trong mẫu thiết kế MAIL phải là đường dẫn WEB có thật, ví dụ như logo,banner,...
$templateDonHang = '<ul>';
$templateDonHang .= '<li>Họ tên khách hàng: ' . $khachhangRow['kh_ten'] . '</li>';
$templateDonHang .= '<li>Địa chỉ khách hàng: ' . $khachhangRow['kh_diachi'] . '</li>';
$templateDonHang .= '<ul>';
$stt = 1;
$templateChiTietDonHang = '<table border="1" width="100%">';
$templateChiTietDonHang .= '<tr>';
$templateChiTietDonHang .= '<td>STT</td>';
$templateChiTietDonHang .= '<td>Sản phẩm</td>';
$templateChiTietDonHang .= '<td>Số lượng</td>';
$templateChiTietDonHang .= '<td>Giá</td>';
$templateChiTietDonHang .= '<td>Thành tiền</td>';
$templateChiTietDonHang .= '</tr>';
foreach ($giohangdata as $item) {
$templateChiTietDonHang .= '<tr>';
$templateChiTietDonHang .= '<td>' . $stt . '</td>';
$templateChiTietDonHang .= '<td>' . $item['sp_ten'] . '</td>';
$templateChiTietDonHang .= '<td>' . $item['soluong'] . '</td>';
$templateChiTietDonHang .= '<td>' . $item['gia'] . '</td>';
$templateChiTietDonHang .= '<td>' . ($item['soluong'] * $item['gia']) . '</td>';
$templateChiTietDonHang .= '</tr>';
$stt++;
}
$templateChiTietDonHang .= '</table>';
$body = <<<EOT
<table border="1" width="100%">
<tr>
<td colspan="2">
<img src="http://learning.nentang.vn/php/myhand/assets/shared/img/logo-nentang.jpg" style="width: 100px; height: 100px; border: 1px solid red;" />
</td>
</tr>
<tr>
<td>Có Đơn hàng vừa thanh toán</td>
<td>
<h2>Thông tin đơn hàng</h2>
$templateDonHang
<h2>Chi tiết đơn hàng</h2>
$templateChiTietDonHang
</td>
</td>
</table>
EOT;
$mail->Body = $body;
$mail->send();
} catch (Exception $e) {
echo 'Lỗi khi gởi mail: ', $mail->ErrorInfo;
}
// 5. Thực thi hoàn tất, điều hướng về trang Danh sách
// Hủy dữ liệu giỏ hàng trong session
unset($_SESSION['giohangdata']);
echo 'Đặt hàng thành công. <a href="/php/myhand/frontend/">Bấm vào đây để quay về trang chủ</a>';
}
|