Stripe для JavaScript (Node.js): полное руководство с примерами

Онлайн-тренажер Python для начинающих

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

Начать курс

Stripe для JavaScript (Node.js): полное руководство с примерами

1. Что это и зачем нужна

Stripe — это ведущая платёжная платформа, которая позволяет интернет-магазинам, SaaS-сервисам и любым другим веб-приложениям принимать платежи от клиентов по всему миру. Официальная библиотека stripe для Node.js предоставляет разработчикам полный набор инструментов для интеграции платёжного API Stripe в серверную часть приложения. Она абстрагирует сложность прямых HTTP-запросов к API Stripe, предлагая удобный, типизированный и предсказуемый интерфейс на JavaScript.

Зачем нужна эта библиотека? В современной веб-разработке безопасная обработка платежей — одна из самых критичных задач. Stripe берёт на себя соблюдение стандартов PCI DSS, обработку чувствительных данных (номера карт, CVV) и управление сложными сценариями (подписки, возвраты, споры). Библиотека для Node.js позволяет легко создавать платёжные формы, управлять клиентами, создавать подписки, обрабатывать вебхуки и генерировать отчёты — и всё это с использованием асинхронного кода на основе промисов.

Благодаря этой библиотеке вы можете сосредоточиться на бизнес-логике вашего приложения, а не на низкоуровневых деталях платёжных протоколов. Она идеально подходит для Node.js-приложений, работающих на Express, Koa, Fastify или любом другом фреймворке. Библиотека активно поддерживается компанией Stripe, регулярно обновляется и имеет огромное сообщество.

2. Установка

Для установки библиотеки Stripe в ваш проект Node.js используйте менеджер пакетов npm или yarn. Выполните одну из следующих команд в корневой директории проекта:

# Используя npm
npm install stripe

# Используя yarn
yarn add stripe

После установки вы можете импортировать библиотеку в свой код:

// Современный синтаксис (ES Modules)
import Stripe from 'stripe';

// Или CommonJS (Node.js по умолчанию)
const Stripe = require('stripe');

Важно: Для работы с библиотекой вам понадобится секретный ключ (sk_test_... для тестового режима или sk_live_... для продакшена). Ключ можно получить в панели управления Stripe.

3. Быстрый старт — минимальный рабочий пример

Давайте создадим простой скрипт, который создаёт платёжное намерение (PaymentIntent) — это стандартный способ принять разовый платёж.

// Импортируем библиотеку
const Stripe = require('stripe');
// Инициализируем с секретным ключом (замените на ваш тестовый ключ)
const stripe = Stripe('sk_test_XXXXXXXXXXXXXXXXXXXXXXXX');

async function createPayment() {
    try {
        // Создаём PaymentIntent на сумму 2000 центов (20 USD)
        const paymentIntent = await stripe.paymentIntents.create({
            amount: 2000,
            currency: 'usd',
            // Описание платежа (опционально)
            description: 'Тестовый платёж из Node.js',
            // Автоматически захватывать платеж (true) или только авторизовать (false)
            capture_method: 'automatic',
        });

        console.log('PaymentIntent успешно создан:');
        console.log(`ID: ${paymentIntent.id}`);
        console.log(`Статус: ${paymentIntent.status}`);
        console.log(`Сумма: ${paymentIntent.amount} ${paymentIntent.currency.toUpperCase()}`);
    } catch (error) {
        console.error('Ошибка при создании PaymentIntent:', error.message);
    }
}

createPayment();

Этот код создаёт платёжное намерение. На фронтенде вам нужно будет использовать client_secret из объекта paymentIntent, чтобы подтвердить платёж с помощью Stripe Elements или Stripe.js.

4. Основные методы/функции/классы

Библиотека Stripe для Node.js предоставляет множество сервисов (например, stripe.customers, stripe.paymentIntents). Ниже приведены 8 ключевых методов с примерами.

4.1. stripe.paymentIntents.create

Сигнатура: stripe.paymentIntents.create(params: PaymentIntentCreateParams, options?: RequestOptions): Promise<Stripe.PaymentIntent>

Что делает: Создаёт новый объект PaymentIntent, который представляет собой намерение провести платёж. Это основной метод для приёма разовых платежей.

const paymentIntent = await stripe.paymentIntents.create({
    amount: 1500, // 15.00 USD
    currency: 'eur',
    payment_method_types: ['card'],
    metadata: { order_id: '12345' }
});
console.log(paymentIntent.id); // pi_xxx

4.2. stripe.paymentIntents.retrieve

Сигнатура: stripe.paymentIntents.retrieve(id: string, options?: RequestOptions): Promise<Stripe.PaymentIntent>

Что делает: Получает объект PaymentIntent по его уникальному идентификатору. Полезно для проверки статуса платежа.

const paymentIntent = await stripe.paymentIntents.retrieve('pi_xxx');
console.log(`Статус: ${paymentIntent.status}`); // 'succeeded', 'requires_payment_method' и т.д.

4.3. stripe.customers.create

Сигнатура: stripe.customers.create(params: CustomerCreateParams, options?: RequestOptions): Promise<Stripe.Customer>

Что делает: Создаёт нового клиента в Stripe. Клиент — это объект, к которому можно привязать способы оплаты, подписки и историю платежей.

const customer = await stripe.customers.create({
    email: 'user@example.com',
    name: 'Иван Иванов',
    description: 'VIP клиент'
});
console.log(customer.id); // cus_xxx

4.4. stripe.subscriptions.create

Сигнатура: stripe.subscriptions.create(params: SubscriptionCreateParams, options?: RequestOptions): Promise<Stripe.Subscription>

