Интеграция платежной системы Stripe
Подключение Stripe API. Создание сессии оплаты (Checkout Session). Обработка успешных и отмененных платежей.
В предыдущем уроке мы научились сохранять заказ в базу данных со статусом '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().
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) для перенаправления клиента.
В чем заключается главная причина использования файла .env для хранения ключей API (например, STRIPE_SECRET)?
В каких единицах измерения Stripe ожидает получить параметр 'unit_amount' для валюты USD? Напишите одно слово (во множественном числе).
Флеш-карточки
Что такое Stripe Checkout Session?
Нажмите, чтобы увидеть ответ
Специальная защищенная страница, генерируемая на серверах Stripe, где пользователь вводит данные карты для оплаты конкретного заказа.
Нажмите, чтобы вернуться