К содержимому

Как настроить криптоплатежи на сайте Laravel

Пошагово разбираем, как встроить криптоплатежи в Laravel: checkout, выбор интеграции, база данных и сценарии подтверждения.

Payora11 мин чтенияEN · RU · UK · ES · DE · FR · IT · PL · PT · HI · ZH
Как настроить криптоплатежи на сайте Laravel

Laravel делает платежи более организованными, а это уже половина дела. Но и в криптовалютном платежном потоке нужны маршруты, контроллеры, записи в базе данных и понятная передача данных между приложением и провайдером. Если вы разбираетесь, как настроить криптоплатежи на сайте Laravel, начните не с панели провайдера, а с уже существующей структуры проекта: именно так обычно выстраиваются криптоплатежи Laravel без лишней путаницы.

1. Проверьте структуру приложения Laravel, прежде чем добавлять платежи

Посмотрите, где в вашем приложении должен находиться checkout. Для магазина это могут быть routes/web.php, CheckoutController и Blade-шаблоны. В SaaS-продукте уже могут быть middleware для авторизации, страницы биллинга и настройки аккаунта. Для сайта пожертвований может хватить всего одного маршрута и простой формы. Это важная разница, и она напрямую влияет на интеграция криптовалютных платежей в Laravel.

Запишите точный путь от страницы товара до страницы оплаты. Если сайт уже создаёт корзины, счета или подписки, криптовалютный платёжный поток должен встраиваться в эту логику, а не создавать отдельный маршрут. Один checkout — достаточно. Два — это уже путаница.

Также учтите frontend-стек. Blade — самый прямой вариант. Livewire позволяет удерживать пользователя на одной странице. Inertia часто переносит состояние оплаты в более «приложенческий» сценарий, а значит, обновления статуса нужно передавать через API-слой, а не обычным серверным редиректом. Этот выбор влияет на всё остальное.

Проверьте и модель авторизации. Если перед оплатой пользователь должен войти в аккаунт, платёжная запись должна ссылаться на user ID. Если платить могут гости, нужен другой идентификатор — например, email или токен заказа. Без этого в базе останутся платежи и загадки. Никому не нужны загадки в 2 часа ночи.

2. Определите, что именно должен обрабатывать checkout в Laravel

Сначала определите тип платежа. Разовая покупка ведёт себя совсем не так, как форма пожертвования или регулярный биллинг. Для разовой оплаты обычно создаётся один заказ и ожидается подтверждение. Пожертвования могут вообще не использовать складской учёт. Подпискам нужны логика продления, обработка отмен и часто отдельный механизм состояний.

Сформулируйте правила конкретно. Если пользователь покупает цифровой файл, приложение должно отметить заказ как оплаченный и открыть скачивание. Если сайт выставляет счета, номер счёта должен попасть в метаданные платежа. Если цена зависит от роли пользователя, backend должен рассчитать сумму до создания платёжного запроса, а не после. Иначе заказ и платёж начнут расходиться.

Нужна привязка к конкретному пользователю? Добавьте её сразу. Для корзины это может быть order ID. Для подписки — customer ID и код тарифа. Для сервисного счёта — оба. На этом этапе платёжный поток либо становится отслеживаемым, либо превращается в набор оторванных хешей и догадок.

Если у вас подписочный сервис, посмотрите подробнее про криптоплатёжный шлюз для SaaS-подписок, если ваше Laravel-приложение выставляет счета по расписанию. Такой сценарий добавляет продления, обработку неудачных платежей и смену статусов, которые не нужны разовому checkout.

3. Выберите подход к интеграции криптоплатежей, удобный для Laravel

Обычно есть 3 пути: hosted checkout, создание платёжных сессий через API или webhook-ориентированный поток, где backend остаётся под вашим контролем. Hosted checkout — самый простой вариант. Ваше приложение создаёт платёжный запрос и отправляет пользователя к провайдеру. Создание через API даёт больше контроля над метками, метаданными и точными суммами. Webhook-first подход важен тогда, когда окончательное состояние должно определяться только после подтверждения со стороны провайдера.

