| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Thanh toán - GadgetHub</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"> |
| <style> |
| @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); |
| body { |
| font-family: 'Poppins', sans-serif; |
| background-color: #f8fafc; |
| } |
| .countdown { |
| font-size: 2rem; |
| font-weight: bold; |
| color: #4f46e5; |
| } |
| .payment-status { |
| position: fixed; |
| bottom: 20px; |
| right: 20px; |
| padding: 1rem; |
| border-radius: 0.5rem; |
| z-index: 1000; |
| display: none; |
| animation: slideIn 0.5s ease-out; |
| } |
| .payment-status.success { |
| background-color: #dcfce7; |
| color: #166534; |
| } |
| .payment-status.error { |
| background-color: #fee2e2; |
| color: #991b1b; |
| } |
| @keyframes slideIn { |
| from { transform: translateX(100%); opacity: 0; } |
| to { transform: translateX(0); opacity: 1; } |
| } |
| </style> |
| </head> |
| <body> |
| <div class="min-h-screen flex items-center justify-center py-12 px-4 sm:px-6 lg:px-8"> |
| <div class="max-w-3xl w-full space-y-8"> |
| |
| <div class="bg-white p-8 rounded-lg shadow-lg text-center"> |
| <h2 class="text-2xl font-bold mb-6">Quét mã để thanh toán</h2> |
| |
| |
| <div class="mb-8"> |
| <img src="efa58b38ee1c5d42040d.jpg" alt="QR Code" class="mx-auto max-w-[300px]"> |
| </div> |
|
|
| |
| <div class="border-t border-b py-4 my-6"> |
| <div id="cart-items" class="space-y-4"> |
| |
| </div> |
| <div class="mt-4 text-right"> |
| <div class="text-sm text-gray-600">Tổng tiền:</div> |
| <div id="total" class="text-2xl font-bold text-indigo-600">0₫</div> |
| </div> |
| </div> |
|
|
| <div class="border-t pt-4"> <div class="mb-4"> |
| <label class="block text-sm font-medium text-gray-700 mb-2">Mã đơn hàng của bạn:</label> |
| <div class="flex items-center space-x-2"> |
| <input type="text" id="orderCode" readonly |
| class="px-3 py-2 border border-gray-300 rounded-md bg-gray-50 w-full"> |
| <button onclick="copyOrderCode()" class="p-2 text-indigo-600 hover:text-indigo-800"> |
| <i class="far fa-copy"></i> |
| </button> |
| </div> |
| <p class="text-sm text-gray-500 mt-2"> |
| Vui lòng sử dụng mã này trong nội dung chuyển khoản |
| </p> |
| </div> |
| </div> |
|
|
| |
| <div class="text-center space-y-4"> |
| <div id="countdown" class="countdown">05:00</div> |
| <p class="text-gray-600">Đang chờ thanh toán...</p> |
| </div> |
|
|
| <a href="index.html" class="mt-6 inline-block text-indigo-600 hover:text-indigo-800"> |
| ← Quay lại mua sắm |
| </a> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="paymentStatus" class="payment-status"></div> |
|
|
| |
| <div id="successModal" class="hidden fixed inset-0 z-50 overflow-y-auto" aria-modal="true"> |
| <div class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"> |
| <div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div> |
| <div class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"> |
| <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"> |
| <div class="sm:flex sm:items-start"> |
| <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-green-100 sm:mx-0 sm:h-10 sm:w-10"> |
| <i class="fas fa-check text-green-600"></i> |
| </div> |
| <div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left"> |
| <h3 class="text-lg leading-6 font-medium text-gray-900">Thanh toán thành công!</h3> |
| <div class="mt-2"> |
| <p class="text-sm text-gray-500">Cảm ơn bạn đã mua hàng tại GadgetHub.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse"> |
| <button type="button" onclick="window.location.href='index.html'" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-600 text-base font-medium text-white hover:bg-green-700 focus:outline-none sm:ml-3 sm:w-auto sm:text-sm"> |
| OK |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <script> |
| |
| const slCK = "https://manhteky123-banking.hf.space/currentCK"; |
| const layCK = "https://manhteky123-banking.hf.space/lastCK"; |
| let slckhientai; |
| let checkInterval; |
| let isChecking = false; |
| let timeLeft = 300; |
| |
| |
| let cartItems = JSON.parse(localStorage.getItem('cartItems')) || []; |
| let total = 0; |
| const cartItemsContainer = document.getElementById('cart-items'); |
| const countdownDisplay = document.getElementById('countdown'); |
| |
| |
| const randomCode = Math.random().toString(36).substr(2, 6).toUpperCase(); |
| |
| |
| cartItems.forEach(item => { |
| total += item.price; |
| cartItemsContainer.innerHTML += ` |
| <div class="flex items-center justify-between"> |
| <div class="flex items-center"> |
| <img src="${item.image}" alt="${item.name}" class="h-16 w-16 object-cover rounded"> |
| <div class="ml-4"> |
| <div class="text-sm font-medium text-gray-900">${item.name}</div> |
| <div class="text-sm text-gray-500">${item.price.toLocaleString()}₫</div> |
| </div> |
| </div> |
| </div> |
| `; |
| }); |
| |
| |
| document.getElementById('total').textContent = total.toLocaleString() + '₫'; |
| document.getElementById('orderCode').value = `GH-${randomCode}`; |
| |
| |
| const totalAmount = total; |
| |
| console.log("Tổng tiền cần thanh toán:", totalAmount); |
| |
| |
| function copyOrderCode() { |
| const orderCodeInput = document.getElementById('orderCode'); |
| orderCodeInput.select(); |
| document.execCommand('copy'); |
| |
| const toast = document.createElement('div'); |
| toast.className = 'payment-status success'; |
| toast.textContent = 'Đã sao chép mã đơn hàng!'; |
| document.body.appendChild(toast); |
| |
| setTimeout(() => { |
| toast.remove(); |
| }, 2000); |
| } |
| |
| |
| const countdown = setInterval(() => { |
| const minutes = Math.floor(timeLeft / 60); |
| const seconds = timeLeft % 60; |
| countdownDisplay.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; |
| |
| if (timeLeft <= 0) { |
| clearInterval(countdown); |
| window.location.href = 'index.html'; |
| } |
| timeLeft--; |
| }, 1000); |
| |
| |
| console.log("Khởi tạo kiểm tra giao dịch..."); |
| fetch(slCK) |
| .then(response => response.json()) |
| .then(data => { |
| console.log("Dữ liệu ban đầu:", data); |
| slckhientai = data['currentCK']; |
| console.log("Số lượng hiện tại:", slckhientai); |
| startCheck(); |
| }); |
| |
| function startCheck() { |
| if (isChecking) return; |
| |
| console.log("Bắt đầu kiểm tra giao dịch mỗi 2 giây..."); |
| isChecking = true; |
| |
| checkInterval = setInterval(function () { |
| console.log("Kiểm tra giao dịch lần:", new Date().toLocaleTimeString()); |
| fetch(slCK) |
| .then(response => response.json()) |
| .then(data => { |
| console.log("Dữ liệu từ API currentCK:", data); |
| if (data['currentCK'] != slckhientai) { |
| console.log("Phát hiện giao dịch mới!"); |
| slckhientai = data['currentCK']; |
| |
| fetch(layCK) |
| .then(response => response.json()) |
| .then(data => { |
| console.log("Giao dịch mới:", data); |
| var content = data['content']; |
| var amount = parseInt(data['transferAmount']); |
| |
| if (content.includes(randomCode)) { |
| console.log("Mã đơn hàng khớp!"); |
| if (amount === totalAmount) { |
| |
| localStorage.removeItem('cartItems'); |
| |
| |
| document.getElementById('successModal').classList.remove('hidden'); |
| |
| |
| clearInterval(countdown); |
| countdownDisplay.textContent = 'Đã thanh toán'; |
| countdownDisplay.style.color = '#059669'; |
| |
| |
| stopCheck(); |
| } else { |
| console.log("Số tiền không khớp:", { |
| received: amount, |
| expected: totalAmount |
| }); |
| |
| const toast = document.createElement('div'); |
| toast.className = 'payment-status error'; |
| toast.textContent = 'Số tiền thanh toán không đúng!'; |
| document.body.appendChild(toast); |
| |
| setTimeout(() => { |
| toast.remove(); |
| }, 3000); |
| } |
| } else { |
| console.log("Mã đơn hàng không khớp:", { |
| received: content, |
| expected: randomCode |
| }); |
| |
| const toast = document.createElement('div'); |
| toast.className = 'payment-status error'; |
| toast.textContent = 'Mã đơn hàng không đúng!'; |
| document.body.appendChild(toast); |
| |
| setTimeout(() => { |
| toast.remove(); |
| }, 3000); |
| } |
| }); |
| } |
| }); |
| }, 2000); |
| } |
| |
| function stopCheck() { |
| if (!isChecking) return; |
| console.log("Dừng kiểm tra giao dịch"); |
| clearInterval(checkInterval); |
| isChecking = false; |
| } |
| </script> |
| </body> |
| </html> |
|
|