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();