Samesite Hatası:Yeni Chrome güncellemesi ile yaşanan Samesite hatası opencart için de sıkıntı oluşturmaktadır. Özellikle ödeme aşamasında 3D güvenlik sms'i için banka sayfasına gidip geri döndüğünüzde oturumunuzun sonlanması durumu ciddi sıkıntılara yol açmaktadır. Ödeme alınsa dahi sipariş oluşmamaktadır. Samesite hatası hakkında ayrıntılı bilgi için:
https://dev.iyzipay.com/tr/sss/samesite-problemi-nedir
Çözüm:Öncelikle kullandığınız php sürümünün 7.3 veya üstü olduğuna emin olunuz. Bu çözüm için en az 7.3 sürümü gereklidir fakat daha düşük bir sürüm kullanıyorsanız verdiğim kaynaklara bakarak kodları değiştirebilirsiniz, ben test edemediğim için eklemedim. Yine bu çözümü opencart 2.3 versiyonu üzerinde denediğimi ve sorunsuz çalıştığını belirtmeliyim. Eksik gördüğünüz bir kısım olursa yorum yazmanızı rica ederim. Ayrıntısını aşağıda vereceğim fakat genel olarak session_start() ve setcookie() komutları öncesine 'samesite' => 'None' ve secure parametrelerini ekleyerek çözdüm.
Not: Bu çözümü opencart için yazdım fakat kendi yazılımınız için de uygulayabilirsiniz. Bulup değiştireceğiniz komutlar yine bu iki komuttur.
Düzenlediğim opencart dosyaları ve değişiklikler:
1. system/library/session.php
Bul:
session_set_cookie_params(0, '/');
session_start();
Değiştir:
if (PHP_VERSION_ID < 70300) {
session_set_cookie_params(0, '/; samesite=None', '.yoursite.com', true, true);
} else {
ini_set('session.cookie_samesite', 'None');
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.yoursite.com',
'secure' => true,
'httponly' => true,
'samesite' => 'None'
]);
}
session_start();
Bul:
setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));Değiştir:
if (PHP_VERSION_ID < 70300) {
setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
} else {
$samsite_cookie_options = array (
'expires' => ini_get('session.cookie_lifetime'),
'path' => ini_get('session.cookie_path'),
'domain' => ini_get('session.cookie_domain'),
'secure' => true, // or false
'httponly' => true, // or false
'samesite' => 'None' // None || Lax || Strict
);
setcookie($key, $this->session_id, $samsite_cookie_options);
}
Bul:
setcookie($key, '', time() - 42000, ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
Değiştir:
if (PHP_VERSION_ID < 70300) {
setcookie($key, '', time() - 42000, ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
} else {
$samsite_cookie_options = array (
'expires' => time() - 42000,
'path' => ini_get('session.cookie_path'),
'domain' => ini_get('session.cookie_domain'),
'secure' => true, // or false
'httponly' => true, // or false
'samesite' => 'None' // None || Lax || Strict
);
setcookie($key, '', $samsite_cookie_options);
}
2. catalog/controller/startup/startup.php
Bul:
setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
Değiştir:
if (PHP_VERSION_ID < 70300) {
setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
} else {
$samsite_cookie_options = array (
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'domain' => $this->request->server['HTTP_HOST'],
'secure' => true, // or false
'httponly' => true, // or false
'samesite' => 'None' // None || Lax || Strict
);
setcookie('language', $code, $samsite_cookie_options);
}
Bul:
setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
Değiştir:
if (PHP_VERSION_ID < 70300) {
setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
} else {
$samsite_cookie_options = array (
'expires' => time() + 3600 * 24 * 1000,
'path' => '/',
'domain' => $this->request->server['HTTP_HOST'],
'secure' => true, // or false
'httponly' => true, // or false
'samesite' => 'None' // None || Lax || Strict
);
setcookie('tracking', $this->request->get['tracking'], $samsite_cookie_options);
}
Bul:
setcookie('currency', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
Değiştir:
if (PHP_VERSION_ID < 70300) {
setcookie('currency', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
} else {
$samsite_cookie_options = array (
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'domain' => $this->request->server['HTTP_HOST'],
'secure' => true, // or false
'httponly' => true, // or false
'samesite' => 'None' // None || Lax || Strict
);
setcookie('currency', $code, $samsite_cookie_options);
}
3. Bütün dosyalarınızı aratarak session_start() ve setcookie() komutlarını yukarıdaki gibi değiştiriniz. Aslında ilk 2 dosya üzerindeki değişiklikler yeterli olmaktadır ama yine de bir süprizle karşılaşmamak için diğer dosyalarınızı da taramanızı öneririm.
...
Gelen sorular üzerine ekliyorum. Opencart 2.1.0.1 için aşağıdaki ekran görüntülerindeki 3 dosyayı düzenlemeniz gerekmektedir. session_start ve setcookie komutlarını arayarak kendiniz de bulabilirsiniz. Bu satırları bulup yukarıdaki örneklerdeki gibi değiştiriniz.