File manager - Edit - /home/webapp69.cm.in.th/u69319090037/Shop/views/checkout.php
Back
<?php /** * Checkout Page * CMTC Shopping */ require_once __DIR__ . '/../includes/header.php'; require_once __DIR__ . '/../includes/navbar.php'; require_login(); $user_id = $_SESSION['user_id']; // Fetch user profile $stmt_u = $db->prepare("SELECT * FROM users WHERE id = ?"); $stmt_u->execute([$user_id]); $user = $stmt_u->fetch(); // Fetch payment settings $pay_settings = $db->query("SELECT * FROM payment_settings LIMIT 1")->fetch(); // Fetch cart items from DB $stmt_c = $db->prepare(" SELECT ci.id as cart_item_id, ci.quantity, ci.color_id, ci.size_id, p.*, (SELECT image_path FROM product_images WHERE product_id = p.id ORDER BY is_main DESC, id ASC LIMIT 1) as main_image, pc.color_name, ps.size_name FROM cart_items ci JOIN carts c ON ci.cart_id = c.id JOIN products p ON ci.product_id = p.id LEFT JOIN product_colors pc ON ci.color_id = pc.id LEFT JOIN product_sizes ps ON ci.size_id = ps.id WHERE c.user_id = ? ORDER BY ci.id DESC "); $stmt_c->execute([$user_id]); $cart_rows = $stmt_c->fetchAll(); if (empty($cart_rows)) { header("Location: " . base_url('views/cart.php')); exit(); } $error = ""; $success = ""; // Calculate total $total_amount = 0; $items_data = []; foreach ($cart_rows as $row) { $price = !empty($row['promo_price']) ? floatval($row['promo_price']) : floatval($row['price']); $sub = $price * intval($row['quantity']); $total_amount += $sub; $items_data[] = [ 'product' => $row, 'qty' => $row['quantity'], 'color_name' => $row['color_name'] ?? null, 'size_name' => $row['size_name'] ?? null, 'price' => $price, 'subtotal' => $sub ]; } // Handle Order Creation if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['place_order'])) { if (!validate_csrf_token($_POST['csrf_token'] ?? '')) { $error = "โทเค็นความปลอดภัยไม่ถูกต้อง"; } else { $shipping_address = trim($_POST['shipping_address'] ?? ''); $phone = trim($_POST['phone'] ?? ''); if (empty($shipping_address) || empty($phone)) { $error = "กรุณากรอกที่อยู่และเบอร์โทรศัพท์สำหรับจัดส่ง"; } else { try { $db->beginTransaction(); $order_no = 'CMTC-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -4)); // 1. Create order $stmt_ord = $db->prepare(" INSERT INTO orders (order_no, user_id, total_amount, net_amount, status, shipping_address) VALUES (?, ?, ?, ?, 'pending', ?) "); $stmt_ord->execute([$order_no, $user_id, $total_amount, $total_amount, $shipping_address]); $order_id = $db->lastInsertId(); // 2. Insert order items $stmt_item = $db->prepare(" INSERT INTO order_items (order_id, product_id, color_name, size_name, quantity, price, total) VALUES (?, ?, ?, ?, ?, ?, ?) "); foreach ($items_data as $it) { $stmt_item->execute([ $order_id, $it['product']['id'], $it['color_name'], $it['size_name'], $it['qty'], $it['price'], $it['subtotal'] ]); } $payment_method = $_POST['payment_method'] ?? 'transfer'; // 3. Handle Payment record if ($payment_method === 'cash') { // เก็บเงินปลายทาง (Cash on Delivery) $stmt_pay = $db->prepare("INSERT INTO payments (order_id, payment_method, amount, status) VALUES (?, 'cash', ?, 'pending')"); $stmt_pay->execute([$order_id, $total_amount]); } else { // โอนผ่านบัญชี / QR PromptPay if (isset($_FILES['slip']) && $_FILES['slip']['error'] === UPLOAD_ERR_OK) { $upload_res = upload_image($_FILES['slip'], 'slips', 'slip'); if ($upload_res['success']) { $stmt_pay = $db->prepare("INSERT INTO payments (order_id, payment_method, amount, slip_path, status) VALUES (?, 'transfer', ?, ?, 'pending')"); $stmt_pay->execute([$order_id, $total_amount, $upload_res['filename']]); $db->prepare("UPDATE orders SET status = 'paid' WHERE id = ?")->execute([$order_id]); } } else { // ยังไม่ได้แนบสลิป $stmt_pay = $db->prepare("INSERT INTO payments (order_id, payment_method, amount, status) VALUES (?, 'transfer', ?, 'pending')"); $stmt_pay->execute([$order_id, $total_amount]); } } // Clear user cart in DB $stmt_clear_cart = $db->prepare("DELETE ci FROM cart_items ci JOIN carts c ON ci.cart_id = c.id WHERE c.user_id = ?"); $stmt_clear_cart->execute([$user_id]); $db->commit(); // Clear session cart if any unset($_SESSION['cart']); header("Location: " . base_url("views/order_detail.php?id=$order_id")); exit(); } catch (Exception $e) { $db->rollBack(); $error = "เกิดข้อผิดพลาดในการสร้างคำสั่งซื้อ: " . $e->getMessage(); } } } } ?> <div class="container my-5"> <h3 class="fw-bold mb-4"><i class="bi bi-credit-card-2-back-fill text-primary me-2"></i>ยืนยันคำสั่งซื้อและการชำระเงิน</h3> <?php if (!empty($error)): ?> <div class="alert alert-danger mb-4"><?php echo $error; ?></div> <?php endif; ?> <form method="POST" enctype="multipart/form-data"> <input type="hidden" name="csrf_token" value="<?php echo get_csrf_token(); ?>"> <div class="row g-4"> <div class="col-lg-7"> <!-- Shipping Info --> <div class="card border-0 shadow-sm glass-card p-4 mb-4"> <h5 class="fw-bold mb-3"><i class="bi bi-geo-alt-fill text-primary me-2"></i>ข้อมูลผู้รับและการจัดส่ง</h5> <div class="mb-3"> <label class="form-label">ชื่อ-นามสกุลผู้รับ *</label> <input type="text" class="form-control" value="<?php echo sanitize($user['prefix'] . $user['firstname'] . ' ' . $user['lastname']); ?>" readonly> </div> <div class="mb-3"> <label class="form-label">เบอร์โทรศัพท์ติดต่อ *</label> <input type="tel" name="phone" class="form-control" value="<?php echo sanitize($user['phone']); ?>" required> </div> <div class="mb-3"> <label class="form-label fw-bold"><i class="bi bi-truck me-1"></i>ที่อยู่สำหรับการจัดส่ง / รับสินค้า *</label> <!-- Cascading Address Selector --> <div class="row g-2 mb-2"> <div class="col-md-6"> <label class="form-label small text-muted mb-1">ภาค *</label> <select id="checkout_region" class="form-select form-select-sm" required> <option value="">-- เลือกภาค --</option> </select> </div> <div class="col-md-6"> <label class="form-label small text-muted mb-1">จังหวัด *</label> <select id="checkout_province" class="form-select form-select-sm" disabled required> <option value="">-- เลือกจังหวัด --</option> </select> </div> <div class="col-md-6"> <label class="form-label small text-muted mb-1">อำเภอ / เขต *</label> <select id="checkout_district" class="form-select form-select-sm" disabled required> <option value="">-- เลือกอำเภอ/เขต --</option> </select> </div> <div class="col-md-6"> <label class="form-label small text-muted mb-1">ตำบล / แขวง *</label> <select id="checkout_subdistrict" class="form-select form-select-sm" disabled required> <option value="">-- เลือกตำบล/แขวง --</option> </select> </div> <div class="col-md-4"> <label class="form-label small text-muted mb-1">รหัสไปรษณีย์ *</label> <input type="text" id="checkout_zipcode" class="form-control form-control-sm" placeholder="รหัสไปรษณีย์" readonly required> </div> <div class="col-md-8"> <label class="form-label small text-muted mb-1">บ้านเลขที่ / หมู่ / ซอย / ถนน *</label> <input type="text" id="checkout_houseno" class="form-control form-control-sm" placeholder="เช่น 123/45 ม.2 ถ.สุขุมวิท" required> </div> </div> <!-- Real field to submit --> <textarea name="shipping_address" id="shipping_address" class="form-control d-none" required><?php echo sanitize($user['address'] ?? ''); ?></textarea> <div class="form-text small text-muted"><i class="bi bi-info-circle me-1"></i>ระบบจะรวมที่อยู่จัดส่งและรหัสไปรษณีย์ให้อัตโนมัติจากตัวเลือกด้านบน</div> </div> </div> <!-- Payment Info --> <div class="card border-0 shadow-sm glass-card p-4"> <h5 class="fw-bold mb-3"><i class="bi bi-wallet2 text-primary me-2"></i>เลือกช่องทางการชำระเงิน *</h5> <!-- Payment Method Radio Options --> <div class="row g-3 mb-3"> <div class="col-md-6"> <div class="form-check p-3 border rounded-3 h-100 bg-body-tertiary payment-option-card"> <input class="form-check-input ms-0 me-2" type="radio" name="payment_method" id="pay_promptpay" value="transfer" checked onchange="togglePaymentView()"> <label class="form-check-label fw-bold d-block cursor-pointer" for="pay_promptpay"> <i class="bi bi-qr-code text-primary me-1"></i> โอนเงิน / QR PromptPay <span class="d-block small text-muted fw-normal mt-1">สแกนจ่ายผ่านแอปธนาคาร พร้อมแนบสลิป</span> </label> </div> </div> <div class="col-md-6"> <div class="form-check p-3 border rounded-3 h-100 bg-body-tertiary payment-option-card"> <input class="form-check-input ms-0 me-2" type="radio" name="payment_method" id="pay_cod" value="cash" onchange="togglePaymentView()"> <label class="form-check-label fw-bold d-block cursor-pointer" for="pay_cod"> <i class="bi bi-cash-stack text-success me-1"></i> เก็บเงินปลายทาง (COD) <span class="d-block small text-muted fw-normal mt-1">ชำระเงินสดกับเจ้าหน้าที่จัดส่งเมื่อได้รับสินค้า</span> </label> </div> </div> </div> <!-- PromptPay Details Box --> <div id="promptpay_box"> <div class="text-center p-3 bg-light rounded border mb-3"> <?php if (!empty($pay_settings['qr_image'])): ?> <img src="<?php echo base_url('uploads/qrcode/' . sanitize($pay_settings['qr_image'])); ?>" class="img-fluid rounded mb-2 shadow-xs" style="max-height: 200px;"> <?php endif; ?> <div class="fw-bold text-primary mt-1">พร้อมเพย์: <?php echo sanitize($pay_settings['promptpay_no'] ?? '0888888888'); ?></div> <div class="text-muted small">ชื่อบัญชี: <?php echo sanitize($pay_settings['account_name'] ?? 'CMTC Shopping'); ?></div> </div> <div class="mb-3"> <label class="form-label fw-bold small">แนบสลิปการโอนเงิน (หากโอนเงินแล้ว)</label> <input type="file" name="slip" class="form-control" accept="image/jpeg,image/png,image/webp"> <small class="text-muted">สามารถแนบสลิปทันทีตอนนี้ หรือแนบย้อนหลังได้ในหน้าประวัติคำสั่งซื้อ</small> </div> </div> <!-- COD Details Box --> <div id="cod_box" class="d-none"> <div class="alert alert-success border-0 d-flex align-items-center mb-0"> <i class="bi bi-check-circle-fill fs-4 me-3 text-success"></i> <div> <h6 class="fw-bold mb-1">บริการเก็บเงินปลายทาง (COD)</h6> <p class="small mb-0 text-secondary">กรุณาเตรียมเงินสดให้พอดีกับยอดชำระ <strong class="text-dark"><?php echo format_price($total_amount); ?></strong> เมื่อพนักงานนำพัสดุไปส่งมอบ</p> </div> </div> </div> </div> </div> <div class="col-lg-5"> <!-- Summary Card --> <div class="card border-0 shadow-sm glass-card p-4"> <h5 class="fw-bold mb-3">สรุปรายการ</h5> <ul class="list-group list-group-flush mb-3"> <?php foreach ($items_data as $it): ?> <li class="list-group-item d-flex justify-content-between align-items-center bg-transparent px-0"> <div> <div class="fw-semibold text-truncate" style="max-width: 220px;"><?php echo sanitize($it['product']['name']); ?></div> <small class="text-muted">x <?php echo $it['qty']; ?></small> </div> <span class="fw-bold"><?php echo format_price($it['subtotal']); ?></span> </li> <?php endforeach; ?> </ul> <div class="d-flex justify-content-between mb-2"> <span class="text-muted">ค่าจัดส่ง</span> <span class="text-success fw-bold">ฟรี</span> </div> <hr> <div class="d-flex justify-content-between mb-4"> <span class="fw-bold fs-5">ยอดชำระทั้งหมด</span> <span class="fw-bold fs-4 text-primary"><?php echo format_price($total_amount); ?></span> </div> <button type="submit" name="place_order" class="btn btn-primary w-100 py-3 fw-bold shadow"> <i class="bi bi-check2-circle me-1"></i> ยืนยันการสั่งซื้อ </button> </div> </div> </div> </form> </div> <script src="<?php echo base_url('assets/js/thai_address.js'); ?>"></script> <script> function togglePaymentView() { const isCod = document.getElementById('pay_cod').checked; const promptpayBox = document.getElementById('promptpay_box'); const codBox = document.getElementById('cod_box'); if (isCod) { promptpayBox.classList.add('d-none'); codBox.classList.remove('d-none'); } else { promptpayBox.classList.remove('d-none'); codBox.classList.add('d-none'); } } document.addEventListener('DOMContentLoaded', function() { initThaiAddressSelector({ region: '#checkout_region', province: '#checkout_province', district: '#checkout_district', subdistrict: '#checkout_subdistrict', zipcode: '#checkout_zipcode', houseNo: '#checkout_houseno', output: '#shipping_address' }); }); </script> <?php require_once __DIR__ . '/../includes/footer.php'; ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.22 |
proxy
|
phpinfo
|
Settings