PayU BIN API Kullanımı

Uzun zamandır bloğumda bir şeyler yazmaya vakit bulamamıştım. Bu yazımda kullanıcılardan gelen talepler doğrultusunda PayU card info yani PayU BIN API kullanılarak kredi kartı sorgulama işlemini anlatacağım.

BIN numarası bildiğiniz üzere kredi kartı numarasının ilk 6 hanesini teşkil eder. Aşağıda sorgu için oluşturacağımız örnek php kodunu paylaşıyorum.

<?php
$URL =”https://secure.payu.com.tr/api/card-info/v1/”;
$MERCHANT = “OPU_TEST”; //İşyeri entegrasyon ismi yazılacak
$SECRET = “SECRET_KEY”;//Kodlama anahtarı yazılacak
$TIMESTAMP = time();
$BIN = “454360”;
$sig = hash_hmac(‘sha256’, $MERCHANT . $TIMESTAMP, $SECRET);
$urlReqest =$URL.$BIN.”?merchant=”.$MERCHANT.”&timestamp=”.$TIMESTAMP.”&signature=”.$sig;
$json = file_get_contents($urlReqest);
var_dump($json);
?>

PayU BIN sorgu API’si için oluşturacağımız isteği GET metodunu kullanarak, “https://secure.payu.com.tr/api/card-info/v1/” adresine yapmamız gerekiyor. Oluşturduğumuz query string ($urlReqest) sırasıyla URL,BIN,merchant,timestamp ve signature alanlarından oluşuyor.

İmza alanını ($sig ) oluştururken $MERCHANT . $TIMESTAMP parametrelerini birleştirerek yukarıdaki örnekte görüldüğü üzere, hash_hmac  fonksiyonunu ile ‘sha256’ olarak şifreliyoruz.

Eğer herşeyi doğru olarak gerçekleştirdi iseniz, aşağıdaki gibi bir url elde etmiş olmanız gerekiyor.

https://secure.payu.com.tr/api/card-info/v1/454360?merchant=OPU_TEST×tamp=1481359374&signature=496cd7484f74c1c3e321ca328a093183fb757b30188860011c8aec31ea408884

Aşağıdaki iki satır oluşturduğumuz isteğin cevabını bize getirmektedir. Dönen response bilgisi JSON formatındadır. Artık json ile gelen veriyi decode edebilir ve dilediğiniz şekilde parse ederek sorgulamış olduğunuz bin numarası ile ilgili detaylara ulaşabilirsiniz.

$json = file_get_contents($urlReqest);
var_dump($json);

Örnek response bilgisi aşağıdaki gibi olacaktır.

payu-bin-api

PayU BIN API nerelerde kullanılabilir ?

PayU BIN API’yi web sitenizde örneğin taksit seçeneklerinin kullanıcıya gösterilmesi, kredi kartı formunun daha görsel hale getirilmesi (kart tipi, banka bilgisinin ) işlem sırasında anlık olarak kullanıcıya gösterilmesi gibi işlemler için kullanabilirsiniz.

 

WooCommerce PayU Site İçi Ödeme (Alu) Eklentisi Yeni Versiyon

payu-resmi-woocommerce-eklentisi

woocommerce-payu

 

E-ticarete atılmayı düşünen ya da halihazırda PayU ile çalışan işletmelere, sonunda müjdeli haberi veriyorum. Uzun bir çalışma sonucunda hazırlayıp sizlere sunduğum WooCommerce PayU  Eklentisi artık hazır.

Yaklaşık 3.5 yıllık PayU kariyerim boyunca elde etmiş olduğum tüm birikimleri bu eklentide kullanmak için çaba sarf ettim. Sonuç olarak, bu konuda mütevazi olma hususunu bir kenara bırakarak şunu belirtmek isterim ki;

Piyasadaki en iyi, en stabil ve aynı zamanda en kullanışlı woocommerce PayU eklentisi ortaya çıktı. Hatta diğer açık kaynak kod sistemleri de bu kıyaslamaya dahil edebilirim. Benzer şekilde puan kullanımı, BIN apisi, IPN, taksit apisi gibi bütün servisleri bir arada barındıran bir eklenti bulunmuyor.

Neden WooCommerce PayU Site İçi Ödeme Eklentisini Tercih Etmeliyim ?

Eklenti, birçok eklentide bulunmayan PayU’nun katma değerli servislerini desteklemektedir. Bunları kısaca özetlemem gerekirse;

  • Eklenti site içi ödeme destekler. Müşterileriniz ödeme sırasında siteden çıkarak başka bir sayfaya yönlendirilmez.
  • Tek sayfada hem fatura ve teslimat bilgileri hemde kredi kartı bilgileri girilerek ödeme gerçekleştirilir. Müşterileriniz o sayfadan o sayfaya yönlendirilmez. Bu alışveriş dönüşüm oranını artıracaktır. Zira uzayan işlem adımları müşterilerin sipariş vermekten vazgeçmesine neden olmaktadır.
  • Eklenti,  IPN servisini destekler. Bu şekilde web siteniz ile PayU arasında minimum mutabakat sorunu yaşarsınız.
  • Puan kullanımı apisini destekler. Müşterileriniz alışverişlerinde kredi kartında biriken puanlarını kullanabilir.

