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.