Что делает: Создаёт подписку для клиента. Необходимо указать клиента и список цен (Price ID). Подписка будет автоматически списывать средства согласно интервалу.

const subscription = await stripe.subscriptions.create({
    customer: 'cus_xxx',
    items: [{ price: 'price_xxx' }], // Price ID из каталога
    trial_period_days: 7, // Бесплатный пробный период
});
console.log(`Подписка создана: ${subscription.id}`);

4.5. stripe.products.create

Сигнатура: stripe.products.create(params: ProductCreateParams, options?: RequestOptions): Promise<Stripe.Product>

Что делает: Создаёт товар (Product) в вашем каталоге Stripe. Товары используются для группировки цен (Prices) и управления подписками.

const product = await stripe.products.create({
    name: 'Премиум-доступ',
    description: 'Доступ ко всем функциям на 1 месяц',
    active: true,
});
console.log(`Товар создан: ${product.id}`); // prod_xxx

4.6. stripe.prices.create

Сигнатура: stripe.prices.create(params: PriceCreateParams, options?: RequestOptions): Promise<Stripe.Price>

Что делает: Создаёт цену (Price) для товара. Цена определяет сумму, валюту и интервал (для подписок).

const price = await stripe.prices.create({
    product: 'prod_xxx',
    unit_amount: 999, // 9.99 USD
    currency: 'usd',
    recurring: { interval: 'month' }, // Для подписки
});
console.log(`Цена создана: ${price.id}`); // price_xxx

4.7. stripe.checkout.sessions.create

Сигнатура: stripe.checkout.sessions.create(params: SessionCreateParams, options?: RequestOptions): Promise<Stripe.Checkout.Session>

Что делает: Создаёт сессию Checkout — готовую, настраиваемую платёжную страницу, размещённую на домене Stripe. Это самый быстрый способ начать принимать платежи.

const session = await stripe.checkout.sessions.create({
    success_url: 'https://example.com/success',
    cancel_url: 'https://example.com/cancel',
    line_items: [{ price: 'price_xxx', quantity: 1 }],
    mode: 'payment', // или 'subscription'
});
console.log(`URL для оплаты: ${session.url}`); // Переадресуйте пользователя сюда

4.8. stripe.webhooks.constructEvent

Сигнатура: stripe.webhooks.constructEvent(payload: Buffer | string, signature: string, secret: string): Stripe.Event

Что делает: Верифицирует и конструирует событие вебхука из сырого тела запроса и заголовка stripe-signature. Используется для обработки асинхронных уведомлений от Stripe (например, успешный платёж).

// Пример в Express
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
    const sig = req.headers['stripe-signature'];
    let event;
    try {
        event = stripe.webhooks.constructEvent(req.body, sig, 'whsec_xxx');
    } catch (err) {
        return res.status(400).send(`Webhook Error: ${err.message}`);
    }
    // Обработка события
    if (event.type === 'payment_intent.succeeded') {
        console.log('Платёж успешен!');
    }
    res.json({received: true});
});

5. Реальный практический пример (100-200 строк кода)

В этом примере мы создадим простой REST API на Express, который принимает платежи через Stripe Checkout, обрабатывает вебхуки и управляет подписками.

const express = require('express');
const Stripe = require('stripe');
const app = express();

// Инициализация Stripe
const stripe = Stripe(process.env.STRIPE_SECRET_KEY);

// Middleware для парсинга JSON (для API)
app.use(express.json());

// Middleware для парсинга raw body (для вебхуков)
app.use('/webhook', express.raw({ type: 'application/json' }));

// --- Эндпоинты API ---

// 1. Создание сессии Checkout для разового платежа
app.post('/api/create-checkout-session', async (req, res) => {
    try {
        const { priceId, customerId } = req.body; // priceId и опционально customerId
        const session = await stripe.checkout.sessions.create({
            customer: customerId || undefined,
            line_items: [{ price: priceId, quantity: 1 }],
            mode: 'payment',
            success_url: `${process.env.DOMAIN}/success?session_id={CHECKOUT_SESSION_ID}`,
            cancel_url: `${process.env.DOMAIN}/cancel`,
        });
        res.json({ url: session.url });
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

// 2. Создание подписки (создаём клиента, если его нет)
app.post('/api/create-subscription', async (req, res) => {
    try {
        const { email, priceId } = req.body;
        // Создаём или находим клиента (упрощённо)
        const customer = await stripe.customers.create({ email });
        const subscription = await stripe.subscriptions.create({
            customer: customer.id,
            items: [{ price: priceId }],
            payment_behavior: 'default_incomplete', // Не списывать сразу
            expand: ['latest_invoice.payment_intent'],
        });
        res.json({
            subscriptionId: subscription.id,
            clientSecret: subscription.latest_invoice.payment_intent.client_secret,
        });
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

// 3. Получение информации о клиенте
app.get('/api/customer/:id', async (req, res) => {
    try {
        const customer = await stripe.customers.retrieve(req.params.id);
        res.json(customer);
    } catch (error) {
        res.status(404).json({ error: 'Customer not found' });
    }
});

// --- Вебхук ---
app.post('/webhook', async (req, res) => {
    const sig = req.headers['stripe-signature'];
    let event;
    try {
        event = stripe.webhooks.constructEvent(req.body, sig, process.env.STRIPE_WEBHOOK_SECRET);
    } catch (err) {
        console.error('Webhook signature verification failed.', err.message);
        return res.status(400).send(`Webhook Error: ${err.message}`);
    }

    // Обрабатываем события
    switch (event.type) {
        case 'checkout.session.completed':
            const session = event.data.object;
            console.log(`Плат                    

Рекомендаций