Ana içeriğe geç

Webhook imzası doğrulama

Ödeme bildirimi, yalnızca mağazanızın ve hizmetimizin bildiği bir adrese gelir. Ancak adres sızabilir — günlüklerden, yapılandırmadan, geliştirme geçmişinden. Gerçek bildirimi sahtesinden ayırmak için her istek, webhook gizli anahtarıyla imzalanır.

Siparişi teslim etmeden veya durumunu değiştirmeden önce imzayı doğrulayın.

İmza başlıkları

BaşlıkDeğer
X-TimestampGönderim zamanı, saniye cinsinden unix time
X-Signaturesha256= öneki ve hex olarak HMAC-SHA256

İmzalanan dize, gönderim zamanı, bir nokta ve istek gövdesinden oluşur:

1756901234.{"wallet":{...},"project":{...},"invoice":{...},"payment":{...}}

İmzalama anahtarı, proje ayarlarındaki Webhook gizli anahtarı (Webhook secret) alanıdır. Değer ele geçirilirse orada yeniden verebilirsiniz.

Doğrulama adımları

  1. Ham istek gövdesini, JSON'u ayrıştırmadan önce alın.
  2. X-Timestamp değerini, bir noktayı ve gövdeyi birleştirin.
  3. Webhook gizli anahtarıyla HMAC-SHA256'yı hesaplayın.
  4. Sonucu, sabit zamanlı karşılaştırma kullanarak X-Signature ile karşılaştırın.
  5. X-Timestamp şu anki zamandan çok sapıyorsa isteği reddedin.

Uygulama örnekleri

<?php
$secret = 'webhook secret from your project settings';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Guards against a replayed request
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

// hash_equals compares in constant time
if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$data = json_decode($body, true);

// Handle the order

http_response_code(200);

Akılda tutulması gerekenler

Ham gövde imzalanır. JSON'u ayrıştırıp yeniden oluşturursanız anahtar sırası ve boşluklar değişir — imza eşleşmez. HMAC'i ayrıştırmadan önce hesaplayın.

Her yeniden denemenin kendi imzası vardır. Gönderim zamanı her yeniden denemede yenidir, dolayısıyla imza da farklıdır. Gelecekteki isteklerle karşılaştırmak için imza saklamayın.

Gizli anahtar yeniden verilebilir. Eski gizli anahtar, yeniden verildikten hemen sonra çalışmayı durdurur; bu yüzden mağazanızdaki değeri aynı anda güncelleyin.

İmza doğrulama, idempotentliğin yerini tutmaz. İmza, isteğin gerçek olduğunu kanıtlar; onu ilk kez gördüğünüzü değil. Yeniden deneme, geçerli bir imzayla gelir — invoice.id üzerinden kontrol edin.