Как создать систему билетов через MMS с использованием PHP, Laravel и Twilio

Автор: | 29.07.2026

Вы когда-нибудь приходили в кино, на рейс или концерт и понимали, что забыли бумажный билет? Представьте, насколько хуже было бы оказаться у дверей Вилли Вонки и забыть свой золотой билет! Чтобы предотвратить подобную катастрофу, мы создадим приложение, которое будет отправлять золотой билет Вилли Вонки прямо на ваш телефон через MMS. Всё, что нужно сделать Умпа-Лумпам, — отсканировать его. Не работаете на Вилли Вонку? Не беспокойтесь, этот код пригодится для любого приложения или компании, распространяющей билеты. Надеемся, на этот раз компьютеры окажутся полезнее, чем в прошлый раз.

— PHP >= 5.4

— Laravel

— Библиотека Endroid QRCode

— Библиотека Twilio PHP, учётная запись Twilio и номер Twilio с поддержкой MMS

— Пожизненный запас шоколада* (*не обязательно)

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

Laravel — это PHP-фреймворк, который позволяет писать «PHP, который не причиняет боль». Если вы раньше не использовали Laravel, мой коллега-евангелист Кевин Уиннери написал отличную статью о том, как начать, или вы можете ознакомиться с руководством по установке Laravel. Как только вы настроите Laravel, давайте создадим новый проект под названием goldenticket:

Перейдём в директорию goldenticket и запустим базовое приложение, чтобы убедиться, что всё работает правильно. Выполните команду:

Прежде чем начать писать код, давайте обновим файл конфигурации, чтобы отображать отладочную информацию при возникновении ошибок. Откройте `app/config/app.php` и измените параметр debug на true:

Теперь, когда у нас есть основа, давайте создадим простую форму, с помощью которой мы сможем отправлять себе новый билет через MMS. Создайте новый файл представления в `app/views/` под названием «home.blade.php» и вставьте следующий HTML-код:

Здесь мы создали базовую HTML-страницу с формой, которую будем отправлять для создания нового билета. Мы также подключили CSS Bootstrap, чтобы сделать всё немного красивее. Добавив расширение .blade.php, мы превратили наше представление в шаблон Blade. Мы пока не будем использовать шаблонизацию. Наконец, убедитесь, что ваш маршрут загружает это представление. У вас уже есть маршрут для `/` в `app/routes.php`, просто обновите его, чтобы загрузить наше новое представление:

Теперь, когда у нас есть основа Laravel, давайте поработаем над генерацией изображения нашего золотого билета. В данном случае наш билет на самом деле будет чёрным QR-кодом, но это звучит не так круто. Мы будем использовать библиотеку Endroid QRCode для генерации QR-кода, так что давайте установим её с помощью Composer.

Сначала создадим новый маршрут, который будет выводить изображение QR-кода. Чтобы сделать код немного чище, давайте импортируем класс QrCode, чтобы мы могли создавать его экземпляр просто по имени. Откройте файл `app/routes.php` и добавьте следующую строку сразу после открывающего тега:

Теперь давайте добавим новый маршрут `/qrcode` после нашего маршрута `/`:

Мы создаём новый QR-код и используем функцию setText для установки содержимого, которое хотим закодировать в QR-коде. Затем получаем наше изображение и возвращаем его в ответе, правильно установив заголовки. Запустите сервер с помощью `php artisan serve` и перейдите по адресу http://localhost:8000/qrcode. Вы должны увидеть красивый QR-код, который выглядит так:

Однако мы не хотим показывать один и тот же QR-код всё время. К счастью, легко обновить этот код, чтобы генерировать код на основе данных, которые мы передаём в строке запроса. Для нашего случая мы просто объединим имя и номер телефона и закодируем их в base64. Давайте заменим первые три строки маршрута следующим кодом:

Теперь мы можем запустить наш сервер и перейти по адресу http://localhost:8000/qrcode?name=Charlie&phone_num=5555555, чтобы увидеть динамически сгенерированный QR-код. Попробуйте изменить имя и номер, чтобы увидеть, как меняется код.

