1. iFrame V2 Aktifleştirme
Yeni versiyon iFrame ödeme sayfasını kullanmak için, https://www.paytr.com/odeme/api/get-token adresine yapılan token isteğinde aşağıdaki parametreyi eklemeniz gerekmektedir:
API Adresi:
https://www.paytr.com/odeme/api/get-token
Gerekli Parametre:
"iframe_v2": 12. Dark Mode Desteği (Opsiyonel)
iFrame V2 ödeme sayfasını karanlık tema (dark mode) ile görüntülemek için aşağıdaki opsiyonel parametreyi ekleyebilirsiniz:
"iframe_v2_dark": 1 veya 0Bu parametrenin değeri 1 olarak gönderildiğinde, ödeme sayfası karanlık modda gösterilir. Benzer şekilde, bu değerin de post_vals içinde iframe_v2_dark anahtar adıyla gönderilmesi gerekir.
iFrame V2 Geçiş - Script Güncellemesi
Yeni arayüz (iFrame V2) ile tam uyumlu çalışabilmesi için, mevcut entegrasyonlarınızda kullanılan iframeResizer script dosyasının da güncellenmesi gerekmektedir.
Güncel Script
<script src="https://www.paytr.com/js/iframeResizer.min.js?v2"></script>Eski Script
<script src="https://www.paytr.com/js/iframeResizer.min.js"></script>Yeni iFrame V2 arayüzünü kullanabilmeniz için bu script güncellemesinin yapılması zorunludur. Eski script dosyasının kullanılması durumunda, iFrame V2 tasarımı doğru şekilde çalışmayabilir veya beklenmedik hatalarla karşılaşılabilir.
|  |  |  | 
|---|
POST REQUEST içeriğinde gönderilecek değerler:
| Alan adı / tipi | Zorunlu | Token | Açıklama | Kısıtlar | 
|---|---|---|---|---|
| merchant_id(string) | Evet | Evet | Mağaza no: PayTR tarafından size verilen Mağaza numarası | |
| user_ip (string) | Evet | Evet | Müşteri ip: İstek anında aldığınız müşteri ip numarası(Önemli: Lokal makinenizde yapacağınız denemelerde mutlaka dış IP adresini gönderdiğinizden emin olun) | En fazla 39 karakter (ipv4) | 
| merchant_oid(string) | Evet | Evet | Mağaza sipariş no: Satış işlemi içinbelirlediğiniz benzersiz sipariş numarası.(Not: Sipariş no ödeme sonuç bildirimi esnasında geri dönen değerler arasındadır) | En fazla 64 karakter,Alfa numerik | 
| email (string) | Evet | Evet | Müşteri eposta adresi: Müşterinin sisteminizde kayıtlı olan veya form aracılığıyla aldığınız eposta adresi | En fazla 100 karakter | 
| payment_amount(integer) | Evet | Evet | Ödeme tutarı: Siparişe ait toplam ödeme tutarı.(Tutarı 100 ile çarparak göndermelisiniz) | Örn: 34.56 için 3456gönderilmelidir.(34.56 * 100 = 3456) | 
| currency(string) | Evet | Evet | Para birimi | TL(veya TRY), EUR, USD, GBP,RUB (Boş ise TL kabul edilir) | 
| user_basket(string) | Evet | Evet | Sepet içeriği: Müşterinin siparişindeki ürün/hizmet bilgilerini içermelidir | Nasıl bir yapıda olacağı ile ilgili olarak örnek kodlara bakmalısınız | 
| no_installment(int) | Evet | Evet | Taksit görüntülenmesin: Eğer 1 olarak gönderilirse taksit seçenekleri gösterilmez(Örn. cep telefonu için taksit yasağı vardır) | 0 veya 1 | 
| max_installment(int) | Evet | Evet | En fazla taksit sayısı: Gösterilecek en fazlataksit sayısını belirler (Örn. kuyum harcamalarında en fazla 4 taksit uygulamasıvardır) | 0,2,3,4,5,6,7,8,9,10,11,12 Sıfır (0) gönderilmesi durumunda yürürlükteki en fazla izin verilen taksit geçerli olur | 
| paytr_token(string) | Evet | Hayır | paytr_token: İsteğin sizden geldiğine veiçeriğin değişmediğine emin olmamız için oluşturacağınız değerdir | Hesaplama ile ilgili olarak örnek kodlara bakmalısınız | 
| user_name(string) | Evet | Hayır | Müşteri adı ve soyadı: Müşterinin sisteminizde kayıtlı olan veya form aracılığıyla aldığınız adı ve soyadı | En fazla 60 karakter | 
| user_address(string) | Evet | Hayır | Müşteri adresi: Müşterinin sipariş sırasında ilettiği adresi | En fazla 400 karakter | 
| user_phone(string) | Evet | Hayır | Müşteri telefon numarası: Müşterinin sipariş sırasında ilettiği telefon numarası | En fazla 20 karakter | 
| merchant_ok_url | Evet | Hayır | Müşterinin başarılı ödeme sonrası yönlendirileceği sayfa (Örn. Siparişlerim takip sayfası) | En fazla 400 karakter | 
| merchant_fail_url | Evet | Hayır | Müşterinin ödemesi sırasında beklenmeyen bir hatada yönlendirileceği sayfa | En fazla 400 karakter | 
| test_mode | Hayır | Evet | Mağaza canlı modda iken test işlem yapmak için 1 olarak gönderilebilir | 0 veya 1 | 
| debug_on (int) | Hayır | Hayır | Hata döndür: PayTR’a yanlış veya eksik bilgi iletilmesi durumunda sistemden hata mesajı döndürülmesi için 1 gönderilmelidir | 0 veya 1 | 
| timeout_limit(int) | Hayır | Hayır | Sıfırdan farklı bir değer gönderilmesi durumunda, ödeme işlemi bu süre içerisinde tamamlanmalıdır. (Ödeme sırasındasisteminizde fiyat güncellemesi olmasıdurumuna karşı güvenlik amaçlı kullanabilirsiniz) | Dakika cinsinden(Gönderilmemesi durumunda 30 dakika olarak tanımlanır) | 
| lang(string) | Hayır | Hayır | Ödeme sürecinde sayfalarda kullanılacak dil | Türkçe için tr veya İngilizce içinen(Boş gönderilirse tr geçerli olur) | 
| iframe_v2(string) | Hayır | Hayır | Yeni Ödeme sayfasının aktif edilmesi için gönderilir | 1 veya 0 | 
| iframe_v2_dark(string) | Hayır | Hayır | Yeni ödeme sayfasının dark mode olarak gelmesi için gönderilir. | 1 veya 0 | 
<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Örnek Ödeme Sayfası</title>
</head>
<body>
<div>
    <h1>Örnek Ödeme Sayfası</h1>
    <p>1. ADIM için örnek kodlar</p>
