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

Альтернативные методы оплаты. Работа с REST API Vipps. Настройка и обработка вебхуков (Webhooks) для асинхронного подтверждения платежей.

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

В современном e-commerce одного способа оплаты часто бывает недостаточно. Пользователи предпочитают использовать локальные или мобильные платежные системы. В этом уроке мы рассмотрим интеграцию Vipps — популярной мобильной платежной системы в Норвегии. В отличие от Stripe Checkout, который предоставляет готовую страницу, интеграция с Vipps часто требует более глубокого взаимодействия с их REST API. Процесс состоит из нескольких шагов: сначала мы должны получить токен доступа (Access Token), используя наши Client ID и Client Secret. Затем, с этим токеном, мы отправляем POST-запрос на создание платежа (Payment Intent), указывая номер телефона клиента (опционально) и сумму. Vipps возвращает URL, который мы можем открыть в мобильном приложении или браузере клиента для подтверждения оплаты отпечатком пальца или пин-кодом. Это отличный пример архитектуры микросервисного взаимодействия, где наш бэкенд общается с бэкендом другой компании.

Самая сложная и интересная часть работы с мобильными платежами — это получение статуса оплаты. Когда клиент нажимает 'Оплатить' в приложении Vipps, он может закрыть браузер, у него может пропасть интернет, или телефон может разрядиться до того, как произойдет редирект на наш success_url. Если мы будем полагаться только на редирект, мы потеряем множество оплаченных заказов! Для решения этой проблемы используются Вебхуки (Webhooks). Вебхук — это механизм обратного вызова. Мы заранее говорим серверу Vipps: «Когда статус этого платежа изменится (например, деньги будут успешно списаны), отправь POST-запрос на наш URL-адрес». Наш Laravel-сервер должен иметь специальный маршрут (например, /api/webhooks/vipps), который всегда доступен из интернета. Этот маршрут принимает запрос от Vipps, проверяет его подлинность (чтобы хакеры не могли подделать статус оплаты), находит заказ в базе данных и меняет его статус с 'pending' на 'paid'.

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)
    {
        // 1. Логируем входящий запрос для отладки
        Log::info('Vipps Webhook Received', $request->all());

        // 2. В реальном проекте здесь должна быть проверка подписи (Signature Validation)
        // чтобы убедиться, что запрос пришел именно от Vipps.

        $data = $request->all();
        
        // Проверяем, что транзакция успешна
        if (isset($data['transactionInfo']['status']) && $data['transactionInfo']['status'] === 'RESERVE') {
            
            // Находим заказ по ID, который мы передавали при создании платежа
            $orderId = $data['orderId'];
            $order = Order::find($orderId);

            if ($order) {
                // 3. Обновляем статус заказа
                $order->status = 'paid';
                $order->save();
                Log::info("Order {$orderId} marked as paid.");
            }
        }

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

При разработке вебхуков локально возникает проблема: сервер Vipps находится в глобальном интернете, а ваш локальный сервер Laravel (например, http://localhost:8000) недоступен извне. Сервер Vipps просто не сможет отправить вам POST-запрос. Для решения этой проблемы разработчики используют инструменты локального проброса портов, такие как Ngrok или Expose. Запустив команду ngrok http 8000, вы получаете временный публичный HTTPS-адрес (например, https://a1b2c3d4.ngrok.io), который туннелирует весь трафик на ваш локальный localhost:8000. Именно этот публичный адрес вы указываете в настройках вебхука в панели разработчика Vipps или передаете в параметрах при создании платежа. Это позволяет вам тестировать полный цикл оплаты, включая асинхронные уведомления от банка, прямо на вашем рабочем компьютере.

Задание

Настройте прием вебхуков для симуляции оплаты через Vipps.

  • Создайте контроллер VippsWebhookController.
  • Добавьте маршрут POST /api/webhooks/vipps в файле routes/api.php (чтобы исключить проверку CSRF-токена).
  • В методе handle() напишите логику поиска заказа и изменения его статуса на 'paid'.
  • Скачайте и запустите Ngrok для проброса порта вашего приложения.
  • Используя Postman, отправьте тестовый POST-запрос на ваш ngrok-адрес, имитируя структуру данных от Vipps, и проверьте, изменился ли статус заказа в БД.
10 баллов

Почему для обработки успешной оплаты надежнее использовать Вебхуки (Webhooks), а не редирект (success_url)?

Напишите название популярного инструмента, который создает временный публичный URL для вашего localhost, позволяя тестировать вебхуки локально.