Корпоративный мерч в других странах:AMArmeniaGEGeorgiaTRTürkiyeRSSerbiaAEUAECYCyprusPTPortugalPLPolandESSpain

PHP SDK для Италия

corp-merch/sdk на Packagist — PHP 8.1+, PSR-7/PSR-18, нативные bridges для Laravel и Symfony, readonly DTO.

Установка и init

composer require corp-merch/sdk. $cm = new CorpMerch\Client(apiKey: getenv('CM_KEY'), country: 'Italy'). Использует PSR-18 HTTP client — передавайте любой (Guzzle, Symfony HttpClient, разумный default). Автоматически применяет IVA 22% и SdI для Италия; хаб по умолчанию Милан.

Quickstart — отправка заказа

$order = $cm->orders->create(idempotencyKey: Uuid::v4(), buyer: ['vat_id' => 'EU…'], lines: [['sku' => 'TSH-001', 'qty' => 200]], promisedDate: '2026-07-01'); echo $order->id; echo $order->estimatedIVAAmountCents. Возвращает readonly DTO Order. Ошибки выбрасываются как CorpMerch\Exception\ValidationException и т.п.

Bridges Laravel и Symfony

Laravel: установите corp-merch/sdk-laravel — регистрирует singleton, привязанный к config('corp-merch.country'). Symfony: corp-merch/sdk-symfony добавляет bundle с autowired-клиентом. Оба пакета поставляют webhook-middleware, которые валидируют подпись и dispatch-ят типизированные события на event bus фреймворка.

FAQ

Минимальная версия PHP?

PHP 8.1 (readonly properties, enum). PHP 8.2 и 8.3 тоже тестируются. PHP 7.x не поддерживается.

Какой HTTP client?

PSR-18 — bring your own. Discovery по умолчанию через http-interop/http-factory-discovery, подхватит Guzzle или Symfony HttpClient.

Как типизированы ответы?

Readonly DTO (Order, Invoice, CatalogItem). Enum для статусов (OrderStatus::ACCEPTED и т.п.). Strict types: declare(strict_types=1) в каждом файле.

Итерация по каталогу?

foreach ($cm->catalog->iterate(country: 'Italy') as $item) { … } — на генераторах, ленивые fetch страниц. Cancel mid-loop через break без потерь.

Исходный код?

MIT на GitHub: github.com/corp-merch/sdk-php. PSR-12 codestyle; PHPStan level 9 в CI.

Поговорите со специалистом