Havale/EFT iFrame API 1. Adım

Entegrasyon ve İşlem akışı:

1) Üye işyeri, PayTR'a iframe_token isteğinde bulunur. Bu istek arka planda (server-side) POST metodu ile gerçekleşir.

İstek (REQUEST) yapılacak URL: https://www.paytr.com/odeme/api/get-token

POST REQUEST içeriğinde gönderilecek değerler:

Alan adı / tipi Açıklama Zorunlu Kısıtlar
merchant_id (string) Mağaza No: PayTR tarafından size verilen Mağaza numarası Evet
user_ip (string) 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) Evet En fazla 39 karakter (ipv4)
merchant_oid (string) Mağaza sipariş no: Satış işlemi için belirlediğiniz benzersiz sipariş numarası.(Not: Sipariş no ödeme sonuç bildirimi esnasında geri dönen değerler arasındadır) Evet En fazla 64 karakter,Alfa numerik
email (string) Müşteri eposta adresi: Müşterinin sisteminizde kayıtlı olan veya form aracılığıyla aldığınız eposta adresi Evet En fazla 100 karakter
payment_amount(integer) Ödeme tutarı: Siparişe ait toplam ödeme tutarı Evet Ayraç olarak yalnızca nokta(.) gönderilmelidir
paytr_token(string) paytr_token: İsteğin sizden geldiğine ve içeriğin değişmediğine emin olmamız içinoluşturacağınız değerdir Evet Nasıl hesaplanacağı ile ilgili lütfen örnek kodları inceleyin
user_name Ad-Soyad: Gönderilmesi durumunda IFrame içerisinde bulunan ödeme bildirim formunda Ad-Soyad bilgisi dolu gelir ve değiştirilemez Hayır En fazla 30 karakter
user_phone Telefon: Gönderilmesi durumunda IFrame içerisinde bulunan ödeme bildirim formunda Telefon bilgisi dolu gelir ve değiştirilemez Hayır 11 karakter, numerik
payment_type(string) Ödeme tipi Evet ('eft')
tc_no_last5 TC No Son 5 hane: Gönderilmesi durumunda IFrame içerisinde bulunan ödeme bildirim formunda TCNo Son 5 hane dolu gelir ve değiştirilemezi Hayır 5 karakter numerik
bank Banka: Gönderilmesi durumunda IFrame içerisinde banka seçimi yapılamaz, yalnızca gönderilen banka görüntülenir. Hayır isbank, akbank, denizbank, finansbank,halkbank, ptt, teb, vakifbank, yapikredi,ziraat seçeneklerinden bir tanesi
test_mode Mağaza canlı modda iken test işlem yapmak için 1 olarak gönderilebilir Hayır 0 veya 1
debug_on (int) Hata döndür: Yanlış veya eksik bilgi iletilmesi durumunda hata mesajı döndürülmesi için 1 gönderilmelidir Hayır 0 veya 1
timeout_limit(int) Sıfırdan farklı bir değer gönderilmesi durumunda, ödeme işlemi bu süre içerisinde tamamlanmalıdır (Ödeme sırasında sisteminizde fiyat güncellemesi olması durumuna karşı güvenlik amaçlı kullanabilirsiniz) Hayır Dakika cinsinden (Gönderilmemesi durumunda 30 dakika olarak tanımlanır)

Yapılan isteğe geri dönecek yanıt (RESPONSE) JSON formatındadır. Detaylı bilgi için örnek kodu inceleyebilirsiniz.

Üye İşyeri, başarılı yanıt içerisinde gelen iframe_token ile iframe kullanarak ödeme bildirim formunu açar.

NOT: Yukarıda anlatılan işlemlerin tamamlanmasıyla birlikte müşteri tarafından kullanılacak olan ödeme bildirimi formu ekranda belirecektir.

Ödeme işleminde müşterinin etkileşimde bulunacağı adım entegrasyonda böylece tamamlanmış olur. ANCAK; entegrasyonunuz henüz tamamlanmamıştır, 2. adımın tamamlanması ödeme sonucunun (başarılı/başarısız) üye işyerine ulaştırılması için gereklidir.

