Ana içeriğe geç

Webhook URL

Genel bakış

Bu özellik, ödenen faturanın verilerini satıcının sunucusuna iletir. Amacı, satıcının mağazasının ödemeyi otomatik olarak işleyebilmesi ve ürünü veya hizmeti alıcınıza teslim edebilmesidir.

Webhook URL, her proje için ayrı ayrı ayarlanır ve satıcının mağazasındaki ödeme işleyici betiklerine işaret eder. Adres HTTPS ve bir alan adı kullanmalıdır: IP adresleri kabul edilmez ve sertifika her teslimatta doğrulanır.

Bir faturanın durumu her Ödendi (Paid) olduğunda hizmet, bu adrese aşağıdaki biçimde bir POST isteği gönderir:

{
"wallet":{
"id":"47aa71e2-07a0-482e-9172-7114d7376ba0",
"name":"usdt-tron",
"blockchain":"tron",
"cryptocurrency":"usdt",
"address":"TKbstUwMzLrfTAGL4erYb7gc7ghmHQ9zG7"
},
"project":{
"id":"9deea1e2-0c08-41a3-bdc2-a34eada3892d",
"name":"My project",
"commissionPayer":"seller",
"commissionRate":1
},
"invoice":{
"id":"a4c9e2ee-9a03-43e5-a1a1-00caf679d16a",
"uid":"AFhygKX21ecd",
"createDatetime":"2024-02-26 13:29:24",
"timeToPayDatetime":"2024-02-27 01:29:24",
"commissionFiatUSD":0.05,
"amountFiatUSD":5.02,
"amountFiat":5,
"calcAmountFiat":5.02,
"currencyFiat":"USD",
"description":null,
"serviceData":null,
"status":"paid"
},
"payment":{
"id":"f986ad8d-2298-473d-982a-efbc817b975d",
"amount":5.02,
"hash":"74763b65e43bcc9492a6ce9a7f26fbfdbd7635aecd3454420b5e9534cba50ee6",
"transactionDatetime":"2024-02-26 13:32:57"
}
}

Bildirim, Ödendi durumuna her geçişte gönderilir — hem hizmet ödemeyi otomatik olarak bulduğunda hem de satıcı ödemeyi faturayla manuel olarak eşleştirdiğinde.

İstek parametreleri

ParametreAçıklama
wallet.idUUID biçiminde cüzdan ID'si
wallet.nameCüzdan adı
wallet.blockchainKripto cüzdanının blockchain'i
wallet.cryptocurrencyCüzdanın kripto parası
wallet.addressKripto cüzdanının adresi
project.idUUID biçiminde proje ID'si
project.nameProje adı
project.commissionPayerHizmet ücretini kimin ödediği
project.commissionRate% cinsinden ücret oranı
invoice.idUUID biçiminde fatura ID'si
invoice.uidFatura ID'si (alıcı için)
invoice.createDatetimeFaturanın oluşturulma tarihi ve saati (UTC)
invoice.timeToPayDatetimeFaturanın alıcı için geçerli olduğu son tarih ve saat (UTC). Ödeme araması, bu işaretten sonra 1 saat daha devam eder — bu, yavaş ağlar içindir. Bu yüzden, zaten süresi dolmuş olarak gösterilen bir fatura için bildirim gelebilir
invoice.commissionFiatUSDHizmet ücreti tutarı. invoice.amountFiatUSD tutarından hesaplanır
invoice.amountFiatUSDUSD cinsinden tutar. Fatura oluşturulurken invoice.amountFiat değerinden güncel kura göre hesaplanır. Ödeme anında üzerine fiilen alınan tutar yazılır, o andaki kurla USD'ye dönüştürülerek. invoice.commissionFiatUSD içindeki ücret de bundan yeniden hesaplanır
invoice.amountFiatFaturanın itibari para cinsinden orijinal tutarı. Değişmez
invoice.calcAmountFiatÖdeme anındaki kripto kuruna göre invoice.currencyFiat para biriminde hesaplanan tutar. Alıcı, faturayı hemen değil oluşturulmasından bir süre sonra ödemiş olabileceği için invoice.amountFiat değerinden farklı olabilir. Bu süre içinde kripto kuru, invoice.currencyFiat karşısında iki yönde de hareket etmiş olabilir
invoice.currencyFiatİtibari para birimi
invoice.descriptionFatura oluşturulurken ayarlanan açıklama
invoice.serviceDataFatura oluşturulurken ayarlanan hizmet verisi
invoice.statusFatura durumu
payment.idUUID biçiminde ödeme ID'si
payment.amountKripto para cinsinden ödeme tutarı
payment.hashOn-chain işlemin hash'i
payment.transactionDatetimeOn-chain işlemin tarihi ve saati (UTC)

