Pushizo Docs
SDK rehberleri

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:

DurumGET, HEAD, OPTIONS, PUT, DELETEPOST, PATCH
429Yeniden denenirYeniden denenir (istek işlenmeden reddedilmiştir)
5xx, zaman aşımı, gönderim sonrası bağlantı kopmasıYeniden denenirYalnızca Idempotency-Key varsa
İstek hiç gönderilemedi (cURL COULDNT_RESOLVE_HOST, COULDNT_CONNECT, bağlantı kurulmadan zaman aşımı → Pushizo\ConnectionException)Yeniden denenirYeniden denenir
Diğer 4xxDenenmezDenenmez

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.

Bu sayfada