paypal

PHP ile IPN Kontrollü PayPal Ödeme Butonu

Merhaba arkadaşlar, bu yazımda hep beraber bir paypal hesabı açacağız ve sitemize bir ödeme yap butonu koyacağız. Daha sonra PayPal IPN ile bu ödemenin gerçek olup olmadığını göreceğiz.

Adım 1 – PayPal Hesabı Açma

PayPal hesabı açmak için www.paypal.com adresine giriyoruz. Buradan Hesap Açın butonuna tıklıyoruz.

Karşımıza gelen ekranda Bireysel başlığı altındaki Hesap açın butonuna tıklıyoruz.

Daha sonra üyelik formunu dolduruyoruz. Üyelik formunu doldurun ve email hesabınızı onaylayın. İşte bu kadar şu anda sizin de bir PayPal hesabınız var.

Adım 2 – PayPal Ödeme Butonumuzu Oluşturalım

Şimdi bir satın alın butonu oluşturalım. Bu butonu oluşturmak için PayPal’a giriş yaptıktan sonra “Kullanıcı Profili” linkine tıklamanız gerekiyor. Bu linke tıkladıktan sonra “Satış Araçlarım” linkine tıklayın ve “Online Satış Yapma” altında “Paypal düğmeleri” karşısındaki “Güncelle” linkine tıklayalım.

Karşınıza gelen sayfada “Hemen Satın Alın Düğmesi Örneği” karşısında “İşlem” linkine tıklayın ve açılan pencereden “Düğmeyi düzenle” yi seçin.

Şimdi formumuzu oluşturmaya başlayalım. Form alanlarını şu şekilde yapalım:

  1. Öğe Adı: TR Kodlama PayPal Denemesi
  2. Fiyat: 5,00
  3. Mağaza Hesap Numaraları: Ana e-posta adresimi kullan xxx@xxx.com’u seçin

Kalan yerlere dokunmanıza gerek yok. Daha sonra kendiniz kurcalarken karıştırabilirsiniz. Şimdi Adım 3 linkine tıklayalım.

Bu adımı da şu şekilde dolduralım:

  1. Müşteriniz bir iletide size özel talimatlar bildirebilir mi? Hayır
  2. Müşterinizin gönderim adresine ihtiyacınız var mı? Hayır
  3. Satın alma işlemini iptal ederlerse müşterileri bu URL’ye yönlendirin kutucuğunu aktifleştirin ve müşteri siparişden vazgeçtiği zaman gideceği adresi tanımlayın
  4. Satın alma işlemini tamamladıktan sonra müşterileri bu URL’ye yönlendirin kutucuğunu aktifleştirin ve müşteri satın alma işlemini tamamladığı zaman gideceği sayfayı tanımlayın.
  5. Son olarak önemli kısıma geldik: Gelişmiş değişkenler tanımla kutucuğunu seçin ve kutucuğun içine şunu yazın
notify_url=http://www.trkodlama.com/paypal/ipn.php

ipn.php dosyamızın içeriğini ilerleyen adımlarda tanımlayacağız.

En son olarak “Değişiklikleri Kaydet” butonuna tıklayalım. Karşımıza HTML bir kod gelecek. Bu kodu kaybetmeyelim. Hemen http://www.sizindomaininiz.com/paypal/index.html isimli bir dosya oluşturalım ve bu dosyanın içine sadece bu HTML kodu yapıştıralım. Tarayıcı aracılığı ile açalım index.html dosyasını. Şimdi şöyle bir görüntü elde etmeniz gerekiyor:

Adım 3 – ipn.php Dosyasını Oluşturalım

ipn.php dosyasını oluşturmadan önce “PayPal” isimli bir veritabanı oluşturun ve şu komutu çalıştırın:

CREATE TABLE paypal(
id int(255) AUTO_INCREMENT,
durum int(1),
veri text,
PRIMARY KEY (id)
)

Veritabanında paypal isimli bir de tablo oluşturduk bu komut sayesinde.

Önceki adımda notify_url isminde bir parametre ile ipn.php dosyamızın adresini vermiştik. Satın alma işlemi tamamlandığında PayPal arka planda ipn.php dosyanıza bir kaç veri POST eder. Siz bu verileri tekrar GET ile paypal’a yönlendirirsiniz. Eğer gönderdiğiniz veriler ilk başta POST ile gelen verilerle aynı ise VERIFIED yazılacak. Eğer farklıysa INVALID yazdırır. Bizde buna göre kontrol ederiz.

Ayrıca gelen verileri JSON formatında veritabanında saklayacağız.

Şimdi ipn.php dosyamızın içeriğini verelim:

<?php
header("Content-type: text/html; charset=utf-8");

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("paypal") or die(mysql_error());

