Sign in
Giriş/Kimlik doğrulama

Kimlik Doğrulama ve İstek İmzalama

API isteklerini project UUID ve API key kullanarak HMAC-SHA256 ile imzalayın.

Her API isteği (gelen webhook'lar hariç) project UUID'nizi ve bir istek imzasını taşımalıdır. İmza, isteğin sizden geldiğini ve yolda kimsenin değiştirmediğini kanıtlar.

API key'leri

2328.io, aynı imzalama algoritmasını paylaşan ancak farklı endpoint'leri kapsayan iki anahtar kullanır:

AnahtarKullanım yeri
API keyÖdemeler, statik cüzdanlar, bakiye, döviz kurları ve ödeme / statik cüzdan webhook'larının doğrulanması
Payout API keyTüm /v1/payout/* endpoint'leri ve çekim webhook'larının doğrulanması

Her iki anahtar da 2328.io üzerindeki proje ayarlarınızda yer alır. Aşağıdaki örneklerde "API key" genel olarak belirtilmiştir — çağırdığınız endpoint'e uygun olanını yerine koyun.

İki anahtarı asla karıştırmayın: bir çekim isteğini normal API key ile (veya bir ödeme isteğini payout key ile) imzalamak imza hatası döner.

Gerekli header'lar

HeaderTipGerekliAçıklama
Content-TypestringevetHer zaman application/json
projectstringevetProject UUID'niz
signstringevetAPI key'iniz ile hesaplanan isteğin HMAC-SHA256 imzası
User-AgentstringevetUygulamanızı tanımlar (örn. MyShop/1.4 (+https://myshop.example)). User-Agent olmayan istekler engellenebilir.

İmza nasıl çalışır

İmzayı isteğin gövdesinin parmak izi gibi düşünün. Şu adımlarla oluşturulur:

  1. Gövdeyi JSON'a serileştirin (kompakt — fazladan boşluk yok).
  2. Bu JSON'u Base64 ile encode edin. Bu adım girdiyi diller arası normalleştirir — düz ASCII olduğunda her dil HMAC için aynı baytları üretir.
  3. API key'inizi kullanarak Base64 string'inin HMAC-SHA256'sını hesaplayın, sonra sonucu küçük harf hex'e dönüştürün.

Gövdesiz GET ve diğer istek türleri için JSON yerine boş bir string'i imzalayın.

Verilen bir API key için boş string imzası sabittir. Çok sayıda GET çağrısı yapıyorsanız bunu cache'leyebilirsiniz.

Uygulamalar

PHP
<?php
function apiSign(array $data, string $apiKey): string {
    $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    $base64 = base64_encode($json);
    return hash_hmac('sha256', $base64, $apiKey);
}

Gövdesiz istekler (GET)

Boş gövdeli istekler için (örn. GET /v1/payout/status/{uuid}), boş bir string'i imzalayın:

Shell
SIGN=$(printf '' | openssl dgst -sha256 -hmac "$API_KEY" -hex | awk '{print $NF}')

Tam istek örneği

Shell
curl -X POST https://api.2328.io/api/v1/payment \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyShop/1.0 (+https://myshop.example)" \
  -H "project: YOUR_PROJECT_UUID" \
  -H "sign: YOUR_HMAC_SIGNATURE" \
  -d '{"amount":"100.00","currency":"USD","order_id":"ORDER-123"}'

API key'inizi asla istemci tarafı kodda açığa çıkarmayın. İstekleri backend'inizde imzalayın. Sızdırılan bir API key, herkese merchant hesabınıza tam erişim verir.

Webhook imzalarını doğrulama

2328.io size bir webhook gönderdiğinde, aynı algoritma ters yönde çalışır:

  1. Payload'dan sign alanını çıkarın.
  2. Kalan alanları JSON'a encode edin (kompakt, boşluksuz).
  3. Bu string'i Base64 ile encode edin.
  4. Uygun anahtarla HMAC-SHA256 hesaplayın.
  5. Bunu, alınan sign ile sabit zamanlı karşılaştırma kullanarak (hash_equals, crypto.timingSafeEqual, hmac.compare_digest, subtle.ConstantTimeCompare, OpenSSL.fixed_length_secure_compare) karşılaştırın.

İmzalama anahtarı webhook kaynağına bağlıdır:

WebhookDoğrulama anahtarı
Ödeme / statik cüzdan webhook'ları (/v1/payment, /v1/static-wallet)API key
Çekim webhook'ları (/v1/payout)Payout API key

Sık karşılaşılan doğrulama tuzakları. JSON kodlayıcınız gönderenin ürettiği birebir aynı baytları üretmelidir — aksi halde Base64 farklılaşır ve imza eşleşmez.

  • Go: json.NewEncoder ile SetEscapeHTML(false) kullanın. Varsayılan json.Marshal, <, >, & karakterlerini < olarak escape eder ve imzayı bozar.
  • Python: json.dumps çağrısına ensure_ascii=False geçirin. Bu olmadan, ASCII olmayan karakterler (Kiril, Çince, …) \uXXXX olarak escape edilir.
  • Kompakt JSON: alanlar arasında boşluk olmamalı (Python'da separators=(",", ":")).
  • Alan sırası (Go): düz bir map[string]any yeniden kodlamada anahtarları rastgeleleştirir. json.RawMessage, sıralı bir struct kullanın ya da sign alanını ham baytlardan çıkarın.

Doğrulama hâlâ başarısız oluyorsa, payload üzerinde apiSign fonksiyonunu kendiniz çalıştırın — alınan sign ile aynı hex dizesini üretmelidir.

Geçerli bir imza yeniden oynatmaları (replay) engellemez. Yalnızca webhook'un 2328.io'dan geldiğini kanıtlar — bir saldırganın yakalanmış bir webhook'u sonradan tekrar göndermesini engellemez. Fonları alacaklandırmadan önce her zaman uuid (veya statik cüzdanlar için txid) ile idempotency kontrolü yapın. İmza eksik veya yanlışsa HTTP 401 ile reddedin.

Tam kod örnekleri Webhook Notifications sayfasındadır. Yeniden deneme yönetimi ve idempotency kuralları En iyi uygulamalar bölümünde bulunur.