Bildirim imzası

Her istek, webhook gizli anahtarıyla imzalanır. İmza, X-Timestamp ve X-Signature başlıklarında taşınır ve bildirimin, işleyicinizin adresini öğrenen bir yabancıdan değil hizmetten geldiğinden emin olmanızı sağlar.

Siparişi işlemeden önce imzayı doğrulayın. Mekanizma ve hazır örnekler Webhook imzası doğrulama sayfasındadır.

İşleme önerileri

Bir bildirimi ödeme süresi geçti diye reddetmeyin. “Faturanın süresi dolmuş, o hâlde ödeme geçersiz” gibi bir kontrol mantıklı görünür ama gerçek ödemelerin bir bölümünü keser: yavaş ağlarda işlem, süre geçtikten sonra onaylanabilir ve satıcı, süresi dolmuş bir faturaya ödemeyi manuel olarak eşleştirebilir. Bildirimin kendisi ödemeyi onaylar.

Tutarı orijinal alan invoice.amountFiat üzerinden doğrulayın. Bu, faturanın kesildiği tutardır ve değişmez. amountFiatUSD alanı, fiilen alınan tutarı yansıtır ve kesilen tutardan farklı olabilir — hem kur hareketi hem de manuel ödeme eşleştirme nedeniyle.

Tutarları sayı olarak ayrıştırın. Sondaki sıfırlar atılır: 10.00 tutarı 10 olarak gelir; görüntüleme için kendi tarafınızda biçimlendirin. 0.0001 altındaki tutarlar üstel gösterimle gelir, örneğin 1.0e-6 — standart JSON ayrıştırma doğru sayıyı döndürür; yalnızca elle dize ayrıştırma bozulur.

Bildirimleri idempotent şekilde işleyin. Aynı bildirim yeniden gelebilir — örneğin betiğiniz ödemeyi başarıyla işlediği hâlde 2xx dışı bir kod döndürdüyse. Siparişi teslim etmeden önce, bu invoice.id değerinin daha önce işlenip işlenmediğini kontrol edin.

Çıktıda değerlere kaçış uygulayın. invoice.description ve invoice.serviceData alanları, tam olarak satıcının gönderdiği hâliyle geri gelir. Bunları HTML'de görüntülüyorsanız kendi tarafınızda kaçış uygulayın.

Teslimat takvimi

Webhook URL'deki sunucu, 2xx HTTP koduyla yanıt vermelidir. Başka bir kod, zaman aşımı veya kopan bağlantı başarısız teslimat sayılır.

Yönlendirmeler izlenmez: 301 veya 302 yanıtı, yeni adrese geçiş değil başarısız teslimattır. İşleyicinin nihai adresini ayarlayın.

Bağlantıya 5 saniye, isteğin tamamına 10 saniye tanınır. İşleyici bu süreye sığmazsa teslimat başarısız sayılır.

Başarısız teslimattan sonra hizmet, şu takvimle yeniden dener:

  • Son başarısız teslimattan 5 dakika sonra
  • 15 dakika sonra
  • 30 dakika sonra
  • 1 saat sonra
  • 3 saat sonra
  • 6 saat sonra
  • 12 saat sonra
  • 24 saat sonra

Bundan sonra teslimat denemeleri durur.

Webhook URL'yi devre dışı bırakma

Bazen mağazanın webhook betiği ödemeyi doğru işler ama 2xx dışı bir HTTP kodu döndürür. Bu, sunucumuzun yukarıdaki takvimle sık sık yeniden denemesine yol açar ve hem bizim sunucumuza hem sizinkine ek yük bindirir.

Bu tür durumları önlemek için projede Webhook URL'yi devre dışı bırakan bir mekanizmamız vardır. Bununla karşılaşmamak için şu adımları izleyin:

  1. Webhook işleyici kodunuzu, ödeme başarıyla işlendiğinde 2xx kodu, genellikle 200, döndürecek şekilde değiştirin. Herhangi bir emülatörle, örneğin Postman'le test edin.
  2. Ayarların düzeltilmesi için teknik desteğe başvurun.
  3. Proje ayarlarında Webhook URL'yi yeniden etkinleştirin ve projeyi kaydedin.