PHP SDK
pushizo/pushizo-php — PHP ≥ 8.1, yalnızca ext-curl ve ext-json; bildirim, kullanıcı, olay, webhook imza doğrulama, journey ve tüm public API. Laravel örneği.
pushizo/pushizo-php yalnızca sunucuda kullanılır; Guzzle gerekmez (TransportInterface ile değiştirilebilir), XAMPP ile uyumludur.
Kurulum ve başlatma
composer require pushizo/pushizo-php
# Monorepo içinden: composer config repositories.pushizo path <repo>/sdk/php && composer require pushizo/pushizo-php:"*"use Pushizo\Client;
$hs = new Client([
'api_key' => getenv('PUSHIZO_API_KEY'), // hs_live_…
'app_id' => getenv('PUSHIZO_APP_ID'), // çağrılarda verilmezse kullanılır
'base_url' => 'https://api.example.com', // yerel: http://localhost:4000
'timeout' => 30,
'max_retries' => 3, // 429/5xx için 300 ms / 1 s / 3 s
'auto_idempotency_key' => true,
]);Bildirim gönderme
$result = $hs->notifications->create([
'idempotency_key' => "order-{$order->id}",
'target' => ['include_aliases' => ['external_id' => [(string) $user->id]]],
'headings' => ['tr' => 'Siparişiniz yola çıktı', 'en' => 'Your order has shipped'],
'contents' => ['tr' => '…', 'en' => '…'],
'url' => "https://example.com/orders/{$order->id}",
'data' => ['order_id' => (string) $order->id],
]);
$messageId = $result['id'];
$hs->notifications->get($messageId);
$hs->notifications->list(['limit' => 50, 'status' => 'completed']);
$hs->notifications->cancel($messageId);
$hs->notifications->deliveries($messageId, ['limit' => 100]);E-posta, SMS ve bildirim kutusu
$hs->notifications->create([
'idempotency_key' => "shipped-{$order->id}",
'target' => ['include_aliases' => ['external_id' => [(string) $user->id]], 'channels' => ['email', 'sms']],
'contents' => ['tr' => 'Siparişin kargoda', 'en' => 'Your order shipped'], // SMS gövdesi
'email_subject' => 'Siparişin yolda',
'email_mjml' => $mjml, // ya da 'email_body' (hazır HTML)
'email_preheader' => 'Kargo takip numaran içeride',
'email_from_name' => 'Mağaza',
'email_from_address' => 'no-reply@example.com',
'sms_from' => 'MAGAZA',
'add_to_inbox' => true,
'inbox_ttl' => 7 * 86400,
]);Kullanıcılar, abonelikler, olaylar, kanallar
$hs->users->upsert(['external_id' => 'user_42', 'tags' => ['plan' => 'pro'], 'language' => 'tr']);
$hs->users->getByExternalId('user_42');
$hs->users->update('external_id', 'user_42', ['tags' => ['plan' => 'free']]);
$hs->users->addAliases('external_id', 'user_42', ['crm_id' => 'C-1']);
$hs->users->addSubscription('external_id', 'user_42', ['channel' => 'email', 'token' => 'a@b.c']);
$hs->users->delete('external_id', 'user_42');
$hs->subscriptions->update('sub_…', ['opted_in' => false]);
$hs->subscriptions->setOwner('sub_…', 'user_42');
$hs->events->send([[ 'external_id' => 'user_42', 'name' => 'purchase', 'properties' => ['sku' => 'A1'], 'value' => 49.9, 'occurred_at' => date(DATE_ATOM) ]]);
$hs->channels->list(); $hs->channels->validate('android_push');
$hs->apps->list(); $hs->organization->usage(['days' => 30]);Suppression list
$page = $hs->suppressions->list(['channel' => 'email', 'reason' => 'bounce', 'limit' => 50]);
foreach ($page['data'] as $row) { echo $row['value_masked'], ' ', $row['reason'], PHP_EOL; }
$row = $hs->suppressions->create(['channel' => 'sms', 'value' => '+905321234567', 'reason' => 'manual']);
$hs->suppressions->delete($row['id']);Identity verification
$hash = Client::identityHash(getenv('PUSHIZO_SDK_SECRET'), (string) $user->id);
// JSON döndürün; istemci SDK login(externalId, identityHash) ile kullanır.Webhook imzası
$payload = file_get_contents('php://input'); // ham gövde
$header = $_SERVER['HTTP_PUSHIZO_SIGNATURE'] ?? null;
try {
$events = Pushizo\Webhook::constructEvents($payload, $header, getenv('HS_WEBHOOK_SECRET'));
} catch (Pushizo\WebhookSignatureException $e) {
http_response_code(400);
exit($e->reason);
}
foreach ($events as $event) { /* $event['id'] ile tekrarları ayıklayın */ }
http_response_code(204);Ayrıntılar: Webhook'lar.
Journey'ler
$journey = $hs->journeys->create(['name' => 'Sipariş sonrası']);
$hs->journeys->saveDraft($journey['id'], ['graph' => ['nodes' => $nodes, 'edges' => $edges], 'settings' => ['re_entry' => ['mode' => 'never']]]);
$published = $hs->journeys->publish($journey['id']); // ['journey', 'version', 'issues']
$result = $hs->journeys->triggerRun($journey['id'], ['external_id' => 'u-1', 'context' => ['order_id' => 'o-42']]);
$hs->journeys->stats($journey['id'], ['version' => $published['version']]);Yaşam döngüsü: pause, resume, archive, duplicate; updateNode, versions, exitRun.
Tüm kaynaklar
SDK public işlemlerin tamamını kapsar (tests/run.php kapsam denetimi): organization, apps, notifications (history, exportEvents, estimate), users (getIdentity, export, search), subscriptions (getUserIdentity, updateByToken), events, channels, suppressions, webhooks, segments, templates (copyToApp), campaigns (variantStats, selectWinner), journeys, inAppMessages, inbox, preferences, analytics (CSV için requestText), exports, imports (createFromFile, multipart), apiKeys (rotate). Sayfalı uçlar için $hs->paginate(...).
Hatalar
use Pushizo\PushizoException;
try { … } catch (PushizoException $e) {
$e->status; $e->errorCode; $e->requestId; $e->details; $e->isRetryable();
}Yeniden deneme politikası
Yeniden denemeler üstel geri çekilmeyle (0,3 / 1 / 3 sn; Retry-After başlığı varsa ona uyulur) en fazla max_retries kez yapılır. Sunucuda tekrarlanması güvenli olmayan isteklerin çift işlenmemesi için kural HTTP metoduna göre değişir:
| Durum | GET, HEAD, OPTIONS, PUT, DELETE | POST, PATCH |
|---|---|---|
429 | Yeniden denenir | Yeniden denenir (istek işlenmeden reddedilmiştir) |
5xx, zaman aşımı, gönderim sonrası bağlantı kopması | Yeniden denenir | Yalnızca Idempotency-Key varsa |
İstek hiç gönderilemedi (cURL COULDNT_RESOLVE_HOST, COULDNT_CONNECT, bağlantı kurulmadan zaman aşımı → Pushizo\ConnectionException) | Yeniden denenir | Yeniden denenir |
Diğer 4xx | Denenmez | Denenmez |
5xx ya da gönderim sonrası ağ hatasında sunucu isteği işlemiş olabilir; anahtarsız bir POST/PATCH tekrarı çift bildirim veya kayıt üretebilir. notifications->create ve users->upsert anahtar verilmezse otomatik UUID üretir (otomatik anahtar kapatılmadıysa), bu yüzden bu iki çağrı güvenle yeniden denenir. Başka bir POST/PATCH çağrısının da yeniden denenmesini istiyorsanız anahtarı kendiniz verin: $hs->request('POST', '/v1/apps/{appId}/events', [], $body, ['idempotency_key' => "evt-$id"]) ya da $hs->users->upsert($body, null, "crm-$id"). Yeniden denemelerde aynı anahtar gönderilir; API aynı anahtarla 24 saat içinde gelen tekrarı ilk yanıtla karşılar. Özel bir TransportInterface, bağlantı kurulamadığında ConnectionException, istek gönderildikten sonraki ağ hatalarında PushizoException (status 0) fırlatmalıdır.
Laravel
examples/php-laravel: servis sağlayıcı (singleton Client), facade, config/pushizo.php, identity hash / tag / olay uçları için controller ve idempotent kuyruk job'u.
Node.js SDK
@pushizo/node — Node.js ≥ 20, ESM, OpenAPI'den türetilmiş tipler; bildirim, kullanıcı, olay, webhook imza doğrulama, journey ve tüm public API.
Python SDK
pushizo (PyPI) — Python 3.9+, httpx; OpenAPI'den üretilen modeller ve kaynak metotları, yeniden deneme, idempotency, sayfalama, webhook imza doğrulaması.