Laravel Mobile Pass — це новий пакет від Spatie (у співпраці з Dan Johnson) для створення карток Apple Wallet та Google Wallet. Він підтримує посадкові талони, квитки на події, купони, карти лояльності та подарункові сертифікати, а також дозволяє надсилати оновлення вже встановлених карток.
# Єдиний Builder API для обох платформ
Пакет пропонує уніфікований інтерфейс для роботи з Apple та Google. Ось приклад створення квитка на подію для Apple Wallet:
use Spatie\LaravelMobilePass\Builders\Apple\EventTicketPassBuilder;
$mobilePass = EventTicketPassBuilder::make()
->setOrganizationName('Fab Four Promotions')
->setSerialNumber('BTL-SHEA-0042')
->setDescription('The Beatles at Shea Stadium')
->addField('event', 'Beatles Live at Shea')
->addField('attendee', 'John Lennon', label: 'Name')
->addField('seat', 'Floor A, Row 12')
->save();
Для Google Wallet процес схожий, проте з додатковим кроком — оголошенням Class (шаблону) перед створенням окремих карток:
use Spatie\LaravelMobilePass\Builders\Google\EventTicketPassBuilder;
use Spatie\LaravelMobilePass\Enums\BarcodeType;
$mobilePass = EventTicketPassBuilder::make()
->setClass('beatles-shea-1965')
->setAttendeeName('John Lennon')
->setSection('Floor A')
->setRow('12')
->setSeat('24')
->setBarcode(BarcodeType::Qr, 'TICKET-12345')
->save();
Метод save() повертає Eloquent-модель MobilePass, яка реалізує інтерфейс Responsable у Laravel. Якщо повернути її безпосередньо з контролера, пакет автоматично віддасть потрібний формат: файл .pkpass для Apple або редирект до Google Wallet для Android.
# Оновлення карток у реальному часі
Після встановлення картки її дані можна оновлювати. В Apple Wallet для цього достатньо викликати updateField на моделі MobilePass:
$mobilePass->updateField('seat', '13A');
Також можна додати текстове сповіщення про зміну:
$mobilePass->updateField(
'seat',
'13A',
changeMessage: 'Ваше місце змінено на :value',
);
Оновлення для Google Wallet працюють через модифікацію масиву content:
$content = $mobilePass->content;
$content['googleObjectPayload']['ticketHolderName'] = 'John Winston Lennon';
$mobilePass->update(['content' => $content]);
За процес оновлення відповідає PushPassUpdateJob. За замовчуванням він виконується синхронно, але через параметр MOBILE_PASS_QUEUE_CONNECTION у .env можна налаштувати роботу через черги.
# Різноманіття типів карток
Пакет містить білдери для посадкових талонів (авіа та інший транспорт), купонів, карт лояльності та подарункових сертифікатів. Наприклад, AirlinePassBuilder дозволяє зручно заповнювати специфічні дані: коди аеропортів, дані пасажира та номер місця:
use Spatie\LaravelMobilePass\Builders\Apple\AirlinePassBuilder;
use Spatie\LaravelMobilePass\Builders\Apple\Entities\Seat;
AirlinePassBuilder::make()
->setOrganizationName('Etihad')
->setDepartureAirportCode('AUH')
->setDestinationAirportCode('LHR')
->setPassengerName('Paul McCartney')
->setSeats(Seat::make(number: '12A'))
->save();
Для потягів, автобусів чи морського транспорту можна використовувати BoardingPassBuilder, вказавши відповідний TransitType.
# Живе демо
Spatie запустили онлайн-демо, де можна протестувати створення всіх типів карток, встановити їх на iPhone та перевірити роботу push-оновлень. Вихідний код демо-проєкту доступний на GitHub.
Інструкції зі встановлення, налаштування Apple та Google credentials та повна документація — у офіційному репозиторії.