Выбирайте подход не только по тому, что проще к запуску, но и по тому, что команда сможет поддерживать дальше. Небольшому Laravel-проекту часто подходит hosted checkout, потому что он сокращает код и количество крайних случаев. SaaS-продукту с внутренними правилами биллинга может понадобиться контроль через API, потому что приложению нужно создавать платежные сессии, привязанные к клиенту, а не просто отправлять пользователя на общую страницу.

Тут есть и вопрос поддержки. Чем меньше собственного кода, тем обычно меньше багов. Чем больше контроля, тем больше логики нужно тестировать. Нельзя сказать, что один вариант лучше другого. Неправильный выбор — тот, который не учитывает вашу команду, очередь задач и доступное время. Платёжная система, которую никто не может поддерживать, в будущем станет простоями.

Если вы хотите сравнить настройку у провайдера с более общей моделью интеграции, статья про криптоплатёжный шлюз для SaaS поможет увидеть баланс между удобством и контролем для Laravel-приложений, которые продают софт, а не физические товары.

4. Настройте платёжный поток на стороне Laravel и записи в базе данных

Спланируйте весь внутренний сценарий до написания кода. Типичная последовательность такая: создать заказ, сохранить запись о платеже со статусом pending, запросить платёжную сессию у провайдера, сохранить его ссылку и ждать подтверждения. Звучит просто, но порядок здесь важен. Если сначала создать платёжную сессию, а заказ потом, сверка данных быстро превратится в проблему.

В базе должны быть как минимум такие поля: order_id, user_id, provider_payment_id, amount, currency, status, expires_at и временные метки. Добавьте paid_at, если это нужно для отчётности. Добавьте failure_reason, если службе поддержки нужен контекст. Обычно используются четыре состояния: pending, paid, failed и expired. Делайте их явными. «Другое» — это не состояние.

В зависимости от объёма данных можно использовать одну или две таблицы. Небольшие приложения часто хранят заказы и платежи в отдельных таблицах с внешним ключом между ними. Более крупные системы могут добавить таблицу журнала для истории аудита. Такая дополнительная таблица помогает, когда финансы спрашивают, почему платёж менял статус три раза за один час, а такое случается чаще, чем принято признавать.

Для проверки webhook и безопасности payload полезно держать платёжные записи в соответствии с рекомендациями из лучшие практики безопасности криптоплатёжного шлюза. Чистая модель базы данных сама по себе не обеспечивает безопасность, но даёт системе проверки что-то реальное, что можно защищать.

5. Подключите Laravel к API криптоплатёжного провайдера

Храните API-учётные данные в .env, а не в контроллере. Используйте что-то вроде PAYMENT_PROVIDER_KEY и PAYMENT_PROVIDER_SECRET, а затем свяжите их через конфигурационный файл, чтобы остальное приложение читало значения из config(). Так вы отделите staging от production, а это важно, когда одна среда не должна создавать реальные транзакции.

Создайте сервисный класс или action для обращения к API. Сервисный класс Laravel может собрать payload запроса, отправить его через HTTP-клиент и вернуть данные сессии в контроллер. Так контроллер остаётся «тонким». Тонкие контроллеры проще тестировать и намного приятнее спустя полгода. Сервис должен принимать заказ, сумму, валюту и callback URL, а затем возвращать ID провайдера и URL перенаправления.

Хороший шаблон такой: контроллер валидирует запрос, сервис создаёт платёжную сессию, модель сохраняет ссылку на провайдера, а ответ отправляет пользователя к шагу оплаты. Если провайдер требует дополнительный metadata, передайте номер заказа и идентификатор пользователя в payload. Не прячьте эти данные в поле примечания, если провайдер не ожидает их там.

Подробности настройки и имена endpoint’ов лучше уточнить в документации для разработчиков, API криптоплатёжного шлюза, прежде чем писать класс Laravel. Одно неверное имя поля может стоить вам полдня.

6. Добавьте обработку webhook для подтверждения платежа

Обработка webhook — это то место, где и происходит настоящее подтверждение. Создайте отдельный маршрут, обычно вне защиты CSRF, если провайдер не может отправлять CSRF-токен, и направьте его в контроллер или job, который принимает события. Затем проверьте подпись по секрету провайдера, чтобы случайные запросы не могли пометить заказы как оплаченные. Это не опция.