payu_woocommerce_puan_kullanimi

  • Taksit ve BIN apisini destekler. Bu şekilde işlem sırasında girilen kredi kartı numarası kontrol edilerek uygun taksit seçenekleri gösterilir. Taksit yapılamayan bir kart, örneğin banka kartı ile işlem yapıldığında tek çekim seçeneği görüntülenir. Böylelikle müşterilerin hatalı işlem yapması önlenmiş olur. Ayrıca taksitli işlemlerde uygulanacak vade farkı oranlarını da PayU’dan otomatik getirerek tüm taksitli işlem tutarlarını hesaplayarak müşteriye sunar. Sizin manuel olarak tek tek oran girmeniz gerekmez. Zira bu noktada yapılan hatalar nedeniyle birçok firmanın maddi kayba uğradığını söyleyebilirim. Eklenti sizi bu riskten korumaktadır.
  • WooCommerce PayU site içi ödeme eklentisi, olası hatalı işlemlerde alınan hata kodları ile ilgili müşteriye ve size Türkçe açıklamalar sunar. Site yönetici paneline bu işlemlere ait log kayıtlarını atarak, “Acaba bu işlem neden başarısız olmuş?” gibi kafa karışıklığı yaratacak durumlardan sizi korur.

Eklenti kurulumu ise çok kolay, sadece 3 dakika içinde eklentiyi kurarak sistemi ödeme için hazır hale getiriyorsunuz.

Ayrıca,  eklentiyi  buradan  test edebilirsiniz.

Eklentiyi temin etmek ve eklenti ile ilgili tüm sorularınız için,

İletişim formu sayfasından bana ulaşabilirsiniz.

 

PayU Alu Entegrasyonu Puan Kullanımı

Bir önceki yazımda, PayU entegrasyonunda Loyalty points api kullanarak nasıl kredi kartı puanlarının kullanılabileceğini paylaşmıştım. Bu makalede ise puan sorgulama sonucu başarılı ise, yani kredi kartında puan bulunuyor ise, puan kullanma isteğini nasıl göndereceğimizi paylaşacağım.

Öncelikle, puan kullanabilmek için alu entegrasyonu yapmış olmanız gerekmektedir. Sonrasında yapmamız gereken çok fazla bir işlem yok aslında. PayU’ ya göndermiş olduğumuz alu requestine USE_LOYALTY_POINTS=YES parametresini ilave etmemiz gerekiyor.

Aşağıda örnek bir request paylaşıyorum. Parametreyi ilave ettikten sonra, son durumda tüm parametrelerin alfabetik olarak sıralanmış olduğuna dikkat ediniz.

BACK_REF=>http://localhost/odeme2/odeme/3ds_return.php
BILL_ADDRESS=>Billing address
BILL_ADDRESS2=>Billing address
BILL_CITY=>City
BILL_COUNTRYCODE=>TR
BILL_EMAIL=>deneme@payu.com.tr
BILL_FAX=>4543958674234
BILL_FNAME=>Serkan
BILL_LNAME=>Yıldırım
BILL_PHONE=>-
BILL_STATE=>State / Dept.
BILL_ZIPCODE=>12345234
CC_CVV=>***
CC_NUMBER=>435508**********
CC_OWNER=>TEST
CLIENT_IP=>127.0.0.1
DELIVERY_ADDRESS=>Delivery Address
DELIVERY_ADDRESS2=>Delivery Address
DELIVERY_CITY=>City
DELIVERY_COMPANY=>Company Name
DELIVERY_COUNTRYCODE=>TR
DELIVERY_EMAIL=>deneme@payu.com.tr
DELIVERY_FNAME=>Yıldırım
DELIVERY_LNAME=>Serkan
DELIVERY_PHONE=>454395867
DELIVERY_STATE=>State / Dept.
DELIVERY_ZIPCODE=>12345
EXP_MONTH=>12
EXP_YEAR=>2018
LANGUAGE=>TR
MERCHANT=>OPU_TEST
ORDER_DATE=>2015-12-17 08:07:32
ORDER_PCODE[0]=>T234435
ORDER_PINFO[0]=>Ürün bilgisi 1
ORDER_PNAME[0]=>Ürün1
ORDER_PRICE[0]=>20
ORDER_QTY[0]=>1
ORDER_REF=>4030
ORDER_VAT[0]=>0
PAY_METHOD=>CCVISAMC
PRICES_CURRENCY=>TRY
SELECTED_INSTALLMENTS_NUMBER=>1
USE_LOYALTY_POINTS=>YES

Buraya kadar her şeyin tamam olduğunu düşünüyorum. Peki kısmi puan kullanımı nasıl gerçekleştirilecek ?

Öncelikle kısmi puan kullanımı özelliği tüm bankalar tarafından desteklenmiyor. Yapı Kredi Bankası, Garanti ve Akbank tarafında şuan için kısmi puan kullanımı özelliği desteklenmektedir.

PayU tarafında kısmi puan kullanım isteği göndermek için, USE_LOYALTY_POINTS parametresine ilave olarak LOYALTY_POINTS_AMOUNT parametresini de requeste dahil etmeniz gerekmektedir.

Kartınızda 10 TL puan olduğunu düşünelim. 5 TL puan ile ödensin istiyor iseniz;  LOYALTY_POINTS_AMOUNT=5 olarak göndermeniz yeterli olacaktır.

PayU Puan Kullanımı ( Loyalty Points API ) Entegrasyonu

Bildiğiniz üzere bankalar, her ne kadar isimleri farklı da olsa (Bonus,Chip Para,Paraf Puan,Para Puan vb) müşterilerine kredi kartı alışverişlerinden puan kazandırmaktadır. Buraya kadar her şey güzel. Ancak bana göre asıl mesele puan kazanabilmek değil, kazandığın bu puanları bir yerlerde bir şekilde kullanabilmektir 🙂
PayU, üye işyerlerine bu konuda da bir çözüm sunuyor. PayU’nun geliştirmiş olduğu puan sorgu apisi ile, müşterilerinizin kredi kartlarında bulunan puan miktarını sorgulayabilir ve aynı zamanda bu puanları alışverişlerinde kullanabilmelerine olanak sağlayabilirsiniz.

