Уроки курса
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 мин

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

Настройка альтернативного способа оплаты через API Vipps для расширения возможностей магазина. Изучение работы с вебхуками.

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

Альтернативные методы оплаты: Vipps

В современной электронной коммерции важно предоставлять клиентам выбор. В Скандинавских странах доминирует система Vipps (мобильный кошелек). В отличие от Stripe Checkout, где мы используем готовую страницу, интеграция с Vipps часто требует более глубокой работы с REST API.

В этом уроке мы применим Project-Based Learning, добавив второй способ оплаты в наш магазин. Процесс состоит из двух этапов: инициация платежа (создание Payment Intent) и обработка асинхронного ответа через Вебхуки (Webhooks).

Что такое Webhook?

Когда пользователь подтверждает платеж в приложении Vipps на своем телефоне, наш сервер об этом не знает. Пользователь может закрыть браузер, не дождавшись редиректа на страницу успеха. Как нашему серверу узнать, что заказ оплачен?

Для этого используются вебхуки. Webhook — это маршрут в вашем приложении (например, POST /webhooks/vipps), на который сервер Vipps самостоятельно отправляет HTTP-запрос с информацией: "Заказ №123 успешно оплачен". Это гарантирует, что статус заказа обновится в базе данных независимо от действий пользователя в браузере.

php
// routes/web.php
// ОЧЕНЬ ВАЖНО: Маршруты для вебхуков должны быть исключены из проверки CSRF!
Route::post('/webhooks/vipps', [VippsWebhookController::class, 'handle']);

// app/Http/Middleware/VerifyCsrfToken.php
class VerifyCsrfToken extends Middleware {
    protected $except = [
        'webhooks/vipps', // Исключаем маршрут из проверки CSRF
        'webhooks/stripe',
    ];
}

Типичная ошибка новичков (CSRF Token Mismatch)

По умолчанию Laravel защищает все POST-маршруты с помощью CSRF-токена. Это защищает от межсайтовой подделки запросов. Однако сторонние серверы (Vipps, Stripe) ничего не знают о вашем CSRF-токене и не могут его передать. Если не добавить URL вебхука в массив $except в middleware VerifyCsrfToken, Laravel отклонит запрос от платежной системы с ошибкой 419, и статус заказа никогда не обновится!

php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Order;
use Illuminate\Support\Facades\Log;

class VippsWebhookController extends Controller {
    public function handle(Request $request) {
        // Логируем входящий запрос для дебага
        Log::info('Vipps Webhook Received: ', $request->all());

        $orderId = $request->input('orderId');
        $status = $request->input('transactionInfo.status');

        if ($status === 'RESERVE') {
            $order = Order::where('id', $orderId)->first();
            if ($order) {
                $order->update(['status' => 'paid']);
            }
        }

        // Обязательно возвращаем 200 OK, иначе Vipps будет повторять запрос
        return response()->json(['status' => 'success'], 200);
    }
}