Vorgio

PHP SDK — vorgio/vorgio-php

Ein schlanker, framework-agnostischer Wrapper über die Vorgio-REST-API mit optionaler Laravel-Auto-Discovery. Zielt auf PHP 8.2+ (breiter als Vorgio selbst), damit Plugin-Autoren ihn auf Shared Hosting ausliefern können.

Das SDK leitet JSON weiter, hängt Authentifizierungs- und Idempotency-Header an, dekodiert die Antwort und übersetzt 4xx / 5xx in typisierte Exceptions. Es führt keine Retries, kein Caching und keine lokale Validierung durch — diese Entscheidungen gehören in Ihre Anwendung.

#Installation

 1composer require vorgio/vorgio-php

#Schnellstart

 1use Vorgio\VorgioClient;
 2
 3$vorgio = new VorgioClient(
 4    token: getenv('VORGIO_TOKEN'),                          // act_…
 5    baseUrl: 'https://app.vorgio.example',                  // weglassen für den öffentlichen Standard-Host
 6);
 7
 8$result = $vorgio->checkouts()->create([
 9    'client'   => [/**/],
10    'invoice'  => [/**/],
11    'send'     => ['subject' => 'Ihre Rechnung', 'body' => 'Hallo {client.name}, …'],
12    'metadata' => ['shop_order_id' => '1234'],
13]);
14
15echo $result['data']['invoice']['number'];   // INV-2026-0042
16echo $result['data']['mail_event_id'];        // me_…

Jede Resource-Methode liefert die dekodierte JSON-Antwort als PHP-array zurück. Die vollständige Request- / Response-Form pro Endpoint finden Sie in der Scribe-API-Referenz.

Idempotency-Key wird automatisch als UUIDv7 erzeugt, wenn Sie keinen angeben — das ist die richtige Vorgabe für tatsächlich neue Anfragen. Geben Sie einen expliziten Schlüssel an, wenn Sie sichere Replays wünschen:

 1$vorgio->checkouts()->create([...], idempotencyKey: 'wc-order-1234-checkout');

Schicken Sie denselben Idempotency-Key zweimal innerhalb des serverseitigen Aufbewahrungsfensters, erhalten Sie die ursprüngliche Antwort mit dem Header Idempotency-Replay: true zurück.

#Resource-Methoden

Methode REST-Endpoint
$vorgio->checkouts()->create($body, ?$idempotencyKey) POST /v1/checkouts
$vorgio->invoices()->list($query) GET /v1/invoices
$vorgio->invoices()->create($body, ?$idempotencyKey) POST /v1/invoices
$vorgio->invoices()->retrieve($id) GET /v1/invoices/{id}
$vorgio->invoices()->update($id, $body) PATCH /v1/invoices/{id}
$vorgio->invoices()->delete($id) DELETE /v1/invoices/{id}
$vorgio->invoices()->send($id, $body, ?$idempotencyKey) POST /v1/invoices/{id}/send
$vorgio->invoices()->markPaid($id, $body = [], ?$idempotencyKey) POST /v1/invoices/{id}/mark-paid
$vorgio->clients()->list($query) GET /v1/clients
$vorgio->clients()->create($body, ?$idempotencyKey) POST /v1/clients
$vorgio->clients()->retrieve($id) GET /v1/clients/{id}
$vorgio->clients()->update($id, $body) PATCH /v1/clients/{id}
$vorgio->clients()->delete($id) DELETE /v1/clients/{id}

#Webhook-Signaturprüfung

 1use Vorgio\Webhooks;
 2use Vorgio\Exception\VorgioSignatureException;
 3
 4try {
 5    $event = Webhooks::constructEvent(
 6        payload:   file_get_contents('php://input'),
 7        sigHeader: $_SERVER['HTTP_VORGIO_SIGNATURE'] ?? '',
 8        secret:    getenv('VORGIO_WEBHOOK_SECRET'),
 9        tolerance: 300,                                   // Sekunden; Standard 300
10    );
11} catch (VorgioSignatureException $e) {
12    http_response_code(400);
13    exit('Bad signature');
14}
15
16match ($event->type) {
17    'invoice.sent' => $this->onInvoiceSent($event),
18    'invoice.paid' => $this->onInvoicePaid($event),
19    default => null,
20};