Bu yazımda sadece puan sorgulama kısmına ve bu işlemin nasıl yapılacağına değineceğim.

Dilerseniz şimdi bu sorgulamanın nasıl yapılacağını php programlama dili ile bir örnek ile açıklayalım.

Öncelikle, puan sorgulama işlemi için aşağıdaki url’ye istek yapacağız. Yapacağımız bu istek, HTTP(s) POST metodu ile olmalıdır.

“https://secure.payu.com.tr/api/loyalty-points/check”

Göndermemiz gereken parametreler aşağıdaki gibidir;

<?php

$apiEndPoint = ‘https://secure.payu.com.tr/api/loyalty-points/check’;

$data = array(

‘MERCHANT’ => ‘OPU_TEST’,
‘CC_NUMBER’ => ‘4355084355084358’,
‘EXP_MONTH’ => ’12’,
‘EXP_YEAR’ => ‘2018’,
‘CC_CVV’ => ‘000’,
‘CURRENCY’ => ‘TRY’,
‘DATE’ => gmdate(‘Y-m-d H:i:s’),
);
ksort($data);

$hashString = ”;

foreach ($data as $currentData) {
$hashString .= strlen(stripslashes($currentData));
$hashString .= stripslashes($currentData);
}
echo $hashString;
$data[‘HASH’] = hash_hmac(‘MD5′,$hashString,’SECRET_KEY’);