// PayPal tarafından POST eden verileri toplayalım ve işleyelim
// Paypal'a geri gönderirken parametrelerin en başına cmd=_notify-validate ekliyoruz
$req = 'cmd=_notify-validate';
$json = array();
foreach ($_POST as $key => $value) {
	$value = urlencode(stripslashes($value));
	if($key=="payment_status") $durum = $value; // Burada ödeme durumunu yakaladık.
	$req .= "&$key=$value";
	$json[$key] = $value;
}

// Şimdi PayPal'a gidelim.
$sonuc = file_get_contents("https://www.paypal.com/cgi-bin/webscr?$req");

if ($sonuc=="VERIFIED" && $durum=="Completed") {
	$json = json_encode($json);
	mysql_query("INSERT INTO paypal VALUES(NULL, 1, '$json')");
} else {
	mysql_query("INSERT INTO paypal VALUES(NULL, 0, '$json')");
}
?>

Bu şekilde satın alma işlemi tamamlandıktan sonra herşeyi yani bütün verileri de inceleyebilirsiniz.

Adım 4 – PayPal Sandbox

Kendi kendinize test edebilmeniz için PayPal’ın sandbox isimli bir hizmeti var. Bu hizmet sayesinde ipn.php dosyanıza POST edilecek bütün verileri siz belirliyorsunuz. Mesela “Status” değeri “Completed” veya “Failed” olsun şeklinde. Eğer completed dışında bir değer yollarsanız ipn dosyası veri tabanınıza durum kısmında 0 olarak ekler. 0’lar başarısız olanlardır.

PayPal Sandbox’ı kullanabilmek için üye olmanız gerekmektedir. Ekstra bir üyelik. Ayrıca PayPal Sandbox ile test yaparken ipn.php dosyamızdaki

$sonuc = file_get_contents("https://www.paypal.com/cgi-bin/webscr?$req");

kısmını aşağıdaki şekilde değiştirmelisiniz:

$sonuc = file_get_contents("https://www.sandbox.paypal.com/cgi-bin/webscr?$req");

PayPal Sandbox’a girmek için buraya tıklayın.

Sonuç

Lütfen sorularınızı sormaktan çekinmeyin. Herkes için faydalı olacağını düşündüğüm bir konuydu bu. Nette bulunan kaynaklar hep eski. Güncel kaynak yokluğunda iyi gider bu makale.

Kolay gelsin,

Son Güncelleme: 19 Kasım 2012 10:18 (Mert Doğan‘a teşekkürler.)

Post Author: Oral ÜNAL

Web geliştirmeyi başta meslek olarak hayal eden fakat daha sonra bir hobi haline getiren birisiyim işte.

