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 Ödeme). Paynkolay'ın iframe-resizer script'i, çerçevenin yüksekliğini içeriğe göre otomatik ayarlar:
<!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 = True2. 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:
# 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# 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";# 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=NoneveSecure=trueile 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-ancestorsdirektifiyle 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