NEW CARDING CHAT IN TELEGRAM

Создание собственного чекера CC с помощью Stripe

Friend

Professional
Messages
2,598
Reputation
194
Reaction score
813
Points
113
Сервисы чекеров сейчас в полном беспорядке. Их службы падают как мухи — либо полностью переходят в автономный режим, либо становятся настолько ненадежными, что могли бы ими и быть. А работающие? Они либо медленные, либо выдают больше ложных отказов, чем фактических результатов. Неудивительно, что мой личный ящик завален одним и тем же вопросом: «Как мне создать собственный чекер?»

Что ж, я наконец-то все разложу по полочкам. Создание собственного чекера — сложная задача с несколькими подходами, но мы собираемся решать ее шаг за шагом. Это руководство является первым в серии, в которой мы рассмотрим различные методы, начиная с самого простого: проверка карт через API Stripes.

Прямо сейчас вы работаете с самыми необходимыми функциями — проверкой Stripe, которая может проверять одну карту за раз; в следующем руководстве мы улучшим ее с помощью методов массовой проверки, проверок 3DS и исследований в области других торговых интеграций.

Почему именно Stripe?

Stripe.png


Если вы следили за моими записями, то вы уже знаете мою позицию по этому вопросу: проверка через Stripe плоха. Не потому, что она «убивает» карты — технически это неправда. Настоящая проблема в том, что система Radar компании Stripe заносит ваши карты в черный список (generic_decline). Каждая карта, которую вы пропускаете через проверяющий Stripe, помечается как часть атаки «тестирования карт», и удачи вам в дальнейшем с использованием этой карты на любом сайте, работающем на Stripe. Но отчаянные времена требуют отчаянных мер. Может быть, вы все равно заходите на сайты, не работающие на Stripe, или вам просто нужна быстрая проверка. Этот метод все еще работает — просто поймите, во что вы ввязываетесь.

API Stripe и биннеры

Binners.png


Это те биннеры, которых мы поджарили ранее? Оказывается, они те же самые, которые управляют этими "SK checker services" - в основном управляемыми технически подкованными индийцами, которые придумали, как автоматизировать свою мусорную стратегию. Они вручную генерируют и тестируют массовые карты, скрапингуя сайты электронной коммерции для публичных ключей Stripe. Тот же подход обезьяны-пишущей машинки, только с более навороченными инструментами.

Declined.png


И они нацелены не только на Stripe. Braintree, Square, любой платежный процессор с открытыми ключами, выставленными на веб-сайтах, подвергается нападкам этих скриптов. Но сегодня мы сосредоточимся на Stripe, потому что он наиболее распространен, и с его API на самом деле прилично работать, даже если эти клоуны им злоупотребляют.

Вот как проверка Stripe работает под капотом:

dBVXRTM.png


  • Токенизация: данные вашей карты преобразуются в одноразовый токен.
  • Создание способа оплаты: этот токен становится «способом оплаты».
  • Варианты аутентификации: вы можете просто привязать карту (бесплатно) или запустить небольшую комиссию за аутентификацию (0,50–1$) для проверки средств.

Создание собственного чекера

Итак, давайте настроим вас на Stripe таким образом, чтобы вы не выглядели как некомпетентный новичок.

1. Подготовьте свое снаряжение:
  • Премиум-прокси США - обнаружение мошенничества Stripes мгновенно отметит дешевые прокси. Резидентные прокси - ваш лучший выбор здесь.
  • Подлинные данные личности (SSN + DOB). Недостоверная поддельная информация — это билет в один конец к закрытию аккаунта.
  • Бизнес-фронт просмотрите Flippa.com для небольшого устоявшегося сайта электронной коммерции. Скопируйте их бизнес-модель и данные — это поможет вам пройти процесс проверки Stripe.
  • Банковская информация любые правдоподобные номера маршрутизации и счета будут работать, поскольку мы фактически не обрабатываем платежи. Просто убедитесь, что номера соответствуют правильному формату.

2. Настройка учетной записи Stripe:
  • Качество fullz (SSN DOB адрес и т.д.). Bender-Search — мой текущий выбор — их данные точны и дешевы по 50 центов за комплект. Хотя существуют и другие поставщики, качество Benders неизменно стабильно.
    Products.png
  • Зарегистрируйтесь на stripe.com, используя адрес электронной почты, к которому у вас есть доступ.
  • Личная информация используйте имя и дату рождения из вашего полного номера. SSN должен полностью совпадать.
    Personal info.png
  • Подробности бизнеса:
    • Выберите «Незарегистрированный» в качестве типа бизнеса
      Business type.png
    • Используйте название и описание вашего сайта электронной коммерции
      Description.png

      Public details.png
    • Выберите отрасль, которая соответствует продуктам вашего сайта
  • Банковские реквизиты:
    • При запросе банковских реквизитов выберите «Ввести банковские реквизиты вручную» — в противном случае будет выведен запрос Plaid, что нам не нужно.
    • Найдите реальный маршрутный номер в банке в городе вашего проживания.
      JaDXoGx.png
    • Сгенерируйте случайный 10-12-значный номер счета
    • Используйте то же имя, что и в вашей личной информации.
      UtCwsVf.png
  • После проверки возьмите ключи API с панели управления — они вам понадобятся для проверки.
    dEhLzIm.png

    qwL3PkP.png

