Laravel Mobile Pass: پاسهای Apple و Google Wallet با لاراول
خلاصهٔ کاملتر
اگه تا حالا از اون کارتهای دیجیتال داخل اپ Wallet آیفونت استفاده کردی — بلیت پرواز، بلیت کنسرت، کارت وفاداری کافه — میدونی که چقدر باحال و کاربردیان. Apple اسمشون رو «پاس» میذاره، Google میگه «آبجکت»، ولی هر دو یه چیز مشترک دارن: میشه بهشون آپدیت زنده فرستاد و روی قفلصفحهی کاربر نشونشون داد. حالا تیم اسپاتی — که برای پکیجهای لاراولی معروفه — یه پکیج جدید منتشر کرده به اسم Laravel Mobile Pass که این قابلیت رو مستقیم داخل لاراول میاره.
برای ساختن یه پاس، پکیج یه رابط فلوئنت و زنجیروار داره که خوندنش راحته. مثلاً برای یه بلیت پرواز Apple Wallet:
use Spatie\LaravelMobilePass\Builders\Apple\AirlinePassBuilder;
use Spatie\LaravelMobilePass\Enums\BarcodeType;
$mobilePass = AirlinePassBuilder::make()
->setOrganizationName('Artisan Airways')
->setSerialNumber('ART-103')
->addField('departure', 'ABU', label: 'Abu Dhabi International')
->addField('destination', 'LHR', label: 'London Heathrow')
->setBarcode(BarcodeType::Pdf417, 'ART-103-66F')
->save();بعد از فراخوانی save()، یه مدل Eloquent به اسم MobilePass برمیگرده. هیچ فایلی روی دیسک ذخیره نمیشه؛ همه چیز داخل جدول mobile_passes که همراه پکیج میاد نگه داشته میشه.
فرستادن پاس به کاربر هم خیلی سادهست. مدل MobilePass اینترفیس Responsable رو پیادهسازی کرده، یعنی میتونی مستقیم از کنترلر برگردونیش و پکیج خودش فایل .pkpass رو امضا و سرو میکنه. همچنین Attachable هم هست، یعنی میتونی پاس رو به ایمیلهای Mailable وصل کنی:
class FlightBooked extends Mailable {
public function __construct(public MobilePass $mobilePass) {}
public function attachments(): array {
return [$this->mobilePass];
}
}یکی از جذابترین قابلیتهای پکیج اینه که میتونی پاسهای از قبل صادرشده رو آپدیت کنی. فرض کن صندلی یه مسافر عوض شد یا گیت پرواز تغییر کرد. با یه خط کد، نسخهی روی گوشی کاربر ظرف یه دقیقه آپدیت میشه:
$mobilePass->updateField('seat', '13A', changeMessage: 'Your seat was changed to :value');زیر هود، پکیج یه job dispatch میکنه که از طریق APNs به Apple اطلاع میده، Apple دستگاه رو پینگ میکنه، دستگاه نسخهی جدید رو از سرور میکشه و Wallet پاس رو آپدیت میکنه. اگه changeMessage بدی، کاربر نوتیفیکیشن میبینه و Wallet هم دقیقاً نشون میده چی عوض شده.
Google Wallet هم پشتیبانی میشه، هرچند مدل کارش یه کم فرقه. گوگل میخواد اول یه Class (الگوی مشترک) تعریف کنی و بعد آبجکتهای فردی بر اساس اون Class بسازی. پکیج هر دو رو پوشش میده و وقتی از کنترلر برمیگرده، خودش تشخیص میده که کاربر اندروید داره یا iOS و پاسخ مناسب رو میفرسته.
یه قابلیت دیگه که پاس رو واقعاً «هوشمند» میکنه اینه که میتونی موقعیت جغرافیایی و زمان مرتبط بهش وصل کنی. مثلاً وقتی کاربر به فرودگاه نزدیک شد یا یه ساعت قبل از پرواز، پاس خودش روی قفلصفحه ظاهر میشه:
$builder
->addLocation(latitude: 25.2528, longitude: 55.3644)
->setRelevantDate($flight->departs_at);همچنین میتونی پاسهای منقضیشده رو با $mobilePass->expire() خاکستری کنی و از صفحهی قفل حذفشون کنی. برای Google Wallet هم میتونی با Laravel Events گوش بدی ببینی کِی کاربر پاسی رو ذخیره کرده یا حذف کرده.
اسپاتی یه دمو زنده هم راه انداخته که میتونی باهاش پاس بسازی، با آیفون اسکن کنی و آپدیت زنده رو ببینی. سورس کامل دموی اپ هم روی GitHub در دسترسه.
نکات کلیدی:
- پکیج Laravel Mobile Pass از اسپاتی، ساخت پاس برای Apple Wallet و Google Wallet رو مستقیم داخل لاراول ممکن میکنه
- پاسها به صورت Eloquent model ذخیره میشن و هیچ فایلی روی دیسک نمیره
- مدل MobilePass هم Responsable هست هم Attachable — یعنی برای کنترلر و ایمیل آمادهست
- آپدیت زنده از طریق APNs (Apple) ممکنه و میتونی نوتیفیکیشن تغییر هم بفرستی
- قابلیت pass relevance برای نشوندادن پاس در موقعیت جغرافیایی یا زمان مشخص وجود داره
- Google Wallet callback ها با Laravel Events مدیریت میشن
- دمو زنده روی mobile-pass-demo.spatie.be در دسترسه




