Уроки курса
1 Основы синтаксиса PHP 8
60 мин
2 Функции и управляющие конструкции
60 мин
3 Объектно-ориентированное программирование на PHP
60 мин
4 Наследование, интерфейсы и полиморфизм
60 мин
5 Основы баз данных MySQL и работа через PDO
60 мин
6 Архитектурный паттерн MVC
60 мин
7 Введение в Laravel и настройка окружения
60 мин
8 Маршрутизация и контроллеры в Laravel
60 мин
9 Шаблонизатор Blade и создание интерфейса
60 мин
10 Миграции баз данных и Eloquent ORM
60 мин
11 Связи моделей в Eloquent — Настройка связей 'один …
60 мин
12 Аутентификация и защита маршрутов
60 мин
13 Разработка каталога товаров и категорий
60 мин
14 Реализация корзины покупок через сессии
60 мин
15 Оформление заказа и транзакции базы данных
60 мин
16 Интеграция платежной системы Stripe
60 мин
17 Интеграция платежной системы Vipps
60 мин
18 Разработка панели администратора
60 мин
19 Оптимизация и подготовка к production
60 мин
20 Деплой Laravel-приложения на сервер
60 мин
21 Основы PHP 8: Синтаксис, переменные и управляющие конструкции
60 мин
22 Функции и массивы в PHP 8
60 мин
23 Объектно-ориентированное программирование: Классы и объекты
60 мин
24 Продвинутое ООП: Наследование, интерфейсы и полиморфизм
60 мин
25 Основы баз данных: Проектирование БД и работа с …
60 мин
26 Взаимодействие PHP с MySQL через PDO
60 мин
27 Архитектура MVC и введение в фреймворк Laravel
60 мин
28 Маршрутизация и контроллеры в Laravel
60 мин
29 Шаблонизатор Blade: Создание пользовательского интерфейса
60 мин
30 Миграции и Eloquent ORM: Создание таблиц товаров
60 мин
31 Связи в Eloquent ORM: Отношения между моделями
60 мин
32 Аутентификация и авторизация пользователей
60 мин
33 Разработка каталога товаров: Вывод, фильтрация и пагинация
60 мин
34 Реализация корзины покупок с использованием сессий
60 мин
35 Оформление заказа: Работа с формами и валидация
60 мин
36 Транзакции базы данных: Сохранение заказа
60 мин
37 Интеграция платежной системы Stripe
60 мин
38 Интеграция платежной системы Vipps
60 мин
39 Создание панели администратора
60 мин
40 Подготовка к production и деплой приложения
60 мин
41 Основы PHP 8 и синтаксис
60 мин
42 Объектно-ориентированное программирование на PHP
60 мин
43 Продвинутое ООП и интерфейсы
60 мин
44 Основы баз данных и MySQL
60 мин
45 Архитектурный паттерн MVC
60 мин
46 Введение в Laravel и маршрутизация
60 мин
47 Шаблонизатор Blade и верстка интерфейса
60 мин
48 Миграции и структура базы данных
60 мин
49 Eloquent ORM и модели
60 мин
50 Отношения в Eloquent ORM
60 мин
51 Авторизация и защита маршрутов
60 мин
52 Создание каталога товаров
60 мин
53 Реализация корзины покупок
60 мин
54 Оформление заказа и транзакции БД
60 мин
55 Интеграция платежной системы Stripe
60 мин
56 Интеграция платежной системы Vipps
60 мин
57 Панель администратора: управление товарами
60 мин
58 Панель администратора: управление заказами
60 мин
59 Подготовка к production и деплой
60 мин
60 Запуск и тестирование готового интернет-магазина
60 мин

Интеграция платежной системы Stripe

Подключение Stripe API. Создание сессии оплаты (Checkout Session). Обработка успешных и отмененных платежей.

Прогресс урока: 0%