3. Настройка чекера:
Раньше вы могли просто использовать свой ключ sk_live и запустить скрипт Python, чтобы выдать токен и проверить карту. В наши дни Stripe не такой уж и глупый — если вы попытаетесь напрямую отправить сырые номера кредитных карт, вы получите ошибку вроде этой:

01cChVE.png


Code:
{
  "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. For more information, see https://dashboard.stripe.com/account/integration/settings. If you are qualified to handle card data directly, see https://support.stripe.com/questions/enabling-access-to-raw-card-data-apis.",
  "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, теперь вам придется использовать фронтенд Stripes JavaScript для сбора и токенизации данных карты. Существуют обходные пути — я подробнее расскажу о них в будущем руководстве — но для этого поверхностного подхода мы переключимся на простую настройку сервера PHP.

Вот что вам нужно сделать:

95WRtQr.png


  1. Поместите следующие файлы в одну папку:
    • index.html
    • validate.php
    • composer.json
  2. Запустите «composer install», чтобы установить модуль Stripe PHP.
  3. Разместите папку локально (используя XAMPP WAMP или любой простой PHP- сервер).
  4. Откройте index.html в своем браузере. Он запросит у вас ключи sk_live и pk_live, а затем отобразит защищенное поле для оплаты Stripe.
  5. Введите данные вашей карты; после отправки бэкэнд (validate.php) использует платежное намерение для проверки легитимности карты и возвращает ответ.

Ниже приведен полный код для этой настройки. (Отнеситесь серьезно — не изменяйте ничего из этого.)

index.html:
Code:
<!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, Oxygen, Ubuntu, Cantarell, 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);
                }

                // Handle 3D Secure authentication if required
                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:
Code:
<?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';

// Ensure the input is valid JSON before decoding
$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();
}

// Helper function to validate JSON
function isValidJson($string) {
    json_decode($string);
    return json_last_error() === JSON_ERROR_NONE;
}

try {
    \Stripe\Stripe::setApiKey($secret_key);

    // Create a SetupIntent and confirm it with the payment method
    $setup_intent = \Stripe\SetupIntent::create([
        'payment_method' => $payment_method_id,
        'confirm' => true,
        'usage' => 'off_session',
        'return_url' => 'https://crdpro.cc',
        'automatic_payment_methods' => [
            'enabled' => true,
            'allow_redirects' => 'never'
        ]
    ]);

    // Check the status
    $status = $setup_intent->status;
    $success = in_array($status, ['succeeded', 'requires_action', 'processing']);

    // If 3D Secure authentication is required
    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:
Code:
{
    "require": {
        "stripe/stripe-php": "^13.0"
    }
}

После того, как все настроено правильно:

J8PLECk.png

G85ElSb.png

v1ICjIF.png


Еще кое-что, что стоит запомнить

BPaqPEu.png


Вся суть привязки и аутентификации проста. Привязка просто создает способ оплаты, который похож на заполнение данных вашей карты без особой помпы. Аутентификация, с другой стороны, фактически пытается взимать крошечную сумму (представьте себе 0 долларов или несколько долларов) за проверку карты. Это дает вам больше ясности относительно того, активна ли карта, но также оставляет более заметный след и риск ее уничтожения.

Когда дело доходит до управления учетными записями, Stripe беспощаден. В тот момент, когда вы начинаете запускать шаблоны, которые выглядят подозрительно, они ударят по тормозам и уничтожат вашу учетную запись. Ваш лучший выбор? Поочередно используйте несколько учетных записей Stripe, используйте разные IP-адреса для каждой и держите объем проверки карт в разумных пределах. Не будьте идиотом, который думает, что запуск горы тестов на одной учетной записи — это хорошая идея.

Наконец, обработка ошибок — это ваш спасательный круг. Научитесь анализировать каждое сообщение об ошибке — иногда это означает, что карта поджарена, а иногда это просто упрямая сука Stripe. В любом случае понимание этих сообщений означает, что вы можете корректировать свой подход на лету.

Это не ракетостроение, но если вы проигнорируете эти указания, вы будете спотыкаться, как новичок. Используйте эти стратегии, чтобы оставаться на шаг впереди, и помните: дьявол кроется в деталях.

Еще больше информации

Это только начало нашей серии по созданию чекеров, так как она чрезвычайно проста и проста. Мы начали с версии с учебными колесами — проверка API Stripe. В следующих руководствах мы погрузимся в настоящую тему: создание собственных систем аутентификации и массовых чекеров, работающих с различными платежными процессорами, создание собственного бота Telegram CC Checker и т. д., а также создание чекеров, которые действительно предоставляют вам полезные данные помимо «действителен/недействителен».

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

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

(c) Телеграм: d0ctrine
Наш чат в Телеграм: BinX Labs
 
Last edited:
Top