Reklam
PHP ile IPN Kontrollü PayPal Ödeme Butonu

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.)


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

  2. Ali İhsan 5 seneönce
    Cevapla

    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 5 seneönce
      Cevapla

      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 5 seneönce
      Cevapla

      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

  3. serhat 5 seneönce
    Cevapla

    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 5 seneönce
      Cevapla

      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.

  4. haifisch 5 seneönce
    Cevapla

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

  5. haifisch 5 seneönce
    Cevapla

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

  6. Arda 4 seneönce
    Cevapla

    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…

  7. MERT DOĞAN 4 seneönce
    Cevapla

    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 1 seneönce
      Cevapla

      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 1 seneönce

        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.

  8. yunus 4 seneönce
    Cevapla

    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?

  9. yunus 4 seneönce
    Cevapla

    kimse yok mu???

  10. Oral ÜNAL 4 seneönce
    Cevapla

    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.

  11. MERT DOĞAN 4 seneönce
    Cevapla

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

  12. yunus 4 seneönce
    Cevapla

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

  13. yunus 4 seneönce
    Cevapla

    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

  14. Ahmet Uğur 4 seneönce
    Cevapla

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

  15. Mineturk 4 seneönce
    Cevapla

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

  16. yüksel 3 seneönce
    Cevapla

    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

  17. emir yusuf 3 seneönce
    Cevapla

    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 Yapın

Eposta adresiniz görünmeyecektir.

sekiz + 14 =