В предыдущем уроке мы научились сохранять заказ в базу данных со статусом 'pending' (в ожидании). Теперь нам нужно получить деньги от клиента. Для этого интернет-магазины используют платежные шлюзы (Payment Gateways). Одним из самых популярных, надежных и удобных для разработчиков шлюзов в мире является Stripe. Stripe берет на себя всю сложную и юридически строгую работу по обработке данных кредитных карт (соответствие стандартам PCI DSS). Мы, как разработчики, не должны хранить или даже пропускать номера кредитных карт через наш сервер. Вместо этого мы используем механизм Stripe Checkout. Мы формируем специальный запрос к API Stripe, передаем туда информацию о товарах, ценах и URL-адреса для возврата пользователя. Stripe генерирует уникальную безопасную страницу оплаты и возвращает нам ссылку на нее. Мы просто перенаправляем (redirect) пользователя на эту страницу. Там он вводит данные карты, Stripe проводит платеж и возвращает пользователя обратно на наш сайт по заранее указанным ссылкам (Success URL или Cancel URL).

Для начала работы со Stripe в Laravel необходимо установить их официальный SDK. Это делается через терминал командой: composer require stripe/stripe-php. После установки пакета, критически важно правильно настроить доступы. Зарегистрировавшись в панели разработчика Stripe, вы получите два ключа: Публичный ключ (Public Key) и Секретный ключ (Secret Key). Секретный ключ никогда не должен попасть в публичный доступ или в систему контроля версий (Git)! Поэтому мы сохраняем его в файле .env нашего проекта под переменной, например, STRIPE_SECRET. В коде приложения мы будем обращаться к этому ключу через функцию env('STRIPE_SECRET'). Перед любым обращением к API Stripe мы должны инициализировать библиотеку, передав ей этот секретный ключ. Это делается статическим методом \Stripe\Stripe::setApiKey().

php
use Illuminate\Http\Request;
use App\Models\Order;

public function pay(Order $order) {
    // 1. Устанавливаем секретный ключ из файла .env
    \Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));

    // 2. Создаем сессию оплаты (Checkout Session)
    $checkout_session = \Stripe\Checkout\Session::create([
        'line_items' => [[
            'price_data' => [
                'currency' => 'usd',
                'product_data' => [
                    'name' => 'Заказ #' . $order->id,
                ],
                // Stripe принимает сумму в минимальных единицах валюты (центах)
                'unit_amount' => intval($order->total_price * 100),
            ],
            'quantity' => 1,
        ]],
        'mode' => 'payment',
        // Куда вернуть пользователя при успехе
        'success_url' => route('checkout.success') . '?session_id={CHECKOUT_SESSION_ID}',
        // Куда вернуть при отмене
        'cancel_url' => route('checkout.cancel'),
    ]);

    // 3. Перенаправляем пользователя на страницу Stripe
    return redirect($checkout_session->url);
}

Разберем массив параметров, который мы передаем в метод Session::create. Ключ line_items — это массив товаров, которые оплачивает пользователь. В нашем упрощенном примере мы передаем не каждый товар отдельно, а весь заказ как одну позицию: 'Заказ #X'. Самый важный нюанс, на котором спотыкаются 90% новичков — это параметр unit_amount. Stripe, как и большинство финансовых API, работает исключительно с целыми числами (integer), чтобы избежать проблем с потерей точности при операциях с плавающей точкой (float). Поэтому сумма передается в минимальных единицах валюты. Для долларов (USD) это центы. Если заказ стоит $20.50, мы должны передать число 2050. В коде мы делаем это умножением на 100 и приведением к целому числу: intval($order->total_price * 100). Параметры success_url и cancel_url определяют маршруты в нашем Laravel-приложении, куда Stripe сделает редирект после взаимодействия. В success_url мы добавляем специальный плейсхолдер {CHECKOUT_SESSION_ID}, который Stripe автоматически заменит на реальный ID сессии.

Задание

Интегрируйте Stripe в ваш процесс оформления заказа.

  • Установите пакет stripe/stripe-php через Composer.
  • Добавьте STRIPE_SECRET в ваш файл .env (используйте тестовые ключи Stripe).
  • Создайте метод pay() в контроллере для генерации Stripe Checkout Session.
  • Убедитесь, что вы умножаете цену на 100 для конвертации в центы.
  • Настройте маршруты success_url и cancel_url в web.php.
  • Верните redirect($checkout_session->url) для перенаправления клиента.
10 баллов

В чем заключается главная причина использования файла .env для хранения ключей API (например, STRIPE_SECRET)?

В каких единицах измерения Stripe ожидает получить параметр 'unit_amount' для валюты USD? Напишите одно слово (во множественном числе).