Ödeme Sonucu
successUrl'e dönmek başarı demek değildir — sonucu doğru okumanın tek yolu buradaki kontrollerdir.
Altın Kural
Ödeme yalnızca RESPONSE_CODE = 2 ve AUTH_CODE geçerli bir değerken başarılıdır. AUTH_CODE boş, 0 ya da 00 ise işlem başarısızdır — successUrl'e dönmüş olması hiçbir şey ifade etmez.
Karar Akışı
- 1hashDataV2 doğru mu?Yanıttaki imzayı Response Hash yöntemiyle kendiniz hesaplayıp karşılaştırın. Farklıysa işlem Paynkolay'dan gelmiyordur — işlemi kesin.
- 2RESPONSE_CODE 2 mi?Değilse işlem başarısızdır; RESPONSE_DATA hata mesajını taşır.
- 3AUTH_CODE geçerli mi?Boş, 0 veya 00 ise başarısız sayın.
- 4Tutarı karşılaştırınAUTHORIZATION_AMOUNT, gönderdiğiniz amount'a eşit ya da ondan büyük olmalıdır.
Yanıt İmzasını Doğrulama (Response Hash)
Yanıttaki hashDataV2, aşağıdaki alanlardan üretilir; aynı imzayı kendiniz hesaplayıp karşılaştırmadan sonucu güvenilir saymayın:
MERCHANT_NO | REFERENCE_CODE | AUTH_CODE | RESPONSE_CODE | USE_3D | RND | INSTALLMENT | AUTHORIZATION_AMOUNT | CURRENCY_CODE | merchantSecretKey
# SHA-512 → Base64 (UTF-8)$hashstr = $MERCHANT_NO."|".$REFERENCE_CODE."|".$AUTH_CODE."|".$RESPONSE_CODE."|".$USE_3D."|".$RND."|".$INSTALLMENT."|".$AUTHORIZATION_AMOUNT."|".$CURRENCY_CODE."|".$merchantSecretKey;
$beklenen = base64_encode(hash("sha512", $hashstr, true));
// $beklenen, yanıttaki hashDataV2 ile birebir aynı olmalıYanıttaki RND, istekte gönderdiğiniz rnd değerinden farklıdır — imzayı yanıtta dönen değerlerle hesaplayın. Hash'ler eşleşmiyorsa yanıt Paynkolay'dan gelmiyor olabilir; işlemi sonlandırın.
Hazır Kontrol Fonksiyonu
function isPaymentSuccessful(array $result): bool
{
$code = $result['RESPONSE_CODE'] ?? null;
$auth = trim((string)($result['AUTH_CODE'] ?? ''));
// RESPONSE_CODE 2 olmalı VE AUTH_CODE gerçek bir değer olmalı
return (string)$code == '2'
&& !in_array($auth, ['', '0', '00'], true);
}function isPaymentSuccessful(result) {
const code = String(result.RESPONSE_CODE ?? '');
const auth = String(result.AUTH_CODE ?? '').trim();
// RESPONSE_CODE 2 olmalı VE AUTH_CODE gerçek bir değer olmalı
return code == '2' && !['', '0', '00'].includes(auth);
}def is_payment_successful(result: dict) -> bool:
code = str(result.get("RESPONSE_CODE", ""))
auth = str(result.get("AUTH_CODE", "")).strip()
# RESPONSE_CODE 2 olmalı VE AUTH_CODE gerçek bir değer olmalı
return code == "2" and auth not in ("", "0", "00")public static bool IsPaymentSuccessful(IDictionary<string, string> result)
{
result.TryGetValue("RESPONSE_CODE", out var code);
result.TryGetValue("AUTH_CODE", out var auth);
auth = (auth ?? "").Trim();
// RESPONSE_CODE 2 olmalı VE AUTH_CODE gerçek bir değer olmalı
return code == "2"
&& auth != "" && auth != "0" && auth != "00";
}public static boolean isPaymentSuccessful(Map<String, String> result) {
String code = result.getOrDefault("RESPONSE_CODE", "");
String auth = result.getOrDefault("AUTH_CODE", "").trim();
// RESPONSE_CODE 2 olmalı VE AUTH_CODE gerçek bir değer olmalı
return code.equals("2")
&& !auth.equals("") && !auth.equals("0") && !auth.equals("00");
}Örnek Dönüşler
Başarılı işlem successUrl adresinize, başarısız işlem failUrl adresinize POST edilir. Alan listesi 3D ve Non-3D akışında küçük farklarla aynıdır:
RESPONSE_CODE: 2
RESPONSE_DATA: İşlem Başarılı
USE_3D: false
RND: 1630051651137
MERCHANT_NO: 400000001
AUTH_CODE: S00586
REFERENCE_CODE: IKSIRPF102168
CLIENT_REFERENCE_CODE: 42794212
TIMESTAMP: 2021-08-27
TRANSACTION_AMOUNT: 1.00
AUTHORIZATION_AMOUNT: 1.00
COMMISION: 0.00000000
COMMISION_RATE: null
INSTALLMENT: 1
hashData: bjb49lGdnE2D/D5Jze2/sn7Xfk0=
hashDataV2: lunnRyNfDu6pdpNjjlFrlATE4PjUluM8…RESPONSE_CODE: 2
RESPONSE_DATA: İşlem Başarılı.
REFERENCE_CODE: IKSIRPF142277040
USE_3D: true
MERCHANT_NO: 400000002
AUTH_CODE: 345344
CLIENT_REFERENCE_CODE: 24809740|988922
TIMESTAMP: 2022-02-24 13:58:36.353
TRANSACTION_AMOUNT: 1.00
AUTHORIZATION_AMOUNT: 1.00
COMMISION: 0.00
COMMISION_RATE: 0.0000
INSTALLMENT: 1
RND: 1645700316156
hashData: +wDy2xeI1hOCnwaatSqylWhtj9E=
hashDataV2: lunnRyNfDu6pdpNjjlFrlATE4PjUluM8…
BANK_RESULT: Response : IKSIRPF142277040 …
ERROR_CODE: 0Yanıttaki hashDataV2, istek imzasından farklı hesaplanır (Response Hash). Doğrulamadan siparişi asla onaylamayın. Hatalı işlemde RESPONSE_CODE = 0 döner ve AUTH_CODE boştur.
Son güncelleme: 10 Eylül 2026