В конечном итоге Twilio должен иметь возможность получить доступ к этому изображению. Поэтому, если вы работаете на localhost, вам понадобится способ сделать это доступным извне. Ngrok — отличный инструмент для предоставления доступа к вашему localhost из интернета. Если вы раньше не использовали ngrok, вы можете начать с наших мультиплатформенных или ориентированных на Windows руководств.

Следующий ингредиент нашего сладкого нового приложения — Twilio MMS. Две недели назад мы были очень рады запустить Twilio MMS на длинных кодах США и Канады. Это позволяет отправлять и получать мультимедийные сообщения различных типов. Этот новый API — именно то, что нужно для безопасного распространения золотых билетов Вонки в виде изображения, отправленного через MMS. Мы будем использовать библиотеку-помощник Twilio PHP для отправки сообщения. Давайте установим её с помощью Composer:

Помните форму, которую мы создали в начале поста? Мы будем отправлять её на тот же адрес для отправки билета. В настоящее время наш маршрут `/` принимает только GET-запросы, поэтому давайте обновим его, чтобы он принимал GET и POST-запросы:

Внутри маршрута давайте проверим, была ли отправлена форма. Если да, то создадим новый экземпляр библиотеки-помощника Twilio и отправим наше сообщение. Замените код внутри вашего маршрута на этот:

Если вы раньше отправляли SMS с помощью библиотеки-помощника Twilio PHP, этот код должен быть вам знаком. Мы создаём экземпляр библиотеки, используя наши учётные данные Twilio. Вы можете найти их в панели управления Twilio. Затем вызываем sendMessage, используя наш номер отправителя, номер получателя и текст сообщения. Не забудьте обновить номер отправителя своим номером Twilio. Новая часть для MMS — это последний аргумент, который мы передаём. Это URL-адрес медиафайла, который мы хотим отправить. Это общедоступный URL, по которому Twilio может получить доступ к изображению нашего QR-кода, убедитесь, что вы обновили его своим URL.

После того как вы обновили код своим URL ngrok, запустите ваш PHP-сервер:

Наше приложение теперь полностью функционально, но все поклонники Вонки знают, что нужно упаковать продукт в красивую упаковку. Давайте сделаем несколько небольших обновлений, чтобы наше приложение выглядело отполированным. Сначала добавим блок оповещения, который будет сообщать пользователю, что сообщение отправлено. Откройте ваше представление home и добавьте следующий код сразу после закрывающего тега формы:

Это проверит нашу сессию на наличие оповещения, которое нужно показать. Если оно есть, мы покажем этот блок. Мы будем использовать флэш-данные для хранения этого оповещения. Флэш-данные — это данные сессии, которые Laravel хранит только для следующего запроса. В нашем маршруте давайте добавим флэш-данные сразу после отправки сообщения:

Теперь, когда мы сообщаем пользователю об успешной отправке формы, давайте также добавим базовую валидацию, чтобы показывать ошибки. Нам повезло, потому что Laravel делает валидацию простой. Давайте создадим новый валидатор сразу после проверки отправки формы. Мы сделаем поля name и phone_number обязательными:

Когда вы создаёте новый валидатор, вы передаёте два аргумента. Первый — массив с данными, которые вы хотите проверить. Второй — массив с правилами валидации для этих данных. Теперь, когда у нас есть валидатор, нам просто нужно проверить, не произошла ли ошибка, и показать пользователю информацию о том, что пошло не так:

Мы снова используем флэш-данные и повторно используем блок оповещения, который уже создали, чтобы показать сообщения об ошибках валидации. Перезапустите ваш код и оставьте поле кода билета и/или номера телефона пустым. Теперь вы получите сообщение о том, что эти поля обязательны для заполнения.

Мы можем сделать гораздо больше с валидацией, но этого должно быть достаточно, чтобы вытащить дедушку Джо из постели.

Теперь мы оптимизировали работу штаб-квартиры Вонки с помощью нашей системы распространения билетов через MMS. Что делать дальше — зависит от вашей фантазии! Вы можете использовать такую систему на своей следующей конференции, хакатоне или дне рождения в стиле Вилли Вонки. Или, возможно, вы владеете авиакомпанией и хотите улучшить способ распространения посадочных талонов. Что бы вы ни создали, мне бы хотелось это увидеть. Вы можете найти меня в Twitter или по электронной почте.