PHP ile IPN Kontrollü PayPal Ödeme Butonu” için 22 yorum

  • Batuhan Küçükali

    (28 Mart 2012 - 00:18)

    güzel anlatım olmuş teşekkürler.

  • Ali İhsan

    (03 Temmuz 2012 - 09:58)

    Merhaba aynı tarz bir uygulama yaptım. Ancak ben düğmeyi paypal tarafında oluşturmadım. Sabit bir değer değilde her seferinde farklı tutarlar gönderiyorum. Burada bir class kullandım ben.ancak sizin dediğiniz gibi ipn işlemini yapamadım. Müşteri ödeme yaptıktan sonra ancak benim sayfama dönerse ben işlemi algılayabiliyorum ve ödeme onayı verebiliyorum. Burda ne yapmam gerekiyor size.

    • Oral ÜNAL

      (04 Temmuz 2012 - 17:05)

      Anladım, fakat PayPal ile ilgili şu anda tek bildiğim budur. Diğer işlemler nasıl sağlanır, nasıl edilir bir bilgim yok ne yazık ki. Fakat dediğiniz durumu anlatan benzer bir yazı ile karşılaşırsam sizi bilgilendiririm.

      Kolay gelsin,

    • haifisch

      (08 Temmuz 2012 - 01:11)

      birde paypaldan kod alın Gelişmiş değişkenler tanımlayı kesinlikle doldurun. Kodu aldıktan sonra elinizdeki kod ile aldığınız kodu karşılaştırın ve Gelişmiş değişkenler tanımla ya yazdığınız kodu arayın. bulunca sizin yazdığınız koda ekleyin

  • serhat

    (07 Temmuz 2012 - 16:38)

    Hocam şimdi bende bunun gibi bir uygulama yapmak istiyorum yanlız benim yapacağımda para miktarı değişebiliyor yani sabit para birimi değil php koduyla butonu php sayfasnda oluştururken değiştirmek istiyorum. acil cevaba ihtiyacım var teşekkürler

    • haifisch

      (08 Temmuz 2012 - 01:05)

      paypaldan aldığınız kodda name değeri currency_code olan textin valuesinden değiştirebilirsiniz. Türkiye için try sandbox için usd dir hocam.

  • haifisch

    (16 Temmuz 2012 - 17:30)

    her şekilde 0 değeri dönüyor hocam.

  • haifisch

    (16 Temmuz 2012 - 17:35)

    ödeme yapıldığında durum pending sonuc ise boş dönüyor

  • Arda

    (06 Kasım 2012 - 14:08)

    Yapılan ödeme işleminde kullanıcının hangi ürünü satın aldığını ve gerçekde ödeme yapıp yapmadığını algılıyor yalnız session değerini yani hangi kullanıcının satın aldığını algılatamıyorum sebebi ne olabilir.

    teşekkürler…

  • MERT DOĞAN

    (19 Kasım 2012 - 01:14)

    Birşey dikkatimi çekti de:

    $json[“key”] = $value;

    şeklinde array değişkenlerini kaydetmişsiniz ama bu durumda sürekli aynı array elemanına value değerini kayıt yapar gibi duruyor. Doğrusunun

    $json[$key] = $value;

    şeklinde olması gerekmiyor mu?

    • Savaş Türk

      (26 Ocak 2016 - 01:41)

      Hayır gerekmiyor. Nedeni ise sizin dediğiniz gibi yapılırsa $json[‘121314131232’] Gibi bir değişken olacağından dolayı bizde bu değişkeni alamayız. Çünkü ne geleceğini bilmiyoruz. Ama yazarın yazdığın kodda ise $json[‘key’] = ‘121314131232’; dönüyor.

      • MERT DOĞAN

        (16 Şubat 2016 - 11:15)

        arkadaşım kodu ben düzeltme önerdikten sonra düzelttiler. Şu anda bir sorun yok. Benim düzeltme önerim kodun eski hali içindi. Orada key’in başında $ yoktu ve devamlı ‘key’ dizi anahtarına aynı değer yazılıyordu; anlamsızdı. Bu hali ile düzeltildi.

  • yunus

    (10 Aralık 2012 - 00:22)

    merhaba burdan sayfama olumlu ise bir sonuç bastırabilir miyim. çünkü olumlu ise kullanıcının db sindeki puana+5 puan ekleteceğim nasıl yaparım?

  • yunus

    (10 Aralık 2012 - 15:30)

    kimse yok mu???

  • Oral ÜNAL

    (10 Aralık 2012 - 22:45)

    Yukarıdaki kodda

    if ($sonuc=="VERIFIED" && $durum=="Completed") {
        $json = json_encode($json);
        mysql_query("INSERT INTO paypal VALUES(NULL, 1, '$json')");
    }

    kısmı tam olarak senin dediğin işe yarıyor.

  • MERT DOĞAN

    (10 Aralık 2012 - 22:48)

    Paypal’dan IPN sayfamıza özel bir parametre gönderilmesini sağlayabilir miyiz? Mesela urun_kodu=12 gibi

  • yunus

    (11 Aralık 2012 - 00:15)

    doğruya o tabloyu çekip karşılaştırırım =)

  • yunus

    (11 Aralık 2012 - 00:48)

    Pardon. bu dosya sadece paypal erişecek. satın alma işlemi tamamlanırsa bu sayfaya yönlendir demişiz. nasıl bir şey uygulayabiliriz ki o sayfaya yönlendiğinde ben o kişiye veri işleyim. çünkü o sayfaya dışardan giren bir başka üye kendisine işler

  • Ahmet Uğur

    (27 Mayıs 2013 - 18:05)

    Merhabalar , cok işime yaradı . Paylasım için teşekür ederim .

  • Mineturk

    (03 Temmuz 2013 - 20:38)

    Yazı için teşekkürler. Paypal IPN hakkında fazla örnek yok. Çok yardımcı oldu.

  • yüksel

    (06 Aralık 2013 - 12:48)

    Merhabalar paylaşım için teşekkürler,
    Benim şöyle bir sorunum var; buradaki herşeyi dediğiniz gibi yapıyorum ama benim ipn php de kaydetme işlemi olmuyor. ödeme gerçekleşiyor,sayfama tx=xxxxx&st=completed gibi url değerleri geliyor. Yukardaki gibi kaydetmek istiyorum db ye. Neden olabilir yardımlarınızı bekliyorum

  • emir yusuf

    (01 Ağustos 2014 - 17:11)

    benim hostum localhost kullanmayın diyen yazıyor localhost yerine veritabanı adını yazsam olurmu?
    mysql_select_db(“paypal”) or die(mysql_error());
    burada yazan paypal veritabanı adı mı tablo adımı

Yorum yazma sırası sizde!