$handler = curl_init();
curl_setopt($handler, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($handler, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($handler, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($handler, CURLOPT_URL, $apiEndPoint);
curl_setopt($handler, CURLOPT_POST, true);
curl_setopt($handler, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($handler);
echo $result;

$resultInfo = curl_getinfo($handler);
$error = curl_error($handler);
curl_close($handler);

if (200 == $resultInfo[‘http_code’]) {
$resultXML = (array)simplexml_load_string($result);

if (isset($resultXML[‘STATUS’]) && ‘SUCCESS’ == $resultXML[‘STATUS’]) {
echo ‘Api call succeeded. There are ‘ . $resultXML[‘POINTS’] . ‘ points available worthing ‘ . $resultXML[‘AMOUNT’] . ‘ ‘ . $resultXML[‘CURRENCY’];
} else {
echo ‘Api call failed. <br>Result: ‘;
echo ‘<pre>’ . htmlentities($result) . ‘</pre>’;
}
} else {
echo ‘Api call failed. <br>Error: ‘;
echo ‘<pre>’;
print_r($error);
echo ‘</pre>’;
}

?>

Yukarıda paylaştığım kodları sırayla açıklayacak olursak;

  • Öncelikle requesti oluşturduk. Gerekli tüm parametreleri, kart bilgileri, merchant id ve diğer bilgileri doğru bir şekilde giriyoruz.
  • “ksort” fonksiyonu ile tüm parametreleri alfabetik olarak sıralıyoruz.
  • Hash fonksiyonuna göndermek üzere, hash string değerimizi oluşturuyoruz.
  • Hash değerini hesaplıyor ve diziye dahil ediyoruz.
  • Curl ile oluşturduğumuz requesti post ediyoruz.
  • Eğer tüm işlemleri doğru bir şekilde tamamladı iseniz, echo $result; satırında puan sorgusu ile dönen XML yanıtını almış olacaksınız.Aşağıda örnek XML yanıtını görebilirsiniz. Points elementi kartta bulunun puan miktarını, amount elementi ise, bu puanın TL karşılığını göstermektedir.

<epayment>
<status>SUCCESS</status>
<message>SUCCESS</message>
<points>88228</points>
<amount>882.28</amount>
<currency>TRY</currency>
<bank>AKBANK</bank>
<card_program_name>Axess</card_program_name>
<date>2015-10-08 08:03:05</date>
<hash>6246fc01bdc3267460d923e765cdf48f</hash>
</epayment>

Kodlarda bu aşamadan sonra yer alan kısımlar, XML parse işlemleri ile ilgili bu kısmı detaylandırmayacağım.

İlave bir bilgi olarak, bazı bankalar örneğin Akbank, puan sorgualama işlemlerinde kart sahibi bilgisini zorunlu tutmaktadır. Bu nedenle Akbank için puan sorgusu yaparken “CC_OWNER” parametresini de requeste dahil etmeniz gerekmektedir. Yukarıda paylaştığım örnek, test kartları ile yapıldığı için ben dahil etmedim.

 

 

PayU Site İçi Ödeme (Automatic Live Update-ALU) İndirim Uygulaması

Bazı durumlarda müşterinize indirim, hediye çeki gibi ilave fırsatlar sunmak isteyebilirsiniz. Bu durumda hesaplanan indirim miktarını PayU tarafına bir şekilde bildirmeniz gerekmektedir.

Alu entegrasyonunda toplam tutar ile ile ilgili bir parametre bulunmamaktadır. Api ürün tabanlı çalışmakta ve göndermiş olduğunuz her bir ürünü adet miktarınca hesaplayarak genel sepet toplamını hesaplamaktadır.

Alu entegrasyonunda indirim uygulaması, ilave bir parametre kullanılarak sağlanmaktadır. Bu parametre “DISCOUNT” parametresidir.

Aşağıda örnek bir ürün dizisini paylaşıyorum.

ORDER_PCODE[0]=50
ORDER_PCODE[1]=60
ORDER_PINFO[0]=Ürün bilgisi 1. ürün
ORDER_PINFO[1]=Ürün bilgisi 2. ürün
ORDER_PNAME[0]= Samsung Note II N7100
ORDER_PNAME[1]= Apple iPhone 5S 32 GB Uzay Grisi
ORDER_PRICE[0]=50
ORDER_PRICE[1]=50
ORDER_QTY[0]=1
ORDER_QTY[1]=1

Yukarıdaki ürün dizisine göre toplam tutar (50X1)+(50×1)=100 TL olarak hesaplanacaktır.

Şimdi bu isteğe indirim parametresini de ilave edelim. 10 TL indirim gerçekleştireceğiz.

ORDER_PCODE[0]=50
ORDER_PCODE[1]=60
ORDER_PINFO[0]=Ürün bilgisi 1. ürün
ORDER_PINFO[1]=Ürün bilgisi 2. ürün
ORDER_PNAME[0]= Samsung Note II N7100
ORDER_PNAME[1]= Apple iPhone 5S 32 GB Uzay Grisi
ORDER_PRICE[0]=50
ORDER_PRICE[1]=50
ORDER_QTY[0]=1
ORDER_QTY[1]=1
DISCOUNT=10

Yukarıdaki ürün dizisine göre toplam tutar (50X1)+(50×1)-10=90 TL olarak hesaplanacak ve PayU müşteriden 90 TL tahsil edilecektir.

PayU Ödeme Sistemi Cevap Kodları Hakkında

Bu yazımda, belki de en çok ihtiyaç duyulan bir konuya değinmeye çalışacağım.

PayU ödeme sistemi entegrasyonu ya da bir şekilde sanal pos entegrasyonu yapmaya çalışan herkesin zaman zaman çözmekte zorlandığı bazı hata kodları bulunuyor.

Bu hata neden meydana geliyor ? Acaba sistemde genel bir hata mı var ? Sorun bizde mi, müşteride mi ? gibi bir çok sorular dönüp dolaşıyor ortada.

İşte bu ve bu gibi sorulara cevap verebilmek adına, PayU sisteminde dönen cevap kodları ve bu kodların açıklamalarını aşağıdaki tabloda paylaştım. Faydalı bir yazı olduğunu tahmin ediyorum 🙂

Cevap Kodu Açıklama
GW_ERROR_GENERIC İşlem sırasında tanımlanamayan teknik bir hata meydana geldi. İşlemi tekrar deneyiniz. Bir süre beklemeniz tavsiye olunur.
GW_ERROR_GENERIC_3D 3D doğrulama sırasında bir hata meydana geldi. Bir süre sonra tekrar deneyiniz. Sorun devam ederse, kartın 3D kullanımına uygun olduğunu bankadan teyit ediniz.
GWERROR_-9 Kartın son kullanma tarihi hatalı girilmiştir.
GWERROR_-3 Bilinmeyen hata. Sanal pos bankası destek hizmetleri ile iletişime geçiniz.
GWERROR_-2 İşlem sırasında tanımlanamayan teknik bir hata meydana geldi. İşlemi tekrar deneyiniz. Bir süre beklemeniz tavsiye olunur.
GWERROR_05 Otorizasyon reddedildi. Genel red. Bu hata kart ve banka kaynaklı birçok nedenden dolayı meydana gelir. Kart sahibi bankası ile görüşmelidir.
GWERROR_08 Geçersiz tutar.
GWERROR_13 Göndermiş olduğunuz tutar hatalı ya da taksitli işlem için belirtilen alt limitin altında.
GWERROR_14 Böyle bir kart yok
GWERROR_15 Böyle bir kart sağlayan banka yok.
GWERROR_19 İşlemi tekrar deneyiniz.
GWERROR_34 Kredi kartı numarası fraud kontrolünü geçemedi.
GWERROR_41 Kayıp kart
GWERROR_43 Çalıntı kart
GWERROR_51 Limit yetersiz. Kartın bu işlem için yeterli limiti yok.
GWERROR_54 Süresi dolmuş kart. Kartın son kullanma tarihi geçmiş.
GWERROR_57 Kartın bu işlem için yetkisi yok. Kart sahibi bankası ile görüşerek, işlem yetkilerini kontrol ettirmelidir.
GWERROR_58 Sanal pos kullanan üye işyerinin bu işlem için izni yok. Destek hattı ile iletişime geçmeniz gerekmektedir.
GWERROR_61 Miktar sınırı aşıyor. Kart için belirlenen günlük işlem limiti ya da iptal limiti aşılıyor olabilir. Banka destek ekibi ile iletişime geçiniz.
GWERROR_62 Sınırlı kart. İlgili kart banka tarafından sınırlandırılmış. Örneğin sadece yurtiçi işlemlerde kullanılabilmesi gibi.
GWERROR_65 Miktar sınırı aşıyor. Günlük limitlerinizi kontrol ettiriniz.
GWERROR_75 İzin verilen pin girme sayısı aşıldı. Destek ekibi ile iletişime geçiniz.
GWERROR_82 İssuer (kart sağlayan) banka cevap vermiyor. İşlemi tekrar deneyiniz.
GWERROR_84 Geçersiz cvv numarası
GWERROR_91 Bir teknik sorun oluştu. Issuer işlem yapamıyor. İşlemi tekrar deneyiniz.
GWERROR_96 Sistem arızası. Banka tarafında teknik bir sıkıntı meydana geldi. Bir süre sonra tekrar işlem deneyebilirsiniz.
GWERROR_105 3D kimlik doğrulama başarısız oldu. İşlem yaptığınız kartın 3D doğrulama için kayıt edilmiş olduğundan emin olunuz.
GWERROR_2204 Kartın taksitli işlem izni yok.
GWERROR_2304 Devam eden bir işlem var.
GWERROR_5007 Banka kartları sadece 3D işlem destekler.
ALREADY_AUTHORIZED İşlemi tekrar deneyiniz.
NEW_ERROR Mesaj akış hatası. Sistemde tanımlanmayan yeni bir hata mesajı alındı. Destek ekibi ile iletişime geçiniz.
WRONG_ERROR İşlemi tekrar deneyin.
-9999 Yasaklı işlem. Göndermiş olduğunuz alanlardan biri ya da birkaçı sistemde yasaklanmıştır. Sabit bir bilgi gönderiyor iseniz, lütfen güncelleyiniz.
1 Sanal pos bankası destek hattını arayınız.
HASH_MISTMATCH Hash uyuşmazlığı. Bu hata entegrasyonla ilgili ciddi bir hatadır. Yazılımcınızla görüşmeniz gerekmektedir.
INVALID_CUSTOMER_INFO Geçersiz müşteri bilgisi. Zorunlu bilgilerden bazıları (isim, soyisim, e-posta) gibi eksik ya da geçersiz gönderilmektedir. Alanları kontrol ediniz.
INVALID_PAYMENT_INFO Geçersiz kart bilgileri. Girmiş olduğunuz kart bilgilerini kontrol ediniz.
INVALID_ACCOUNT Merchant ID (İşyeri entegrasyon ismi) hatalı ya da eksik gönderilmektedir. Kontol ediniz.
INVALID_PAYMENT_METHOD_CODE Geçersiz ödeme metodu. “PAYMETHOD” parametresini kontrol ediniz.
INVALID_CURRENCY Geçersiz para birimi ya da işlem yapmak istediğiniz para birimi hesabınız için aktif edilmemiş.
REQUEST_EXPIRED Sipariş tarihi (ORDER_DATE) parametresi hatalı gönderilmektedir. Bu parametre UTC standartına göre gönderilmiş olmalıdır.
ORDER_TIMEOUT Sipariş zaman aşımına uğradı. Tekrar deneyiniz.
WRONG_VERSION Geçersiz alu versiyonu
INVALID_CC_TOKEN Geçersiz token bilgisi. Token numarası doğru değil ya da bu token aktif değil.
AUTHORIZATION_FAILED Otorizasyon reddedildi.
ALREADY_AUTHORIZED Bu işlemde otorizasyon yapılmış. Aynı ORDER_REF ve aynı Hash ile işlem gönderildi. Mükerrer işlem.
3DS_ENROLLED İşlemin tamamlanabilmesi için 3D doğrulaması yapılması gerekmektedir.
AUTHORIZED Otorizasyon başarılı.

PayU Marketplace Entegrasyonu

BDDK tarafından yapılan düzenlemeye göre; Pazaryeri modelinde hizmet veren web siteleri, “ödeme kuruluşu” lisansına sahip olmadan üzerinde fon bulunduramamaktadır.

PayU’ nun hizmete sunmuş olduğu pazaryeri modelinde ilgili fonlar BDDK denetiminde lisanslı ödeme kuruluşu PayU hesabına aktarılır ve PayU bu fonları yönetmeliklere uygun olarak ilgili muhataplar arasında paylaştırır.

Bu yazımda PayU kullanıcılarının teknik anlamda bu servisi nasıl entegre edeceklerini izah etmeye çalışacağım.

Öncelikle yapıyı izah etmeye çalışalım. Aşağıdaki görseli birlikte inceleyelim.

marletplace

Yukarıdaki görselde; marketplace ve buna bağlı 3 adet submerchant (alt iş yeri) görünmektedir. Kullanıcı PayU ödeme altyapısını kullanan marketplace üzerinden bir alışveriş yapmakta ve bu para PayU hesaplarına geçmektedir. PayU ilgili siparişi ayrıştırarak submerchant hanesine yazmaktadır.

Entegrasyonun uygulama aşamasına gelecek olursak, aslında çok da fazla bir işlem yapmamıza gerek yok. Standart  olarak kullanmış olduğumuz alu entegrasyonu için bir parametre ilave edeceğiz. Bu parametre; “ORDER_MPLACE_MERCHANT[]”.

Alu entegrasyonunu henüz yapmadı iseniz, buradan entegrasyon dokümanına ulaşabilirsiniz.

Yukarıdaki parametre submerchanta ait merchant id bilgisini taşımaktadır. Göndermiş olduğunuz isteğe  bu parametreyi ilave ettiğinizde PayU sistemi siparişin hangi alt işyerine ait olduğunu anlayacak ve siparişi o işyerine yazacaktır.

Yukarıdaki görselde; örneğin ikinci submerchant için ORDER_MPLACE_MERCHANT[0]: MPSMTWOC şeklinde gönderdiğimizi düşünelim. O halde bu sipariş ikinci submerchanta aittir.

Örnek olması açısından, aşağıda tam bir alu isteğini paylaşıyorum.
Array
(
[BACK_REF] =>
[BILL_ADDRESS] => Billing address
[BILL_ADDRESS2] => Billing address
[BILL_CITY] => City
[BILL_COUNTRYCODE] => TR
[BILL_EMAIL] => deneme@payu.com.tr
[BILL_FAX] => 4543958674234
[BILL_FNAME] => Serkan
[BILL_LNAME] => Yıldırım
[BILL_PHONE] => 34245353
[BILL_STATE] => State / Dept.
[BILL_ZIPCODE] => 12345234
[CC_CVV] => 000
[CC_NUMBER] => 5571135571135575
[CC_OWNER] => TEST
[CC_TYPE] => VISA
[CLIENT_IP] => 91.220.167.100
[DELIVERY_ADDRESS] => Delivery Address
[DELIVERY_ADDRESS2] => Delivery Address
[DELIVERY_CITY] => City
[DELIVERY_COMPANY] => Company Name
[DELIVERY_COUNTRYCODE] => TR
[DELIVERY_EMAIL] => deneme@payu.com.tr
[DELIVERY_FNAME] => Serkan
[DELIVERY_LNAME] => Yıldırım
[DELIVERY_PHONE] => 454395867
[DELIVERY_STATE] => State / Dept.
[DELIVERY_ZIPCODE] => 12345
[EXP_MONTH] => 12
[EXP_YEAR] => 2018
[LANGUAGE] => TR
[MERCHANT] => MRKTPLCE
[ORDER_DATE] => 2015-07-30 07:06:43
[ORDER_MPLACE_MERCHANT[0]] => MPSMTWOC
[ORDER_PCODE[0]] => T234435
[ORDER_PINFO[0]] => Ürün bilgisi 1
[ORDER_PNAME[0]] => Ürün1
[ORDER_PRICE[0]] => 10
[ORDER_QTY[0]] => 1
[ORDER_REF] => 30747
[ORDER_VAT[0]] => 0
[PAY_METHOD] => CCVISAMC
[PRICES_CURRENCY] => TRY
[ORDER_HASH] => 3288e6c5a48e37d8806a5c5fc0bc99bd
)

PayU 3D Secure Entegrasyonu Nasıl Yapılır ?

3d entegrasyonun nasıl yapılacağı konusuna girmeden önce, 3d secure’nin çalışma mantığından bahsetmek istiyorum.

3d secure kart sahibi, ilgili satıcı firma ve banka üçlüsünde temel olarak kart hamilinin kimliğini doğrulamaya yönelik yapılan bir uygulama. Normal süreçten farklı olarak, ödeme işlemi sırasında kart hamili 3d secure şifre doğrulama ekranına yönlendirilir ve bu ekranda, cep telefonuna anlık olarak gönderilen şifre ve/veya CVC2 numarasını girerek işlemi sonuçlandırır. Bu şekilde işlemin kart hamilinin bilgisi dahilinde yapılmış olduğu doğrulanır.

3d ile ilgili teorik kısmı geçtikten sonra, dilerseniz PayU sisteminde 3d entegrasyonunun nasıl yapılacağına değinelim;

Öncelikle, PayU tarafında 3d secure kullanabilmeniz için, hesabınızın 3d secure olarak aktif edilmesi ya da banka kartı (debit kart) ile işlem deniyor olmanız gerekmektedir.

Gerekli aktivasyonlar yapılmış ise;  PayU sistemi size aşağıdaki gibi bir response bilgisi dönecektir. Bu response yanıtı içinde geçen, özellikle aşağıdaki, <return_code> ve <url_3ds> parametrelerine dikkat ediniz .

<return_code> “3DS_ENROLLED” olarak dönmüş ise, işleminiz 3d olarak gerçekleşecek demektir. Bu noktada en çok yapılan hatalardan biri, bazı yazılımcılar <status> parametresini kontrol ediyor ve SUCCESS cevabını gördükleri için işlemi onaylandı olarak kabul etmektedir. Bu uygulama kesinlikle yanlıştır. Mutlaka <return_code> parametresi de kontrol edilmelidir.

Peki <return_code> “3DS_ENROLLED” olarak dönmüş ise ne yapmamız gerekir ?

Burada yapmamız gereken kullanıcıyı redirection yapmak. Bu işlem için <url_3ds> parametresi ile gönderilen url adresini kullanacağız. Kullanıcıyı belirtilen bu urlye gönderdiğimizde 3d doğrulama ekranına ulaşacaktır.

3D Secure Response Örneği:

<?xml version=”1.0″?>
<epayment>
<refno>123456789</refno>
<alias>9592b7736c9e277fea8cc79c2e5b5a23</alias>
<status>SUCCESS</status>
<return_code>3DS_ENROLLED</return_code>
<return_message>3DS Enrolled Card.</return_message>
<date>2010-12-09 20:44:37</date>
<url_3ds>https://secure.payu.com.tr/order/alu_return_3ds.php?request_id=2Xrl85eakbSBr3WtcbixYQ%3D%3D</url_3ds>
<hash>623a8c7e88ccc9b9d4ed3bcd1271e5d5</hash>
</epayment>

Normal Non Secure İşlem Response Örneği:

<?xml version=”1.0″?>
<epayment>
<refno>123456789</refno>
<alias>9592b7736c9e277fea8cc79c2e5b5a23</alias>
<status>SUCCESS</status>
<return_code>AUTHORIZED</return_code>
<return_message>Successfull authorized</return_message>
<date>2012-11-06 20:52:20</date>
<hash>b560a38e2b3e7bcbac328bbd6218bc60</hash>
</epayment>

İşlemin Başarılı Olduğunu Nasıl Doğrularım ?

Kullanıcı 3d doğrulama ekranına başarılı olarak ulaşmış ve doğrulamayı tamamlamış ise, PayU sistemi önceden belirtmiş olduğunuz “BACK_REF” url adresine REFNO, ALIAS, STATUS, RETURN_CODE, RETURN_MESSAGE ve DATE parametrelerini de içeren bir cevap dönecektir.  Almış olduğunuz bu response cevabına göre siparişi onaylayabilir ya da hatalı olarak işleyebilirsiniz.

 

 

IPN Debug Nasıl Yapılır ?

Bazı durumlarda, PayU kullanıcı panelinize girdiğinizde IPN hatası şeklinde bir bildirim görürsünüz. Bu bildirim, sisteminize gelen IPN bildirimlerinin geçerli yanıt alamadığını kısacası IPN servisinin sağlıklı çalışmadığını göstermektedir.

Bu yazımda, IPN debug işleminin nasıl yapılacağına değinmeye çalışacağım. Debug işlemi ile PayU sisteminden bize gönderilen tüm parametreleri ve aynı zamanda bizim dönmüş olduğumuz cevabı görebileceğiz.

Aşağıdaki adımları takip edelim;

1. Öncelikle PayU kullanıcı panelimize giriyoruz. Ardından açılan ekranda IPN hatası alan işlemin referans numarasına tıklıyoruz.

IPN-debug1

2. Açılan ekrandan, “Bildirimi Tekrar Gönder” bağlantısına tıklıyoruz. Yandaki sayı, bildirimin kaç kere gönderilmiş olduğunu gösterir. Bu sayının üzerine tıklayarak, bildirimlerin başarı durumlarını görebilirsiniz.

 

IPN-debug2

3. Açılan ekrandan “IPN hata ayıklaması” kutucuğunu işaretliyoruz.

IPN-debug3

4. Son adım. Bu adımda IPN debug içeriği görüntülenmiş oluyor. PayU’dan bize gelen parametreleri ve aynı zamanda dönmüş olduğumuz yanıtı kontrol edebiliriz.

IPN-debug4

Örnek bir debug içeriği aşağıdaki gibidir. Response satırını kontrol ederseniz, başarılı bir bildirim olduğunu görebilirsiniz.

<EPAYMENT>2015072484530|9b2f686d85fc3d0d80a08410cf7c043d</EPAYMENT>


 

=== DEBUG INFORMATION: ===
Resending notification #3586222

=== REQUEST PARAMETERS ===
SALEDATE: 2015-07-21 15:29:38
PAYMENTDATE: 2015-07-21 15:31:06
REFNO: 7187014
REFNOEXT: 86842
ORDERNO: 178
ORDERSTATUS: COMPLETE
PAYMETHOD: CreditCard
PAYMETHOD_CODE: CCVISAMC
FIRSTNAME: Serkan
LASTNAME: Yıldırım
IDENTITY_NO: –
IDENTITY_ISSUER:
CARD_TYPE: Visa
IDENTITY_CNP:
COMPANY:
REGISTRATIONNUMBER:
FISCALCODE:
CBANKNAME:
CBANKACCOUNT:
ADDRESS1: Billing address
ADDRESS2: Billing address
CITY: City
STATE: State / Dept.
ZIPCODE: 12345234
COUNTRY: Turkey
COUNTRY_CODE: tr
PHONE: –
FAX: 4543958674234
CUSTOMEREMAIL: deneme@payu.com.tr
FIRSTNAME_D: Ömer
LASTNAME_D: Akkentli
COMPANY_D: Company Name
ADDRESS1_D: Delivery Address
ADDRESS2_D: Delivery Address
CITY_D: City
STATE_D: State / Dept.
ZIPCODE_D: 12345
COUNTRY_D: Turkey
COUNTRY_D_CODE: tr
PHONE_D: 454395867
EMAIL_D: deneme@payu.com.tr
IPADDRESS: 127.0.0.1
IPCOUNTRY:
COMPLETE_DATE: 2015-07-21 15:32:59
CURRENCY: TRY
LANGUAGE: tr
IPN_PID[]: 9474043
IPN_PNAME[]: Ürün1
IPN_PCODE[]: T234435
IPN_INFO[]: Ürün bilgisi 1
IPN_QTY[]: 1
IPN_PRICE[]: 0.01
IPN_VAT[]: 0.00
IPN_VER[]:
IPN_DISCOUNT[]: 0.00
IPN_PROMONAME[]:
IPN_PROMOCODE[]:
IPN_ORDER_COSTS[]: 0
IPN_DELIVEREDCODES[]:
IPN_DOWNLOAD_LINK:
IPN_TOTAL[]: 0.01
IPN_TOTALGENERAL: 0.01
IPN_SHIPPING: 0.00
IPN_COMMISSION: 0.00
IPN_DATE: 20150724084508
IPN_PAID_AMOUNT: 0.01
IPN_INSTALLMENTS_PROGRAM: Axess
IPN_INSTALLMENTS_NUMBER: One time payment
IPN_INSTALLMENTS_PROFIT: 0.00
AUTH_CODE: 968645
BANK_MERCHANT_ID: 100100000
BANK_RRN: 520215374123
CARD_BIN: 435508
CARD_HOLDER_NAME:
CARD_MASK: 4355-xxxx-xxxx-4358
ISSUING_BANK: AKBA
NUMBER_OF_INSTALLMENTS: 0
TERMINAL_BANK: AKBA
USED_LOYALTY_POINTS: 0
HASH: 865c0fa20e1e8e67c3ee19a55cec6346
=== RESPONSE HEADERS ===
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 24 Jul 2015 05:45:31 GMT
Content-Type: text/html
Content-Length: 79
Connection: keep-alive
X-Powered-By: PHP/5.3.13
Cache-Control: max-age=0
Expires: Fri, 24 Jul 2015 05:45:30 GMT
Pragma: no-cache
Cache-Control: no-cache

=== RESPONSE BODY ===
<EPAYMENT>2015072484530|9b2f686d85fc3d0d80a08410cf7c043d</EPAYMENT>
=== HASH STRING===
192015-07-21 15:29:38192015-07-21 15:31:067718701458684231788COMPLETE10CreditCard8CCVISAMC6Serkan11Yıldırım1-04Visa00000015Billing address15Billing address4City13State / Dept.8123452346Turkey2tr1-13454395867423427deneme@payu.com.tr5Ömer8Akkentli12Company Name16Delivery Address16Delivery Address4City13State / Dept.5123456Turkey2tr945439586727deneme@payu.com.tr9127.0.0.10192015-07-21 15:32:593TRY2tr794740437Ürün17T23443516Ürün bilgisi 11140.0140.00040.0000100040.0140.0140.0040.00142015072408450840.015Axess16One time payment40.00696864591001000001252021537412364355080194355-xxxx-xxxx-43584AKBA104AKBA10

Php’de IPN Entegrasyonu Uygulama

IPN servisi nedir ? neden gereklidir ? gibi sorulara, önceki yazılarımda yanıt vermeye çalıştım. Bu yazımda ise, Php de IPN kurulumunun nasıl yapılacağına değineceğim.

Kuruluma başlamadan önce, ilk olarak PayU destek ekibi ile iletişime geçerek, php dili için yazılmış örnek IPN servisi kodlarını talep ediniz. Farklı bir programlama dili ile çalışıyor iseniz, örneğin .net kullanıyorsanız, .net için geliştirilen kodları talep edebilirsiniz. Ben bu yazımda php dili ile yapılan uygulamayı paylaşacağım.

Destek ekibi tarafından gönderilen aşağıdaki kodları, web sunucunuzda ilgili yere upload ediniz.

Örneğin;  http://www.webadresim.com/ipn.php  gibi.

Sonraki adımda ilk olarak, aşağıdaki satıra güncel secret key bilginizi giriniz. Secret key doğru olarak girilmez ise, hash yanlış hesaplanacağı için, IPN bildirimi başarısız olacaktır.

$pass		= "AABBCCDDEEFF";

Gelelim diğer önemli kısıma;

PayU sistemi, IPN bildirimini başarılı olarak aldığınızı doğrulamak için, sizden bir yanıt beklemektedir. Bu yanıtın formatı aşağıdaki gibidir.

<EPAYMENT>TARİH|HASH</EPAYMENT>
<EPAYMENT>”.$date_return.”|”.$result_hash.”</EPAYMENT>

Burada, gerekli olan hash değerini aşağıdaki parametrelerle oluşturuyoruz.

IPN_PID[0]
IPN_PNAME[0]
IPN_DATE
DATE

$return = strlen($_POST["IPN_PID"][0]).$_POST["IPN_PID"][0].strlen($_POST["IPN_PNAME"][0]).$_POST["IPN_PNAME"][0];
$return .= strlen($_POST["IPN_DATE"]).$_POST["IPN_DATE"].strlen($date_return).$date_return;
Parametre adı Uzunluk Değer
IPN_PID[0] 1 1
IPN_PNAME[0] 16 Software program
IPN_DATE 14 20050303123434
DATE 14 20050303123434

Yukarıdaki örnek parametrelerle oluşturulan hash string değeri aşağıdaki gibi olmaktadır.

1116Software program14200503031234341420050303123434

Hesaplanan hash değeri:

9449ef06f16a0862950008691194d30f

Şimdi yanıtımızı oluşturalım:

<EPAYMENT>20050303123434|9449ef06f16a0862950008691194d30f</EPAYMENT>

[php]
<?php /* Make sure strlen behaves as intended by setting multibyte function overload to 0*/ ini_set(“mbstring.func_overload”, 0); if(ini_get(“mbstring.func_overload”) > 2)
{ /* check if mbstring.func_overload is still set to overload strings(2)*/
echo “WARNING: mbstring.func_overload is set to overload strings and might cause problems\n”;
}

/* Internet Payment Notification */

$pass = “AABBCCDDEEFF”; /* SECRET KEY */
$result = “”; /* string for compute HASH for received data */
$return = “”; /* string to compute HASH for return result */
$signature = $_POST[“HASH”]; /* HASH received */
$body = “”;

/* read info received */
ob_start();
while(list($key, $val) = each($_POST)){
$$key=$val;

/* get values */
if($key != “HASH”){

if(is_array($val)) $result .= ArrayExpand($val);
else{
$size = strlen(StripSlashes($val));
$result .= $size.StripSlashes($val);
}

}

}
$body = ob_get_contents();
ob_end_flush();

$date_return = date(“YmdGis”);

$return = strlen($_POST[“IPN_PID”][0]).$_POST[“IPN_PID”][0].strlen($_POST[“IPN_PNAME”][0]).$_POST[“IPN_PNAME”][0];
$return .= strlen($_POST[“IPN_DATE”]).$_POST[“IPN_DATE”].strlen($date_return).$date_return;

function ArrayExpand($array){
$retval = “”;
for($i = 0; $i < sizeof($array); $i++){ $size = strlen(StripSlashes($array[$i])); $retval .= $size.StripSlashes($array[$i]); } return $retval; } function hmac ($key, $data){ $b = 64; // byte length for md5 if (strlen($key) > $b) {
$key = pack(“H*”,md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad(”, $b, chr(0x36));
$opad = str_pad(”, $b, chr(0x5c));
$k_ipad = $key ^ $ipad ;
$k_opad = $key ^ $opad;
return md5($k_opad . pack(“H*”,md5($k_ipad . $data)));
}

$hash = hmac($pass, $result); /* HASH for data received */

$body .= $result.”\r\n\r\nHash: “.$hash.”\r\n\r\nSignature: “.$signature.”\r\n\r\nReturnSTR: “.$return;

if($hash == $signature){
echo “Verified OK!”;

/* Burada Yanıt dönüyoruz */
$result_hash = hmac($pass, $return);
echo “<EPAYMENT>”.$date_return.”|”.$result_hash.”</EPAYMENT>”;

/* Bu kısımda kendi kodlarımızı yazacağız. Örneğin bildirimi başarılı olarak aldıktan sonra siparişi güncellemek için update komutlarımızı yazabiliriz.*/

}else{
/* geçersiz ipn bildirimi durumunda e-posta gönderilir. */
mail(“webmaster@gecad.ro”,”BAD IPN Signature”, $body,””);
}
?>
[/php]

Next Posts