PayU (Hindistan)

PayU India Hosted Checkout, kart, UPI, net banking ve cüzdanlar PayU'nun sayfasında; yalnız INR.

Gereken bilgiler

PayU Dashboard (onboarding.payu.in) → sol menüde DeveloperAPI Keys sekmesi:

  • merchant_key: PayU'nun "Key" alanı
  • merchant_salt: "Salt-32 bit" (Salt v1; v2 değil). Gizli tutulur, tarayıcıya hiç gönderilmez.

Panelinizde Ayarlar → Ödemeler → Yöntem ekle → PayU seçin, iki değeri girin.

Test ortamı: Dashboard'da menü çubuğundaki Test Mode anahtarını açın; Developer sayfasında test key/salt görünür. Bunları girip panelde sandbox (test) modu kutusunu işaretleyin; form test.payu.in/_payment adresine gönderilir. Canlıya geçerken canlı key/salt girip kutuyu kaldırın (secure.payu.in/_payment).

Dönüş adresi (surl ve furl) her ödemeye otomatik eklenir; PayU tarafında ayrıca bir ayar gerekmez. Adres kalıbı:

https://<panel-alan-adınız>/payments/payu/callback

İsteğe bağlı: PayU Dashboard → Webhooks'ta aynı adresi "Successful Payment / Failed Payment" olayları için sunucudan sunucuya bildirim adresi olarak da tanımlayabilirsiniz. Bildirim gövdesi tarayıcı dönüşüyle aynı biçim ve imzadadır; panel ikisini de aynı şekilde doğrular, aynı mihpayid iki kez yüklenmez.

Akış

  1. Müşteri tutarı ve telefon numarasını girer, PayU'yu seçer. (Telefon PayU'nun zorunlu alanıdır.)
  2. Panel key, txnid (bizim ödeme referansımız), amount, productinfo, firstname, email, phone, surl, furl ve sunucuda hesaplanan SHA-512 hash alanlarıyla gizli bir form üretir; müşterinin tarayıcısı bu formu PayU'ya POST eder ve PayU'nun barındırdığı ödeme sayfası açılır. Kart/UPI bilgisi sizin sunucunuza hiç uğramaz.
  3. Ödeme bitince PayU müşterinin tarayıcısını surl/furl adresine (ikisi de aynı callback) status, mihpayid, txnid, amount ve ters hash ile POST eder.
  4. Panel ters hash'i kendi salt'ıyla yeniden hesaplar (salt|status||||||udf5…udf1|email|firstname|productinfo|amount|txnid|key; PayU ek ücret eklediyse başına additional_charges|). Hash tutmuyorsa, key bizim değilse ya da txnid bizim ödememiz değilse dönüş yok sayılır, bakiye yüklenmez.
  5. Hash doğru ve status = success ise bakiye yüklenir; müşteri "Bakiye yükle" sayfasına başarı mesajıyla döner. failure'da ödeme "başarısız" olur, PayU'nun error_Message'ı ödeme notuna yazılır.

Aynı mihpayid + durum için ikinci dönüş yok sayılır; bakiye iki kez yüklenmez.

Durumlar

  • success → tamamlandı, bakiye yüklendi.
  • pending → panelde beklemede; bakiye yüklenmez. PayU sonradan success bildirirse (webhook ya da müşterinin geç dönüşü) o zaman yüklenir; gelmezse Admin → Ödemeler'den elle tamamlayabilirsiniz. unmappedstatus usercancelled/bounced/dropped ise beklemede değil başarısız sayılır.
  • failure → başarısız.

Para birimleri

Bu sürücü yalnız INR ile çalışır; yöntem para birimi INR değilse ödeme başlatılmaz. PayU'nun çoklu para birimi (transactionCurrency) özelliği ayrı bir sözleşme ister ve bu sürücüde yoktur.

Sınırlar

PayU txnid için 25 karakter, firstname için test ortamında 20 karakter, productinfo için 100 karakter kabul eder. Panel adı ve ürün metnini ASCII'ye indirir ve kısaltır; referans 25 karakteri aşarsa ödeme başlamadan hata verir.

Sık sorunlar

  • "Hash mismatch" / PayU sayfası açılmıyor: Key ile salt aynı ortama (test/canlı) ait değil ya da Salt v2 girilmiş. Salt v1'i kullanın ve sandbox kutusunun ortamla eşleştiğinden emin olun.
  • Dönüşte "invalid signature": Paneldeki salt, PayU'nun imzaladığı salt değil (yanlış değer, Salt v2 ya da test/canlı karışmış). Ödeme "bekliyor"da kalır, bakiye yüklenmez; salt'ı düzeltip müşteriden yeniden denemesini isteyin ya da PayU Dashboard'da gördükten sonra elle tamamlayın.
  • Ödeme başarılı ama bakiye yok: Dönüş tarayıcıdan geldiği için müşteri sayfayı kapatmışsa panel sonucu görmemiş olabilir. PayU Dashboard'da webhook tanımlayın (yukarıdaki adres) ki PayU sonucu sunucudan sunucuya da bildirsin; o zamana kadar PayU Dashboard'da mihpayid'yi doğrulayıp ödemeyi Admin → Ödemeler'den tamamlayın.
  • Telefon istiyor: PayU phone alanını zorunlu tutar; müşteri numara girmeden bu yöntemle ödeme yapamaz.