Уроки курса
Интеграция платежной системы Stripe
Подключение Stripe Checkout Session для безопасной обработки платежей банковскими картами. Изучение принципов работы платежных шлюзов.
Введение в платежные шлюзы
На предыдущих этапах мы реализовали корзину и сохранение заказа в базу данных. Теперь наш интернет-магазин должен научиться принимать реальные деньги. Для этого используются платежные шлюзы (Payment Gateways) — сервисы, которые выступают посредниками между вашим сайтом, клиентом и банком.
Одним из самых популярных и удобных для разработчиков шлюзов является Stripe. В этом уроке мы применим подход Direct Instruction: шаг за шагом разберем процесс создания платежной сессии.
Важное правило безопасности (PCI Compliance): Мы никогда не должны сохранять номера банковских карт на нашем сервере. Это требует сложной сертификации. Вместо этого мы будем использовать Stripe Checkout — специальную страницу оплаты, размещенную на защищенных серверах Stripe. Пользователь переходит туда, вводит данные карты, а Stripe возвращает нас обратно с результатом.
composer require stripe/stripe-php
# Затем добавьте ключи в файл .env:
STRIPE_KEY=pk_test_вашкод...
STRIPE_SECRET=sk_test_вашкод...
Настройка контроллера оплаты
Согласно методологии Chunking, разобьем процесс на части. Первая часть — подготовка данных корзины в формат, который понимает Stripe. Stripe ожидает массив line_items, где цены указываются в центах (или минимальных единицах валюты). То есть 10 долларов = 1000 центов. Это делается для избежания ошибок округления при работе с числами с плавающей точкой (float).
Типичная ошибка новичков: передача цены как 10.50. Stripe выдаст ошибку. Нужно передавать 1050.
use Illuminate\Support\Facades\DB;
use App\Models\Order;
use App\Models\OrderItem;
public function processPayment() {
\Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
// Создаем сессию оплаты
$checkout_session = \Stripe\Checkout\Session::create([
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => 'Test Product'],
'unit_amount' => 2000, // 20.00 USD
],
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => route('checkout.success'),
'cancel_url' => route('checkout.cancel'),
]);
// Перенаправляем пользователя на страницу Stripe
return redirect($checkout_session->url);
}
Разбор кода Stripe Session
Давайте подробно разберем массив конфигурации:
line_items— массив товаров. В реальном проекте вы пройдетесь цикломforeachпо вашей сессионной корзине, формируя этот массив.price_data— информация о цене и валюте.mode => 'payment'— означает разовый платеж (в отличие от 'subscription' для подписок).success_urlиcancel_url— маршруты нашего приложения, куда Stripe перенаправит пользователя после успешной или отмененной оплаты соответственно.
После возврата на success_url статус заказа в базе данных обновляется с 'pending' на 'paid'.