$event ist ein Vorgio\WebhookEvent-Wertobjekt mit den public readonly-Eigenschaften id, type, createdAt, data, metadata und rawPayload.

Der Verifier bildet Stripes Webhook::constructEvent-API eins zu eins ab, sodass jeder Entwickler, der zuvor Stripe-Webhooks integriert hat, ihn sofort wiedererkennt. Das Signaturschema entspricht byte-genau dem Server: HMAC-SHA256 über <unix_ts>.<raw_body>, mit einem standardmäßigen 5-Minuten-Replay-Toleranzfenster.

Für Testfixtures stellt das SDK zusätzlich einen einfachen Signer bereit:

 1$header = Webhooks::sign($payload, $secret, $timestamp = null);

#Exceptions

Exception Wann
Vorgio\Exception\VorgioApiException Jede Nicht-2xx-Antwort — hat $statusCode, $problem (geparster RFC-7807-Body), $rawBody, $requestId sowie problemType()
Vorgio\Exception\VorgioValidationException extends above 422 — ergänzt typisiertes $errors-Mapping (Feld → Meldungen)
Vorgio\Exception\VorgioRateLimitedException extends above 429 — ergänzt $retryAfter in Sekunden (Standardwert 60, falls Retry-After fehlt)
Vorgio\Exception\VorgioSignatureException Webhook-Signaturprüfung fehlgeschlagen
Vorgio\Exception\VorgioException Basisklasse aller obigen und transportbezogener Fehler (DNS / Connection refused / etc.)

Das SDK führt keine eigenen Retries aus — wählen Sie eine Strategie, die zu Ihrer Laufzeit passt (Queue-Backoff, synchroner Retry mit Jitter, …) und werten Sie $retryAfter für Rate-Limit-Antworten aus.

#Laravel-Integration (optional)

Wird das Paket in einer Laravel-Anwendung installiert, registriert es per Composer-Auto-Discovery automatisch einen Service Provider. Veröffentlichen Sie die Config und setzen Sie die Env-Variablen:

 1php artisan vendor:publish --tag=vorgio-config
 1// config/vorgio.php
 2return [
 3    'token'          => env('VORGIO_TOKEN'),
 4    'base_url'       => env('VORGIO_BASE_URL', 'https://app.vorgio.example'),
 5    'webhook_secret' => env('VORGIO_WEBHOOK_SECRET'),
 6    'timeout'        => (float) env('VORGIO_TIMEOUT', 30),
 7];

Anschließend können Sie den Client überall auflösen — per Dependency Injection, über den Container oder die Facade:

 1use Vorgio\Laravel\Facades\Vorgio;
 2
 3$result = Vorgio::checkouts()->create([...]);

Die Laravel-Schicht wird ausschließlich über Composers extra.laravel-Discovery aktiviert, sodass das Paket in WordPress, Symfony und Standalone-PHP weiterhin ohne Beanstandung nutzbar bleibt.

#CI / unterstützte PHP-Versionen

In CI gegen PHP 8.2 / 8.3 / 8.4 getestet. Keine Framework-Abhängigkeit. Die HTTP-Schicht baut auf guzzlehttp/guzzle ^7.5; für Tests können Sie über das Konstruktor-Argument httpClient: einen eigenen Guzzle-kompatiblen ClientInterface einschleusen und mit einem MockHandler antreiben:

 1use GuzzleHttp\Client;
 2use GuzzleHttp\Handler\MockHandler;
 3use GuzzleHttp\HandlerStack;
 4use GuzzleHttp\Psr7\Response;
 5
 6$mock = new MockHandler([new Response(201, [], '{"data":{}}')]);
 7$http = new Client(['handler' => HandlerStack::create($mock)]);
 8
 9$vorgio = new VorgioClient(token: 'act_test', httpClient: $http);

#Quellcode

Das Paket wird nach der Veröffentlichung unter github.com/vorgio/vorgio-php zu finden sein. Beobachten Sie das Repository, um beim Release benachrichtigt zu werden.