Ödeme sağlayıcısından dönen o kısa satırı ilk gördüğünde ne düşündüğünü biliyorum: "imza geçersiz" yazısı sana kart, banka ya da müşteri tarafında bir sorun varmış gibi gelir. Çoğu işletme sahibi de tam olarak bunu sanır; destek bileti açar, sağlayıcıyı arar, müşteriye "kartınızda problem var" der. Oysa imza hatası neredeyse hiçbir zaman paranın kendisiyle ilgili değildir. O mesaj, senin dijital ürün satış scriptinin ürettiği parmak izinin, sağlayıcının kendi tarafında ürettiği parmak iziyle eşleşmediğini söyler. Yani para hiç yola çıkmamıştır; el sıkışma aşamasında iki taraf birbirini tanımamıştır.
İşin can sıkıcı tarafı şu: aynı hata bazen yüz siparişten üçünde çıkar, geri kalanında hiç görünmez. Bu düzensizlik seni yanlış yere bakmaya iter. Ama rastgele değil. İmza, sıralı bir metin zincirinin özetidir; o zincire giren tek bir karakter, tek bir boşluk, tek bir küsurat farkı çıktıyı baştan sona değiştirir. Bu yazıda o zinciri parça parça açıp, bir e-pin satış scriptinde imzayı bozan yedi gizli ayarı, canlı ile test ortamı arasındaki farkın neden hata ürettiğini ve doğrulamayı atlayan bir kurulumun seni nasıl sessizce soyabileceğini anlatacağım.
İmza Hatası Gerçekten İmzadan mı Kaynaklanıyor?
Sağlayıcı sana tek bir cümle döner, çünkü fazlasını dönmek güvenlik açığıdır. "Hangi alan uyuşmadı" bilgisini verirse, kötü niyetli biri deneme yanılmayla doğru imzayı bulabilir. Bu yüzden hata mesajı bilerek kördür ve teşhisi tamamen senin tarafına bırakır.
Pratikte imza şöyle üretilir: sağlayıcının belirlediği alanlar belirli bir sırayla birleştirilir, araya ayırıcı konur, sonuna gizli anahtar eklenir ve tüm metin bir özet fonksiyonundan geçirilir. Sağlayıcı aynı işlemi kendi tarafında tekrarlar. İki özet aynıysa işlem başlar. Burada kritik nokta şu: alanların değeri değil, metne dönüşme biçimi belirleyicidir. 100 ile 100.00 aynı paradır ama farklı metindir. Dolayısıyla farklı imzadır.
Bu yüzden teşhise başlarken yapılacak ilk iş, scriptin imzaya giren ham metni bir yere yazması. Değerleri değil, birleştirilmiş nihai metni. Pinova gibi ödeme katmanını modüler tutan bir e-pin yazılımında bu ham metin hata kaydına maskeli biçimde düşer; anahtar yıldızlanır, geri kalan zincir olduğu gibi görünür. O tek satırı gördüğün an teşhis dakikalar sürer, günler değil.
Hash Zincirini Sessizce Bozan Yedi Ayar
Yıllardır aynı yedi sebep dönüp duruyor. Birincisi parametre sırası: sağlayıcı dokümanında sıra alfabetik yazıyorsa, sen gönderim sırasına göre birleştirdiğinde imza tutmaz. İkincisi ondalık biçimi: virgül ile nokta karışması, ya da kuruş basamağının bazen iki bazen sıfır hane olması. Üçüncüsü karakter kodlaması: ürün adında Türkçe karakter varsa ve bir taraf UTF-8, diğeri farklı bir kodlama kullanıyorsa özet değişir.
Dördüncüsü boş alan davranışı: bazı sağlayıcılar boş alanı zincire dahil eder, bazıları atlar. Beşincisi sipariş numarası biçimi: başına harf eklemek, tire koymak ya da uzunluk sınırını aşmak. Altıncısı dönüş adresi: imzaya giren callback adresi ile panelde tanımlı adresin birebir aynı olması gerekir, sondaki eğik çizgi dahil. Yedincisi ve en sinsisi anahtar sürümü: sağlayıcı panelinden anahtar yenilendiğinde scriptteki eski anahtar hâlâ çalışmaya devam eder ve bazı isteklerde tutar, bazılarında tutmaz.
Bu yedi maddeyi tek tek elemek yerine, hepsini aynı anda gösteren bir karşılaştırma tablosu kur. Hangi alanın ne biçimde gittiğini bir bakışta görmek, sağlayıcıyla yapacağın yazışmayı bir haftadan bir mesaja indirir.
| Zincir Öğesi | Yaygın Yanlış | Doğru Biçim | Belirti |
|---|---|---|---|
| Tutar | 149,90 veya 149 | 149.90 (nokta, iki hane) | Bazı siparişte tutar, bazısında tutmaz |
| Parametre sırası | Formdaki görünüm sırası | Dokümandaki sabit sıra | Her istekte aynı hata |
| Kodlama | Türkçe karakterli ürün adı | UTF-8, gerekiyorsa sadeleştirme | Sadece bazı ürünlerde hata |
| Callback adresi | www'lu ve www'suz karışık | Panelle birebir aynı tek adres | Ödeme başlar, dönüş düşer |
| Gizli anahtar | Kopyalarken kayan boşluk | Kırpılmış, sürüm notlu anahtar | Anahtar değişiminden sonra başlar |
| Sipariş numarası | Tire ve harf içeren uzun kod | Sağlayıcı desenine uygun kısa kod | Uzun numaralı siparişlerde hata |
| Zaman damgası | Sunucu saati kaymış | Senkron saat, doğru zaman dilimi | Aralıklı, açıklanamayan hatalar |
Neden Test Ortamında Çalışıp Canlıda Patlıyor?
Bu soruyu bana en çok soranlar, test ortamında yüz işlem yapıp hiç hata almayan işletmeler. Sebep basit ama görünmez: test ve canlı ortamlar genellikle farklı doğrulama katılığında çalışır. Test tarafı seni hızlı entegre etsin diye bazı alanları esnek kabul eder; canlı taraf ise katı davranır. Yani test ortamı sana yanlış bir güven verir.
İkinci sebep ortam değişkenlerinin taşınmaması. Test anahtarı ile canlı anahtarın uzunlukları ve algoritmaları bile farklı olabilir. Script canlıya alınırken anahtar değişir ama imza üretim biçimi test moduna göre kalırsa, zincir baştan bozuktur. Üçüncü sebep ise canlıda araya giren katmanlar: önbellek, güvenlik duvarı ve içerik ağı. Bunlar bazı başlıkları yeniden yazar, bazı istekleri sıkıştırır ve imzaya giren ham gövdeyi değiştirebilir.
Bu yüzden sağlam bir dijital ürün satış yazılımı canlıya geçiş anında tek bir düğmeyle mod değiştirmez; hem anahtarı hem imza profilini hem callback adresini aynı işlemde günceller ve ilk gerçek işlemden önce kendi kendine bir doğrulama turu atar.
İmza Hatası Kök Nedenleri (destek kayıtlarından derlenen dağılım)
- Tutar ve biçim farkı 42%
- Anahtar ve sürüm karışıklığı 26%
- Sıra ve kodlama 20%
- Ortam ve saat kayması 12%
Sağlayıcı Panelindeki Tek Bir Boşluk Karakteri Ne Yapar?
Anahtarı panelden kopyalarken sonuna görünmez bir boşluk ya da satır sonu karakteri takılır. Gözle ayırt edemezsin, yapıştırdığın alan onu sessizce kabul eder. Sonra imza üretilirken o boşluk zincire dahil olur ve çıktı tamamen değişir. Yıllarca süren "bir gün çalışıyor bir gün çalışmıyor" hikâyelerinin arkasında çoğu zaman bu vardır.
Bunun panzehiri, anahtarı kaydeden alanın kırpma ve uzunluk doğrulaması yapmasıdır. Bir e-pin satış yazılımı anahtarı kaydederken baştaki ve sondaki görünmez karakterleri temizlemeli, beklenen uzunlukla karşılaştırmalı ve uymuyorsa kaydetmeyi reddetmelidir. Aynı şekilde anahtarın son dört hanesini panelde göstermek, sağlayıcı panelindeki değerle bakışarak eşleştirmeyi saniyeler içinde mümkün kılar.
Bir de şu alışkanlığı edin: anahtarı asla sohbet uygulamasından ya da e-postadan taşıma. Bu araçlar uzun metinleri satır sonuyla kırar ve fark etmeden bozuk bir değer taşırsın. Anahtarı doğrudan panelden panele taşı, arada hiçbir metin editörü olmasın.
Callback İmzasını Doğrulamayan Script Seni Nasıl Soyar?
Şimdi madalyonun tehlikeli yüzüne geçiyoruz. İmza iki yönlüdür: sen sağlayıcıya giderken imza üretirsin, sağlayıcı sana "ödeme başarılı" derken de imza üretir. Çok sayıda kurulum ikinci kısmı atlar. Yani dönen bildirimi sorgusuz kabul eder, siparişi onaylar ve e-pin kodunu anında teslim eder.
Bu durumda birinin yapması gereken tek şey, senin dönüş adresine elle bir başarı bildirimi göndermektir. Para hesabına hiç girmez, kod müşteriye gider. Stok erir, marj erir ve sen bunu ancak ay sonu mutabakatında fark edersin. Dijital ürün satan bir işletme için bu, kasayı açık bırakmakla eşdeğerdir çünkü sattığın şey geri alınamaz.
Doğru davranış şu: gelen bildirimin imzasını doğrula, sipariş numarasını kendi veritabanındaki bekleyen kayıtla eşleştir, tutarı kuruşuna kadar karşılaştır, aynı bildirimin daha önce işlenip işlenmediğini kontrol et ve mümkünse sağlayıcıya geri dönüp işlemin durumunu kendi sorgunla teyit et. Bu beş adımın hepsi geçmeden tek bir kod teslim edilmemeli.
Teslimatı tetikleyen şey müşterinin gördüğü ekran değil, sağlayıcı tarafından imzalanmış ve senin tarafından yeniden sorgulanmış işlem durumu olmalı. Tarayıcıdan gelen hiçbir bilgi ödeme kanıtı sayılmaz.
Kendi Kendini Denetleyen Bir Ödeme Katmanı Nasıl Kurulur?
İmza hatasını tek seferde çözmek yeterli değil; bir daha aynı yere dönmemek için ödeme katmanının kendini denetlemesi gerekir. Bunun üç bacağı var. Birincisi ham zincir kaydı: her işlemde imzaya giren metin maskeli olarak saklanır, hata geldiğinde tahmin yürütmezsin. İkincisi ön uçuş kontrolü: sağlayıcıya ilk gerçek isteği göndermeden önce script kendi ürettiği imzayı dokümandaki örnek veriyle sınar ve tutmuyorsa canlı moda geçişi engeller.
Üçüncüsü mutabakat döngüsü: günün sonunda sağlayıcı kayıtları ile kendi sipariş kayıtların otomatik karşılaştırılır. Tutarsız tek satır bile varsa bildirim düşer. Bu üçlü kurulduğunda imza hataları teşhisi dakikalara iner, sahte bildirim riski sıfırlanır ve mutabakat işi elle yapılan bir angaryadan çıkar.
Aşağıdaki kontrol listesini kendi kurulumunda tek tek işaretle. Hepsine "evet" diyemiyorsan, ödeme katmanın şu anda sana hata mesajı vermeden risk taşıyor demektir.
| Kontrol | Neden Kritik | Durum |
|---|---|---|
| İmzaya giren ham metin maskeli kaydediliyor | Teşhis süresini günlerden dakikalara indirir | Zorunlu |
| Callback imzası her bildirimde doğrulanıyor | Sahte başarı bildirimini engeller | Zorunlu |
| Tutar kuruş bazında karşılaştırılıyor | Eksik ödemeyle teslimatı önler | Zorunlu |
| Aynı bildirim iki kez işlenemiyor | Çift teslimat ve stok kaybını keser | Zorunlu |
| Anahtar kaydında kırpma ve uzunluk kontrolü var | Görünmez boşluk kaynaklı hataları bitirir | Yüksek |
| Canlı moda geçişte ön uçuş imza testi yapılıyor | Test-canlı farkını baştan yakalar | Yüksek |
| Günlük otomatik mutabakat çalışıyor | Sessiz kayıpları aynı gün görünür kılar | Yüksek |
| Sunucu saati senkron | Aralıklı zaman damgası hatalarını keser | Orta |
Ödeme katmanı kendini denetleyen bir altyapıya geç
İmza zinciri kaydı, callback doğrulaması, çift teslimat koruması ve günlük mutabakat; hepsi kurulu olarak gelsin. Sen ürüne ve satışa odaklan.
İmza hatası alan siparişte müşterinin parası çekildi mi?
Hayır. İmza doğrulaması el sıkışma aşamasındadır ve başarısız olduğunda işlem hiç başlamaz. Yine de nadir durumlarda provizyon görünebilir; bu yüzden her şüpheli siparişte sağlayıcı panelinden işlem durumunu kendi sorgunla teyit etmelisin.
Hata neden sadece bazı siparişlerde çıkıyor?
Çünkü zinciri bozan unsur o siparişe özgüdür: Türkçe karakterli ürün adı, küsuratsız tutar, uzun sipariş numarası ya da boş kalan bir alan. Ham imza metnini kaydettiğinde hangi siparişte neyin farklı olduğunu tek bakışta görürsün.
Sağlayıcıyı değiştirmek sorunu çözer mi?
Genellikle hayır. Aynı hata yeni sağlayıcıda farklı bir isimle geri gelir, çünkü kök neden imza üretim disiplininin eksikliğidir. Önce zinciri kayıt altına al, sonra sağlayıcı kararını performansa ve komisyona göre ver.
Birden fazla ödeme sağlayıcısını aynı kurulumda kullanabilir miyim?
Evet ve dijital ürün satışında şiddetle önerilir. Her sağlayıcının imza profili ayrı tanımlanır, biri kesintiye girdiğinde trafik diğerine kayar. Önemli olan her profilin kendi doğrulama ve mutabakat kaydını ayrı tutmasıdır.
İmza hatası, aslında sana iyilik yapan bir uyarıdır: ödeme katmanının hangi noktada körleştiğini gösterir. Kötü haber, aynı körlüğün hata vermeden çalıştığı durumların çok daha pahalıya patlamasıdır. Kendi kurulumunda ham zincir kaydı, callback doğrulaması ve günlük mutabakat yoksa, bugün hata almasan bile risk taşıyorsun. Ödeme akışının, teslimat kilidinin ve mutabakat ekranının gerçek bir kurulumda nasıl çalıştığını kendi gözünle görmek istersen canlı demo üzerinden dolaş, ardından özellik listesini ve fiyat seçeneklerini karşılaştır; kararını hata mesajlarına değil kanıta dayandır.

