format('Y_m_d_h_i_s'); $pass = new EventTicket($uniqueId, 'Wallet example'); // устанавливаем цвет бэкграунда $pass->setBackgroundColor('rgb(255, 255, 255)'); // устанавливаем цвет шрифта $pass->setForegroundColor('rgb(0, 0, 0)'); // устанавливаем цвет шрифта лейблов $pass->setLabelColor('rgb(0, 0, 0)'); $structure = new Structure(); // поле заголовка // конструктор поля должен состоять из уникального ключа и значения поля $headerField = new Field('header', 'Поле заголовка'); // также можно добавить лейбл $headerField->setLabel('Лейбл поля заголовка'); $structure->addHeaderField($headerField); // вторичное поле $secondaryField = new Field('secondary', 'Вторичное поле'); $secondaryField->setLabel('Лейбл вторичного поля'); $structure->addSecondaryField($secondaryField); // дополнительное поле $auxiliaryField = new Field('auxiliary', 'Дополнительное поле'); $auxiliaryField->setLabel('Лейбл дополнительного поля'); $structure->addAuxiliaryField($auxiliaryField); // первое поле задней стороны пасса $backField = new Field('back_field_one', '+7 (999) 999-99-99'); $backField->setLabel('Пример с номером телефона:'); $structure->addBackField($backField); // второе поле задней стороны пасса $backField = new Field('back_field_two', 'Ссылка'); $backField->setLabel('Пример ссылки:'); $structure->addBackField($backField); // можно не ограничиваться одним или двумя! // логотип $logoImage = new Image('/full/path/to/logo/', 'logo'); $pass->addImage($logoImage); $logoImage = new Image('/full/path/to/retina/logo/', 'logo'); $logoImage->setIsRetina(true); $pass->addImage($logoImage); // иконка, видна на экране блокировки $iconImage = new Image('/full/path/to/icon/', 'icon'); $pass->addImage($iconImage); $iconImage = new Image('/full/path/to/retina/icon/', 'icon'); $iconImage->setIsRetina(true); $pass->addImage($iconImage); // strip $stripImage = new Image('/full/path/to/strip/', 'strip'); $pass->addImage($stripImage); $stripImage = new Image('/full/path/to/retina/strip/', 'strip'); $stripImage->setIsRetina(true); $pass->addImage($stripImage); $pass->addAssociatedStoreIdentifier(544007664); $pass->setStructure($structure); $barcode = new Barcode(Barcode::TYPE_QR, 'http://google.com'); $pass->setBarcode($barcode); $factory = new PassFactory( // Идентификатор типа пасса (bundle id) 'TYPE_IDENTIFIER', // Идентификатор команды разработчика 'TEAM_ID', // Название компании разработчика 'ORGANIZATION_NAME', // Путь до сертификата разработчика '/full/path/to/developer/certificate/', // Пароль к сертификату разработчика 'DEVELOPER_CERTIFICATE_PASSWORD', // Путь до WWDR сертификата '/full/path/to/wwdr/certificate/', ); $factory->setOverwrite(true); // Путь до папки, в которую будут сохраняться готовые пассы $factory->setOutputPath('/path/to/generated/passes/'); $file = $factory->package($pass); $validator = new PassValidator(); $validator->validate($pass); if ($validator->getErrors()) { $errorsString = implode(' | ', $validator->getErrors()); throw new \Exception("Ошибки валидации passbook: $errorsString"); } $passBookFullPath = $file->getPath() . "/{$uniqueId}.pkpass"; header("Pragma: no-cache"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/vnd.apple.pkpass"); header('Content-Disposition: attachment; filename="pass.pkpass"'); clearstatcache(); $fileSize = filesize($passBookFullPath); if ($fileSize) { header("Content-Length: " . $fileSize); } header('Content-Transfer-Encoding: binary'); if (filemtime($passBookFullPath)) { date_default_timezone_set("UTC"); header( 'Last-Modified: ' . date("D, d M Y H:i:s", filemtime($passBookFullPath)) . ' GMT' ); } flush(); readfile($passBookFullPath); exit();