2) İlk adımda iframe ile açılan formu doldurarak müşteri ödeme bildirimi yaptığında, PayTR operasyon ekibi bildirimi görür ve ödemeyi kontrol eder. Kontrol sonrası, PayTR sistemi tarafından arka planda (server-side) mağaza bildirim sayfasına (Bildirim URL) POST metodu ile kontrolün sonucu gönderilir. Bu bildirime istinaden üye işyeri siparişi onaylar veya iptal eder.

POST REQUEST içeriğinde gönderilecek değerler:

Alan adı Açıklama
merchant_oid Mağaza sipariş no: Satış işlemi için belirlediğiniz sipariş numarası
status Ödeme işleminin sonucu(success/failed)
total_amount Ödeme tutarı (100 ile çarpılmış hali gönderilir. 34.56 TL => 3456)
hash Üye işyerinin, PayTR sisteminden gönderilen değerleri kontrol edebilmesi için güvenlik amaçlı oluşturulan hash
failed_reason_code Ödeme bildiriminin onaylanmaması durumunda gönderilir
failed_reason_msg Ödeme bildiriminin neden onaylanmadığı mesajını içerir
test_mode Mağazanız test modunda iken veya canlı modda yapılan test işlemlerde 1 olarak gönderilir.


<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Örnek Ödeme Sayfası</title>
</head>
<body>

<div>
    <h1>Örnek Ödeme Sayfası</h1>
</div>
<br><br>

<div style="width: 100%;margin: 0 auto;display: table;">

    <?php 

$merchant_id='XXXXXX'; // Mağaza numarası
$merchant_key='YYYYYYYYYYYYYY'; // Mağaza Parolası - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
$merchant_salt='ZZZZZZZZZZZZZZ'; // Mağaza Gizli Anahtarı - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.

## 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"];
}

$user_ip=$ip;  // !!! Eğer bu kodu sunucuda değil local makinanızda çalıştırıyorsanız buraya dış ip adresinizi(https://www.whatismyip.com/) yazmalısınız.

$merchant_oid=time();//sipariş numarası: her işlemde benzersiz olmalıdır! Bu bilgi bildirim sayfanıza yapılacak bildirimde gönderilir.
$email="musteri@saglayici.com"; // Müşterinizin sitenizde kayıtlı eposta adresi
$payment_amount="999";//9.99 TL
$payment_type='eft';
$debug_on=1;//hata mesajlarını ekrana bas

## İşlem zaman aşımı süresi - dakika cinsinden
$timeout_limit = "30";

## Mağaza canlı modda iken test işlem yapmak için 1 olarak gönderilebilir
$test_mode = 0;

$hash_str=$merchant_id.$user_ip.$merchant_oid.$email.$payment_amount.$payment_type.$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,
        'payment_type'=>$payment_type,
        'paytr_token'=>$paytr_token,
        'debug_on'=>$debug_on,
        'timeout_limit'=>$timeout_limit,
        'test_mode'=>$test_mode
);

$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 EFT IFRAME connection error. err:".curl_error($ch));
}
curl_close($ch);

$result=json_decode($result,1);

/*
Başarılı yanıt örneği: (token içerir)
{"status":"success","token":"28cc613c3d7633cfa4ed0956fdf901e05cf9d9cc0c2ef8db54fa"}

Başarısız yanıt örneği:
{"status":"failed","reason":"Zorunlu alan degeri gecersiz: merchant_id"}
*/

if($result['status']=='success')
{
    $token=$result['token'];
}
else
{
    die("PAYTR EFT IFRAME failed. reason:".$result['reason']);
}

    ?>

    <script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
    <iframe src="https://www.paytr.com/odeme/api/<?php echo $token;?>" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe>
    <script>iFrameResize({},'#paytriframe');</script>

</div>

<br><br>
</body>
</html>

Havale/EFT iFrame API 1. ADIM örnek kodları indirmek için tıklayın.