DOCS
Panel Giriş Başvurun

Ek Bilgiler

iFrame Kullanımı

Ortak ödeme sayfasını kendi sitenizin içinde iframe ile açma: örnek kurulum, SameSite çerez ve X-Frame-Options sorunlarının çözümleri, canlıya çıkış kontrol listesi.

Önerilmez: iframe kullanımını önermiyoruz — yönlendirme akışı hem daha basit hem daha sorunsuzdur. Yine de kullanacaksanız, düzgün çalışması için sunucu ve sayfa ayarlarınızda aşağıdaki yapılandırmalar gerekir.

Temel Kullanım

Sanal POS'u iframe içinde açabilirsiniz; iframe'de yüklenen sayfa kendi sitenizde barındırdığınız ödeme formu olmalıdır (örnek form: Form ile Güvenli Ödeme). Paynkolay'ın iframe-resizer script'i, çerçevenin yüksekliğini içeriğe göre otomatik ayarlar:

Örnek — HTML
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>iframe</title>
</head>
<body>

<div class="container">
<script src="https://paynkolaytest.nkolayislem.com.tr/VPos/js/paynkolay-iframe-resizer.js"></script>

<!-- iframe içinde çağırdığınız web sitesi sizin web siteniz olmalıdır.
     Ödeme formu için Form ile Ödeme sayfasındaki örnek kullanılabilir. -->
<iframe src="https://siteniz.com/odeme-formu" id="paynkolayiframe"
        frameborder="0" scrolling="no" style="width: 100%;"></iframe>
<script>iFrameResize({}, '#paynkolayiframe');</script>
</div>

</body>
</html>

1. SameSite Çerez Kısıtlamaları (En Yaygın)

Belirti: müşteri iframe içinde ödemeyi tamamlıyor ama sitenize dönüşte oturumu kaybolmuş görünüyor; sepet boşalıyor ya da "yeniden giriş yapın" ekranı geliyor. Nedeni, tarayıcıların çerezleri varsayılan olarak SameSite=Lax sayması ve iframe içindeki cross-site isteklerde engellemesidir. Çözüm, oturum çerezini SameSite=None; Secure ile açmaktır (HTTPS zorunludur):

// PHP
session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'domain' => '.domain.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'None'
]);
session_start();
// ASP.NET Core
services.AddSession(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
// Node.js / Express
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
    cookie: {
        secure: true,
        httpOnly: true,
        sameSite: 'none'
    }
}));
# Django (settings.py)
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'None'
SESSION_COOKIE_HTTPONLY = True

2. X-Frame-Options Engellemesi

Belirti: iframe boş kalıyor ya da konsolda "Refused to display … in a frame" hatası görünüyor. Kendi sayfanızın X-Frame-Options başlığı iframe'e gömülmeyi engelliyordur. Üç seçenek:

Seçenek A — başlığı kaldırın
# Apache (.htaccess)
Header unset X-Frame-Options

# Nginx — mevcut add_header X-Frame-Options satırlarını kaldırın ya da yoruma alın
Seçenek B — yalnızca Paynkolay'a izin verin (eski tarayıcılar)
# Apache
Header set X-Frame-Options "ALLOW-FROM https://paynkolaytest.nkolayislem.com.tr"

# Nginx
add_header X-Frame-Options "ALLOW-FROM https://paynkolaytest.nkolayislem.com.tr";
Seçenek C — önerilen: CSP frame-ancestors
# Apache
Header set Content-Security-Policy "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr"

# Nginx
add_header Content-Security-Policy "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr";

Sunucu yapılandırmasına erişemiyorsanız CSP başlığını uygulama içinden de ekleyebilirsiniz:

// ASP.NET Core (Program.cs)
app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Content-Security-Policy",
        "frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr");
    await next();
});
// PHP
header("Content-Security-Policy: frame-ancestors 'self' https://paynkolaytest.nkolayislem.com.tr https://paynkolay.com.tr");

ALLOW-FROM modern tarayıcılarda kullanımdan kalkmıştır; güncel çözüm Content-Security-Policy: frame-ancestors direktifidir. Canlıda paynkolaytest yerine canlı alan adını yazmayı unutmayın.

Canlıya Çıkış Kontrol Listesi

  • Oturum çerezleri SameSite=None ve Secure=true ile yapılandırıldı
  • Sitede HTTPS etkin (SameSite=None için zorunludur)
  • X-Frame-Options kaldırıldı ya da gömmeye izin verecek şekilde yapılandırıldı
  • frame-ancestors direktifiyle uygun Content-Security-Policy ayarlandı
  • Başarı ve hata senaryoları dahil tam ödeme akışı test edildi
  • Ödeme sonrası kullanıcı oturumlarının devam ettiği doğrulandı
  • Chrome, Safari, Firefox ve Edge'de test edildi

Teknik Arka Plan

Buradaki sorunlar, tarayıcıların kullanıcıları clickjacking ve cross-site veri sızıntısından korumak için getirdiği güvenlik iyileştirmelerinden kaynaklanır; ödeme sayfası gibi meşru iframe entegrasyonları bu yüzden dikkatli yapılandırma ister.

SameSite çerez özelliği CSRF saldırılarını önlemek için tanıtıldı: tarayıcılar çerezleri varsayılan olarak Lax sayar ve iframe içindeki cross-site POST isteklerinde engeller. SameSite=None eski davranışı açıkça kabul eder; karşılığında çerezin yalnızca şifreli bağlantıda taşınması için Secure bayrağını zorunlu kılar.

X-Frame-Options ve Content-Security-Policy başlıkları ise sayfalarınızı hangi sitelerin çerçeveye gömebileceğini kontrol ederek clickjacking'e karşı korur; doğru yaklaşım korumayı tamamen kapatmak değil, yalnızca güvenilen ödeme sağlayıcı alan adlarına izin vermektir.

Son güncelleme: 10 Eylül 2026

v1 · Versiyonlar