Настройка интеграции LMS с платёжными системами (продажа курсов)

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка интеграции LMS с платёжными системами (продажа курсов)
Средняя
~5 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Настройка интеграции LMS с платёжными системами (продажа курсов)

Монетизация LMS — это не только кнопка «Купить». Полная интеграция с платёжной системой включает одноразовые покупки, подписки, купоны, рассрочку, возвраты и корректный учёт транзакций.

Выбор платёжной системы

Система Регионы Особенности
Stripe Весь мир Лучшее API, подписки из коробки, Stripe Checkout
PayPal Весь мир Широкое доверие пользователей, PayPal Express
ЮKassa Россия/СНГ Российские карты, РНКО, QR-код
LiqPay Украина Приват24, широко известен
Paddle SaaS-продукты Merchant of Record, берёт на себя НДС

Для международных LMS — Stripe как основа + региональные шлюзы для конкретных рынков.

Stripe: базовая интеграция

// Backend: создание Checkout Session
async function createCheckoutSession(userId, courseId, priceId, couponId = null) {
  const user = await db.users.findByPk(userId);
  const course = await db.courses.findByPk(courseId);

  const session = await stripe.checkout.sessions.create({
    customer_email: user.email,
    client_reference_id: `${userId}:${courseId}`,  // Свяжем в webhook
    line_items: [{
      price: priceId,  // Stripe Price ID
      quantity: 1,
    }],
    discounts: couponId ? [{ coupon: couponId }] : [],
    mode: 'payment',  // Или 'subscription' для подписок
    success_url: `${process.env.APP_URL}/courses/${courseId}?payment=success&session_id={CHECKOUT_SESSION_ID}`,
    cancel_url: `${process.env.APP_URL}/courses/${courseId}?payment=cancelled`,
    metadata: {
      userId,
      courseId,
    },
    payment_intent_data: {
      metadata: { userId, courseId },
    },
  });

  return session.url;
}

Webhook обработчик

Не доверяйте success_url для подтверждения оплаты — пользователь может его подделать. Всегда используйте webhook:

app.post('/webhooks/stripe', express.raw({ type: 'application/json' }), 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) {
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }

  switch (event.type) {
    case 'checkout.session.completed': {
      const session = event.data.object;
      if (session.payment_status === 'paid') {
        const { userId, courseId } = session.metadata;
        await enrollStudentAfterPayment(userId, courseId, session.id);
      }
      break;
    }
    case 'charge.refunded': {
      await handleRefund(event.data.object);
      break;
    }
    case 'customer.subscription.deleted': {
      await revokeSubscriptionAccess(event.data.object.customer);
      break;
    }
  }

  res.json({ received: true });
});

Модели монетизации

Разовая покупка — стандартная Stripe Payment. Студент платит один раз, получает доступ навсегда (или на N месяцев).

Подписка — Stripe Subscriptions. Доступ ко всем курсам пока подписка активна. При отмене — отзываем доступ через webhook customer.subscription.deleted.

Рассрочка — несколько платежей через Stripe payment_intent с installment_plan или вручную через scheduled invoices.

Корпоративные лицензии — покупка N мест для команды. В БД: таблица licenseslicense_seats → привязка к пользователям.

Промокоды

// Создание промокода
const coupon = await stripe.coupons.create({
  name: 'SUMMER2026',
  percent_off: 30,          // Или amount_off в копейках
  duration: 'once',
  redeem_by: Math.floor(new Date('2026-09-01').getTime() / 1000),
  max_redemptions: 500,
});

const promotionCode = await stripe.promotionCodes.create({
  coupon: coupon.id,
  code: 'SUMMER2026',
  restrictions: {
    first_time_transaction: false,
  },
});

На фронтенде — поле ввода промокода с валидацией через Stripe API перед оформлением.

ЮKassa для российских пользователей

use YooKassa\Client;

$client = new Client();
$client->setAuth(SHOP_ID, SECRET_KEY);

$payment = $client->createPayment([
    'amount' => ['value' => '3900.00', 'currency' => 'RUB'],
    'capture' => true,
    'confirmation' => [
        'type' => 'redirect',
        'return_url' => env('APP_URL') . '/payment/return',
    ],
    'description' => "Курс: {$course->title}",
    'metadata' => ['user_id' => $userId, 'course_id' => $courseId],
], uniqid('', true));

return $payment->getConfirmation()->getConfirmationUrl();

Учёт транзакций

CREATE TABLE transactions (
  id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id             UUID REFERENCES users(id),
  course_id           UUID REFERENCES courses(id),
  provider            VARCHAR(50),  -- 'stripe', 'yookassa', 'paypal'
  provider_payment_id VARCHAR(200) UNIQUE,
  amount              NUMERIC(10,2),
  currency            VARCHAR(3),
  status              VARCHAR(50),  -- 'pending', 'succeeded', 'failed', 'refunded'
  coupon_code         VARCHAR(100),
  discount_amount     NUMERIC(10,2) DEFAULT 0,
  created_at          TIMESTAMPTZ DEFAULT NOW()
);

Сроки

Stripe интеграция с разовой покупкой, webhook, зачислением на курс и промокодами — 4–5 дней. Подписочная модель — дополнительно 2–3 дня. ЮKassa — 2–3 дня. Корпоративные лицензии — 3–4 дня.