</div>
<br><br>
<div style="width: 100%;margin: 0 auto;display: table;">
    <?php
    ## 1. ADIM için örnek kodlar ##
    ####################### DÜZENLEMESİ ZORUNLU ALANLAR #######################
    #
    ## API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
    $merchant_id    = 'XXXXXX';
    $merchant_key   = 'YYYYYYYYYYYYYY';
    $merchant_salt  = 'ZZZZZZZZZZZZZZ';
    #
    ## Müşterinizin sitenizde kayıtlı veya form vasıtasıyla aldığınız eposta adresi
    $email = "XXXXXXXX";
    #
    ## Tahsil edilecek tutar.
    $payment_amount = ""; //9.99 için 9.99 * 100 = 999 gönderilmelidir.
    #
    ## Sipariş numarası: Her işlemde benzersiz olmalıdır!! Bu bilgi bildirim sayfanıza yapılacak bildirimde geri gönderilir.
    $merchant_oid = "";
    #
    ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız ad ve soyad bilgisi
    $user_name = "";
    #
    ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız adres bilgisi
    $user_address = "";
    #
    ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız telefon bilgisi
    $user_phone = "";
    #
    ## Başarılı ödeme sonrası müşterinizin yönlendirileceği sayfa
    ## !!! Bu sayfa siparişi onaylayacağınız sayfa değildir! Yalnızca müşterinizi bilgilendireceğiniz sayfadır!
    ## !!! Siparişi onaylayacağız sayfa "Bildirim URL" sayfasıdır (Bakınız: 2.ADIM Klasörü).
    $merchant_ok_url = "http://www.siteniz.com/odeme_basarili.php";
    #
    ## Ödeme sürecinde beklenmedik bir hata oluşması durumunda müşterinizin yönlendirileceği sayfa
    ## !!! Bu sayfa siparişi iptal edeceğiniz sayfa değildir! Yalnızca müşterinizi bilgilendireceğiniz sayfadır!
    ## !!! Siparişi iptal edeceğiniz sayfa "Bildirim URL" sayfasıdır (Bakınız: 2.ADIM Klasörü).
    $merchant_fail_url = "http://www.siteniz.com/odeme_hata.php";
    #
    ## Müşterinin sepet/sipariş içeriği
    $user_basket = "";
    #
    /* ÖRNEK $user_basket oluşturma - Ürün adedine göre array'leri çoğaltabilirsiniz
    $user_basket = base64_encode(json_encode(array(
        array("Örnek ürün 1", "18.00", 1), // 1. ürün (Ürün Ad - Birim Fiyat - Adet )
        array("Örnek ürün 2", "33.25", 2), // 2. ürün (Ürün Ad - Birim Fiyat - Adet )
        array("Örnek ürün 3", "45.42", 1)  // 3. ürün (Ürün Ad - Birim Fiyat - Adet )
    )));
    */
    ############################################################################################
    ## Kullanıcının IP adresi
    if( isset( $_SERVER["HTTP_CLIENT_IP"] ) ) {
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    } elseif( isset( $_SERVER["HTTP_X_FORWARDED_FOR"] ) ) {
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    } else {
        $ip = $_SERVER["REMOTE_ADDR"];
    }
    ## !!! Eğer bu örnek kodu sunucuda değil local makinanızda çalıştırıyorsanız
    ## buraya dış ip adresinizi (https://www.whatismyip.com/) yazmalısınız. Aksi halde geçersiz paytr_token hatası alırsınız.
    $user_ip=$ip;
    ##
    ## İşlem zaman aşımı süresi - dakika cinsinden
    $timeout_limit = "30";
    ## Hata mesajlarının ekrana basılması için entegrasyon ve test sürecinde 1 olarak bırakın. Daha sonra 0 yapabilirsiniz.
    $debug_on = 1;
    ## Mağaza canlı modda iken test işlem yapmak için 1 olarak gönderilebilir.
    $test_mode = 0;
    $no_installment = 0; // Taksit yapılmasını istemiyorsanız, sadece tek çekim sunacaksanız 1 yapın
    ## Sayfada görüntülenecek taksit adedini sınırlamak istiyorsanız uygun şekilde değiştirin.
    ## Sıfır (0) gönderilmesi durumunda yürürlükteki en fazla izin verilen taksit geçerli olur.
    $max_installment = 0;
    $currency = "TL";
    $iframe_v2="1";
    $iframe_v2_dark="0";
    ####### Bu kısımda herhangi bir değişiklik yapmanıza gerek yoktur. #######
    $hash_str = $merchant_id .$user_ip .$merchant_oid .$email .$payment_amount .$user_basket.$no_installment.$max_installment.$currency.$test_mode;
    $paytr_token=base64_encode(hash_hmac('sha256',$hash_str.$merchant_salt,$merchant_key,true));
    $post_vals=array(
            'merchant_id'=>$merchant_id,
            'user_ip'=>$user_ip,
            'merchant_oid'=>$merchant_oid,
            'email'=>$email,
            'payment_amount'=>$payment_amount,
            'paytr_token'=>$paytr_token,
            'user_basket'=>$user_basket,
            'debug_on'=>$debug_on,
            'no_installment'=>$no_installment,
            'max_installment'=>$max_installment,
            'user_name'=>$user_name,
            'user_address'=>$user_address,
            'user_phone'=>$user_phone,
            'merchant_ok_url'=>$merchant_ok_url,
            'merchant_fail_url'=>$merchant_fail_url,
            'timeout_limit'=>$timeout_limit,
            'currency'=>$currency,
            'test_mode'=>$test_mode,
            'iframe_v2'=>$iframe_v2,
            'iframe_v2_dark'=> $iframe_v2_dark
        );
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://www.paytr.com/odeme/api/get-token");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1) ;
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vals);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
     // XXX: DİKKAT: lokal makinanızda "SSL certificate problem: unable to get local issuer certificate" uyarısı alırsanız eğer
     // aşağıdaki kodu açıp deneyebilirsiniz. ANCAK, güvenlik nedeniyle sunucunuzda (gerçek ortamınızda) bu kodun kapalı kalması çok önemlidir!
     // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $result = @curl_exec($ch);
    if(curl_errno($ch))
        die("PAYTR IFRAME connection error. err:".curl_error($ch));
    curl_close($ch);
    $result=json_decode($result,1);
    if($result['status']=='success')
        $token=$result['token'];
    else
        die("PAYTR IFRAME failed. reason:".$result['reason']);
    #########################################################################
    ?>
    <!-- Ödeme formunun açılması için gereken HTML kodlar / Başlangıç -->
    <script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
    <iframe src="https://www.paytr.com/odeme/guvenli/<?php echo $token;?>" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe>
    <script>iFrameResize({},'#paytriframe');</script>
    <!-- Ödeme formunun açılması için gereken HTML kodlar / Bitiş -->
</div>
<br><br>
</body>
</html>