Не обновляйте заказ только на основе редиректа с фронтенда. Пользователи закрывают вкладки. Браузеры падают. Мобильная сеть пропадает. Редирект может показать правильное сообщение, но финальный статус оплаты должен менять только webhook. Если провайдер отправляет и «processing», и «paid», считайте «paid» тем состоянием, которое разблокирует заказ. Быстрое сообщение после редиректа — это не доказательство.

Здесь важна идемпотентность. Один и тот же webhook может прийти дважды. Ваш обработчик должен проверить, был ли payment ID уже обработан, прежде чем обновлять заказ. Если событие дублируется, верните ответ 200 и остановитесь. Так приложение не отправит один и тот же цифровой файл дважды и не вышлет два письма с квитанцией за один платёж.

Защита от повторного воспроизведения — ещё одна мелкая деталь с большими последствиями. Сохраняйте event ID, timestamp или маркер подписи, если провайдер его предоставляет. Если webhook слишком старый или уже был обработан, игнорируйте его. Платёжная система, которая принимает повторно проигранные события, сама ищет неприятности.

7. Обновите интерфейс, чтобы он показывал статус оплаты в Laravel

Страница checkout должна чётко показывать текущее состояние: pending, processing, paid или failed. Пользователь, который только что оплатил, не хочет видеть пустой экран. Ему нужно понять, прошёл ли платёж. Покажите статус простым языком и свяжите его с номером заказа, а не с абстрактным индикатором загрузки.

Если провайдер возвращает пользователя на ваш сайт, страница возврата может показать временный статус, пока webhook завершает обработку. Это нормально. Платёж может уже отображаться в системе провайдера, а в вашей базе ещё не быть обновлённым. Если мгновенного редиректа нет, используйте polling или кнопку обновления, которая запрашивает у backend Laravel последний статус. Скорость здесь зависит от провайдера и очереди задач.

Livewire упрощает обновление статуса. Blade может сделать это с помощью небольшого JavaScript-polling. Inertia может запрашивать у сервера обновлённый объект платежа. Выберите один способ и придерживайтесь его. Смешанные подходы создают два интерфейса, которые спорят друг с другом, а для checkout-страницы это плохой вид.

Если ваше приложение также продаёт через WordPress, полезное сравнение есть в принимайте криптоплатежи в WordPress. Идеи для frontend похожи, но Laravel даёт больше прямого контроля над обновлением статусов и внутренними записями.

8. Тестируйте, логируйте и разворачивайте криптоплатёжный поток Laravel

Сначала полностью протестируйте путь локально: создание заказа, открытие платёжной сессии, получение webhook, обновление статуса и показ страницы об оплате. Затем повторите сценарий с неудачным платежом и просроченным платежом. Два хороших теста лучше, чем одна идеальная догадка. Сначала используйте sandbox-режим, потом production, и держите endpoint’ы раздельно, чтобы приложение случайно их не смешало.

Очереди и jobs полезны, если обработка webhook делает больше, чем одно обновление в базе. Отправка квитанций, обновление подписок или уведомление поддержки могут выполняться в фоне. Если job падает, логируйте это. Если API-запрос не удался, логируйте размер payload, код ответа и ID заказа. Не логируйте секреты. Логи нужны для диагностики, а не для подарков злоумышленникам.

Перед выкладкой в production проверьте следующее: переменные окружения заданы, webhook URL доступен, проверка подписи включена, worker очереди запущен при необходимости, миграции базы данных применены, а тестовые платежи отключены на боевом магазине. Список короткий, но у каждого пункта есть цена, если его забыть. Один отсутствующий webhook URL может оставить каждый оплаченный заказ в статусе pending.

И ещё одна полезная привычка при запуске: первые 24 часа внимательно следите за системой. Проверяйте ошибки webhook, дублирующиеся события и платёжные сессии, которые так и не завершаются. Проверьте один реальный заказ от начала до конца. Если всё работает, криптоплатёжный поток Laravel справляется со своей задачей, и следующий шаг — не переписывание, а наблюдение за тем, как первые реальные пользователи нажимают «Оплатить».

Комментарии

Готовы начать?

Создайте аккаунт — и первый счёт заработает меньше чем за час.